[PATCH] D40849: CodeGen: support an extension to pass linker options on ELF
Saleem Abdulrasool via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 5 12:21:07 PST 2017
compnerd created this revision.
Introduce an extension to support passing linker options to the linker.
These would be ignored by older linkers, but newer linkers which
this feature would be able to process the linker. The section is
simple structure consisting of a version field, an array of strings
terminated by a null string.
struct LinkerOptions {
uint32_t Version;
const char Options[];
uint32_t Reserved;
};
Repository:
rL LLVM
https://reviews.llvm.org/D40849
Files:
lib/CodeGen/TargetLoweringObjectFileImpl.cpp
test/Feature/elf-linker-options.ll
Index: test/Feature/elf-linker-options.ll
===================================================================
--- /dev/null
+++ test/Feature/elf-linker-options.ll
@@ -0,0 +1,14 @@
+; RUN: llc -mtriple i686-unknown-linux-gnu -filetype asm -o - %s | FileCheck %s
+
+!llvm.module.flags = !{!0}
+!llvm.linker.options = !{!2, !3}
+
+!0 = !{i32 1, !"Objective-C Version", i32 2}
+!2 = !{!"spaced", !"option"}
+!3 = !{!"nospace"}
+
+; CHECK: .section ".note.linker-options","", at note
+; CHECK: .long 1
+; CHECK: .ascii " spaced option"
+; CHECK: .ascii " nospace"
+; CHECK: .byte 0
Index: lib/CodeGen/TargetLoweringObjectFileImpl.cpp
===================================================================
--- lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -93,6 +93,21 @@
void TargetLoweringObjectFileELF::emitModuleMetadata(
MCStreamer &Streamer, Module &M, const TargetMachine &TM) const {
+ if (NamedMDNode *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
+ Streamer.SwitchSection(getContext().getELFSection(".note.linker-options",
+ ELF::SHT_NOTE, 0));
+ Streamer.EmitIntValue(1, 4);
+ for (const auto &Operand : LinkerOptions->operands()) {
+ std::string Directive;
+ for (const auto &Option : cast<MDNode>(Operand)->operands()) {
+ Directive.push_back(' ');
+ Directive.append(cast<MDString>(Option)->getString());
+ }
+ Streamer.EmitBytes(Directive);
+ }
+ Streamer.EmitIntValue(0, 1);
+ }
+
unsigned Version = 0;
unsigned Flags = 0;
StringRef Section;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40849.125588.patch
Type: text/x-patch
Size: 1632 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171205/ab761006/attachment.bin>
More information about the llvm-commits
mailing list