[PATCH] [mc-coff] Forward Linker Option flags into the .drectve section
Reid Kleckner
rnk at google.com
Wed Apr 24 13:45:40 PDT 2013
Hi Bigcheese,
This is modelled on the Mach-O linker options implementation and should
support a Clang implementation of #pragma comment(lib/linker).
http://llvm-reviews.chandlerc.com/D724
Files:
include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
lib/CodeGen/TargetLoweringObjectFileImpl.cpp
test/MC/COFF/linker-options.ll
Index: include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
===================================================================
--- include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
+++ include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
@@ -128,6 +128,12 @@
virtual const MCSection *
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
Mangler *Mang, const TargetMachine &TM) const;
+
+ /// emitModuleFlags - Emit Obj-C garbage collection and linker options. Only
+ /// linker option emission is implemented for COFF.
+ virtual void emitModuleFlags(MCStreamer &Streamer,
+ ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
+ Mangler *Mang, const TargetMachine &TM) const;
};
} // end namespace llvm
Index: lib/CodeGen/TargetLoweringObjectFileImpl.cpp
===================================================================
--- lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -782,3 +782,35 @@
return getDataSection();
}
+void TargetLoweringObjectFileCOFF::
+emitModuleFlags(MCStreamer &Streamer,
+ ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
+ Mangler *Mang, const TargetMachine &TM) const {
+ MDNode *LinkerOptions = 0;
+
+ // Look for the "Linker Options" flag, since it's the only one we support.
+ for (ArrayRef<Module::ModuleFlagEntry>::iterator
+ i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) {
+ const Module::ModuleFlagEntry &MFE = *i;
+ StringRef Key = MFE.Key->getString();
+ Value *Val = MFE.Val;
+ if (Key == "Linker Options") {
+ LinkerOptions = cast<MDNode>(Val);
+ break;
+ }
+ }
+
+ // Emit the linker options if present.
+ if (LinkerOptions) {
+ const MCSection *Sec = getDrectveSection();
+ Streamer.SwitchSection(Sec);
+ for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) {
+ MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i));
+ for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) {
+ MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii));
+ Streamer.EmitBytes(" ");
+ Streamer.EmitBytes(MDOption->getString());
+ }
+ }
+ }
+}
Index: test/MC/COFF/linker-options.ll
===================================================================
--- /dev/null
+++ test/MC/COFF/linker-options.ll
@@ -0,0 +1,28 @@
+; RUN: llc -O0 -mtriple=i386-pc-win32 -filetype=obj -o - %s | llvm-readobj -s -sd | FileCheck %s
+
+!0 = metadata !{ i32 6, metadata !"Linker Options",
+ metadata !{
+ metadata !{ metadata !"/DEFAULTLIB:msvcrt.lib" },
+ metadata !{ metadata !"/DEFAULTLIB:msvcrt.lib",
+ metadata !"/DEFAULTLIB:secur32.lib" },
+ metadata !{ metadata !"/asdf" } } }
+
+!llvm.module.flags = !{ !0 }
+
+define dllexport void @foo() {
+ ret void
+}
+
+; CHECK: Name: .drectve
+; CHECK: Characteristics [ (0x100200)
+; CHECK: IMAGE_SCN_ALIGN_1BYTES (0x100000)
+; CHECK: IMAGE_SCN_LNK_INFO (0x200)
+; CHECK: ]
+; CHECK: SectionData (
+; CHECK: 0000: 202F4445 4641554C 544C4942 3A6D7376 | /DEFAULTLIB:msv|
+; CHECK: 0010: 6372742E 6C696220 2F444546 41554C54 |crt.lib /DEFAULT|
+; CHECK: 0020: 4C49423A 6D737663 72742E6C 6962202F |LIB:msvcrt.lib /|
+; CHECK: 0030: 44454641 554C544C 49423A73 65637572 |DEFAULTLIB:secur|
+; CHECK: 0040: 33322E6C 6962202F 61736466 202F4558 |32.lib /asdf /EX|
+; CHECK: 0050: 504F5254 3A5F666F 6F |PORT:_foo|
+; CHECK: )
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D724.1.patch
Type: text/x-patch
Size: 3575 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130424/be04c6ec/attachment.bin>
More information about the llvm-commits
mailing list