From 5d0d01d99facf79f00c5e16ba75d363c3b87d5c4 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Fri, 14 Apr 2017 02:55:06 +0000 Subject: [PATCH] Object, LTO: Add target triple to irsymtab and LTO API. Start using it in LLD to avoid needing to read bitcode again just to get the target triple, and in llvm-lto2 to avoid printing symbol table information that is inappropriate for the target. Differential Revision: https://reviews.llvm.org/D32038 llvm-svn: 300300 --- include/llvm/LTO/LTO.h | 5 ++++- include/llvm/Object/IRSymtab.h | 4 +++- lib/LTO/LTO.cpp | 1 + lib/Object/IRSymtab.cpp | 1 + test/LTO/Resolution/X86/symtab-elf.ll | 15 +++++++++++++++ test/LTO/Resolution/X86/symtab.ll | 3 ++- tools/llvm-lto2/llvm-lto2.cpp | 9 +++++++-- 7 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 test/LTO/Resolution/X86/symtab-elf.ll diff --git a/include/llvm/LTO/LTO.h b/include/llvm/LTO/LTO.h index 8c083947b84..3772592757b 100644 --- a/include/llvm/LTO/LTO.h +++ b/include/llvm/LTO/LTO.h @@ -97,7 +97,7 @@ private: // [begin, end) for each module std::vector> ModuleSymIndices; - StringRef SourceFileName, COFFLinkerOpts; + StringRef TargetTriple, SourceFileName, COFFLinkerOpts; std::vector ComdatTable; public: @@ -138,6 +138,9 @@ public: /// Returns the path to the InputFile. StringRef getName() const; + /// Returns the input file's target triple. + StringRef getTargetTriple() const { return TargetTriple; } + /// Returns the source file path specified at compile time. StringRef getSourceFileName() const { return SourceFileName; } diff --git a/include/llvm/Object/IRSymtab.h b/include/llvm/Object/IRSymtab.h index 98ef3ffcc97..cde6f3b0f65 100644 --- a/include/llvm/Object/IRSymtab.h +++ b/include/llvm/Object/IRSymtab.h @@ -116,7 +116,7 @@ struct Header { Range Symbols; Range Uncommons; - Str SourceFileName; + Str TargetTriple, SourceFileName; /// COFF-specific: linker directives. Str COFFLinkerOpts; @@ -227,6 +227,8 @@ public: /// copied into an irsymtab::Symbol object. symbol_range module_symbols(unsigned I) const; + StringRef getTargetTriple() const { return str(header().TargetTriple); } + /// Returns the source file path specified at compile time. StringRef getSourceFileName() const { return str(header().SourceFileName); } diff --git a/lib/LTO/LTO.cpp b/lib/LTO/LTO.cpp index e6fc8cc8853..9782c898bf5 100644 --- a/lib/LTO/LTO.cpp +++ b/lib/LTO/LTO.cpp @@ -351,6 +351,7 @@ Expected> InputFile::create(MemoryBufferRef Object) { irsymtab::Reader R({Symtab.data(), Symtab.size()}, {File->Strtab.data(), File->Strtab.size()}); + File->TargetTriple = R.getTargetTriple(); File->SourceFileName = R.getSourceFileName(); File->COFFLinkerOpts = R.getCOFFLinkerOpts(); File->ComdatTable = R.getComdatTable(); diff --git a/lib/Object/IRSymtab.cpp b/lib/Object/IRSymtab.cpp index f78b84b388a..da1ef9946b5 100644 --- a/lib/Object/IRSymtab.cpp +++ b/lib/Object/IRSymtab.cpp @@ -190,6 +190,7 @@ Error Builder::build(ArrayRef IRMods) { storage::Header Hdr; assert(!IRMods.empty()); + setStr(Hdr.TargetTriple, IRMods[0]->getTargetTriple()); setStr(Hdr.SourceFileName, IRMods[0]->getSourceFileName()); TT = Triple(IRMods[0]->getTargetTriple()); diff --git a/test/LTO/Resolution/X86/symtab-elf.ll b/test/LTO/Resolution/X86/symtab-elf.ll new file mode 100644 index 00000000000..1683b061c6d --- /dev/null +++ b/test/LTO/Resolution/X86/symtab-elf.ll @@ -0,0 +1,15 @@ +; RUN: llvm-as -o %t %s +; RUN: llvm-lto2 dump-symtab %t | FileCheck %s + +; CHECK: target triple: x86_64-unknown-linux-gnu +target triple = "x86_64-unknown-linux-gnu" +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +; CHECK-NOT: linker opts: +!0 = !{i32 6, !"Linker Options", !{!{!"/include:foo"}}} +!llvm.module.flags = !{ !0 } + +@g1 = global i32 0 + +; CHECK-NOT: fallback g1 +@g2 = weak alias i32, i32* @g1 diff --git a/test/LTO/Resolution/X86/symtab.ll b/test/LTO/Resolution/X86/symtab.ll index e2729ac918a..b7bc1174901 100644 --- a/test/LTO/Resolution/X86/symtab.ll +++ b/test/LTO/Resolution/X86/symtab.ll @@ -1,13 +1,14 @@ ; RUN: llvm-as -o %t %s ; RUN: llvm-lto2 dump-symtab %t | FileCheck %s +; CHECK: target triple: i686-pc-windows-msvc18.0.0 target triple = "i686-pc-windows-msvc18.0.0" target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" ; CHECK: source filename: src.c source_filename = "src.c" -; CHECK: linker opts (COFF only): /include:foo +; CHECK: linker opts: /include:foo !0 = !{i32 6, !"Linker Options", !{!{!"/include:foo"}}} !llvm.module.flags = !{ !0 } diff --git a/tools/llvm-lto2/llvm-lto2.cpp b/tools/llvm-lto2/llvm-lto2.cpp index 7a8d4055338..3d2643db85b 100644 --- a/tools/llvm-lto2/llvm-lto2.cpp +++ b/tools/llvm-lto2/llvm-lto2.cpp @@ -293,8 +293,13 @@ static int dumpSymtab(int argc, char **argv) { std::unique_ptr Input = check(InputFile::create(MB->getMemBufferRef()), F); + outs() << "target triple: " << Input->getTargetTriple() << '\n'; + Triple TT(Input->getTargetTriple()); + outs() << "source filename: " << Input->getSourceFileName() << '\n'; - outs() << "linker opts (COFF only): " << Input->getCOFFLinkerOpts() << '\n'; + + if (TT.isOSBinFormatCOFF()) + outs() << "linker opts: " << Input->getCOFFLinkerOpts() << '\n'; std::vector ComdatTable = Input->getComdatTable(); for (const InputFile::Symbol &Sym : Input->symbols()) { @@ -328,7 +333,7 @@ static int dumpSymtab(int argc, char **argv) { if (Comdat != -1) outs() << " comdat " << ComdatTable[Comdat] << '\n'; - if (Sym.isWeak() && Sym.isIndirect()) + if (TT.isOSBinFormatCOFF() && Sym.isWeak() && Sym.isIndirect()) outs() << " fallback " << Sym.getCOFFWeakExternalFallback() << '\n'; }