diff options
-rw-r--r-- | docs/LangRef.rst | 6 | ||||
-rw-r--r-- | lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 33 | ||||
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 1 | ||||
-rw-r--r-- | test/MC/MachO/linker-options.ll | 35 |
4 files changed, 65 insertions, 10 deletions
diff --git a/docs/LangRef.rst b/docs/LangRef.rst index ce0676f..49e2295 100644 --- a/docs/LangRef.rst +++ b/docs/LangRef.rst @@ -2628,10 +2628,10 @@ For example, the following metadata section specifies two separate sets of linker options, presumably to link against ``libz`` and the ``Cocoa`` framework:: - !0 = metadata !{ i32 6, "Linker Options", + !0 = metadata !{ i32 6, metadata !"Linker Options", metadata !{ - !metadata { metadata !"-lz" }, - !metadata { metadata !"-framework", metadata !"Cocoa" } } } + metadata !{ metadata !"-lz" }, + metadata !{ metadata !"-framework", metadata !"Cocoa" } } } !llvm.module.flags = !{ !0 } The metadata encoding as lists of lists of options, as opposed to a collapsed diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 76c2546..1170bf2 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -406,14 +406,14 @@ TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) { // MachO //===----------------------------------------------------------------------===// -/// emitModuleFlags - Emit the module flags that specify the garbage collection -/// information. +/// emitModuleFlags - Perform code emission for module flags. void TargetLoweringObjectFileMachO:: emitModuleFlags(MCStreamer &Streamer, ArrayRef<Module::ModuleFlagEntry> ModuleFlags, Mangler *Mang, const TargetMachine &TM) const { unsigned VersionVal = 0; unsigned ImageInfoFlags = 0; + MDNode *LinkerOptions = 0; StringRef SectionVal; for (ArrayRef<Module::ModuleFlagEntry>::iterator @@ -427,14 +427,33 @@ emitModuleFlags(MCStreamer &Streamer, StringRef Key = MFE.Key->getString(); Value *Val = MFE.Val; - if (Key == "Objective-C Image Info Version") + if (Key == "Objective-C Image Info Version") { VersionVal = cast<ConstantInt>(Val)->getZExtValue(); - else if (Key == "Objective-C Garbage Collection" || - Key == "Objective-C GC Only" || - Key == "Objective-C Is Simulated") + } else if (Key == "Objective-C Garbage Collection" || + Key == "Objective-C GC Only" || + Key == "Objective-C Is Simulated") { ImageInfoFlags |= cast<ConstantInt>(Val)->getZExtValue(); - else if (Key == "Objective-C Image Info Section") + } else if (Key == "Objective-C Image Info Section") { SectionVal = cast<MDString>(Val)->getString(); + } else if (Key == "Linker Options") { + LinkerOptions = cast<MDNode>(Val); + } + } + + // Emit the linker options if present. + if (LinkerOptions) { + for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) { + MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i)); + SmallVector<std::string, 4> StrOptions; + + // Convert to strings. + for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) { + MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii)); + StrOptions.push_back(MDOption->getString()); + } + + Streamer.EmitLinkerOptions(StrOptions); + } } // The section is mandatory. If we don't have it, then we don't have GC info. diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 88a7d33..7191947 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -383,6 +383,7 @@ void MCAsmStreamer::EmitLinkerOptions(ArrayRef<std::string> Options) { ie = Options.end(); it != ie; ++it) { OS << ", " << '"' << *it << '"'; } + OS << "\n"; } void MCAsmStreamer::EmitDataRegion(MCDataRegionType Kind) { diff --git a/test/MC/MachO/linker-options.ll b/test/MC/MachO/linker-options.ll new file mode 100644 index 0000000..f43cc28 --- /dev/null +++ b/test/MC/MachO/linker-options.ll @@ -0,0 +1,35 @@ +; RUN: llc -O0 -mtriple=x86_64-apple-darwin -o - %s > %t +; RUN: FileCheck --check-prefix=CHECK-ASM < %t %s + +; CHECK-ASM: .linker_option "-lz" +; CHECK-ASM-NEXT: .linker_option "-framework", "Cocoa" + +; RUN: llc -O0 -mtriple=x86_64-apple-darwin -filetype=obj -o - %s | macho-dump > %t +; RUN: FileCheck --check-prefix=CHECK-OBJ < %t %s + +; CHECK-OBJ: ('load_commands', [ +; CHECK-OBJ: # Load Command 1 +; CHECK-OBJ: (('command', 45) +; CHECK-OBJ: ('size', 16) +; CHECK-OBJ: ('count', 1) +; CHECK-OBJ: ('_strings', [ +; CHECK-OBJ: "-lz", +; CHECK-OBJ: ]) +; CHECK-OBJ: ), +; CHECK-OBJ: # Load Command 2 +; CHECK-OBJ: (('command', 45) +; CHECK-OBJ: ('size', 32) +; CHECK-OBJ: ('count', 2) +; CHECK-OBJ: ('_strings', [ +; CHECK-OBJ: "-framework", +; CHECK-OBJ: "Cocoa", +; CHECK-OBJ: ]) +; CHECK-OBJ: ), +; CHECK-OBJ: ]) + +!0 = metadata !{ i32 6, metadata !"Linker Options", + metadata !{ + metadata !{ metadata !"-lz" }, + metadata !{ metadata !"-framework", metadata !"Cocoa" } } } + +!llvm.module.flags = !{ !0 } |