Index: lib/CodeGen/TargetLoweringObjectFileImpl.cpp =================================================================== --- lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -93,6 +93,32 @@ 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)); + + llvm::SmallString<128> Descriptor; + llvm::raw_svector_ostream DOS(Descriptor); + for (const auto &Operand : LinkerOptions->operands()) { + std::string Directive; + for (const auto &Option : cast(Operand)->operands()) { + Directive.push_back(' '); + Directive.append(cast(Option)->getString()); + } + Directive.push_back('\0'); + DOS << Directive; + } + + Streamer.EmitIntValue(5, 4); // namesz + Streamer.EmitIntValue(Descriptor.size() + 1, 4); // descsz + Streamer.EmitIntValue(1, 4); // type + Streamer.EmitBytes("LLVM"); // name + Streamer.EmitIntValue(0, 1); + Streamer.EmitValueToAlignment(4); + Streamer.EmitBytes(DOS.str().str()); + Streamer.EmitIntValue(0, 1); + } + unsigned Version = 0; unsigned Flags = 0; StringRef Section; Index: test/Feature/elf-linker-options.ll =================================================================== --- /dev/null +++ test/Feature/elf-linker-options.ll @@ -0,0 +1,16 @@ +; RUN: llc -mtriple i686-unknown-linux-gnu -filetype asm -o - %s | FileCheck %s + +!llvm.linker.options = !{!0, !1} + +!0 = !{!"spaced", !"option"} +!1 = !{!"nospace"} + +; CHECK: .section ".note.linker-options","",@note +; CHECK: .long 5 +; CHECK: .long 25 +; CHECK: .long 1 +; CHECK: .ascii "LLVM" +; CHECK: .byte 0 +; CHECK: .p2align 2 +; CHECK: .asciz " spaced option\000 nospace" +; CHECK: .byte 0