[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