From a51f0f8367acb79177abfb93e5b3533b490448cf Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 28 Feb 2014 02:17:23 +0000 Subject: [PATCH] Now that it is possible, use the mangler in IRObjectFile. A really simple patch marks the end of a lot of yak shaving :-) llvm-svn: 202463 --- llvm/docs/ReleaseNotes.rst | 3 +++ llvm/include/llvm/Object/IRObjectFile.h | 2 ++ llvm/lib/Object/IRObjectFile.cpp | 16 ++++++++++++++-- llvm/test/Object/mangle-ir.ll | 8 ++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 llvm/test/Object/mangle-ir.ll diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst index 42127c81f707..07d4d07069b4 100644 --- a/llvm/docs/ReleaseNotes.rst +++ b/llvm/docs/ReleaseNotes.rst @@ -52,6 +52,9 @@ Non-comprehensive list of changes in this release for assembly output as well. The integrated assembler can be disabled with the ``-no-integrated-as`` option, +* llvm-ar now handles IR files like regular object files. In particular, a + regular symbol table is created for symbols defined in IR files. + .. NOTE For small 1-3 sentence descriptions, just add an entry at the end of this list. If your description won't fit comfortably in one bullet diff --git a/llvm/include/llvm/Object/IRObjectFile.h b/llvm/include/llvm/Object/IRObjectFile.h index e1effa6745a7..e85dd6710326 100644 --- a/llvm/include/llvm/Object/IRObjectFile.h +++ b/llvm/include/llvm/Object/IRObjectFile.h @@ -17,12 +17,14 @@ #include "llvm/Object/SymbolicFile.h" namespace llvm { +class Mangler; class Module; class GlobalValue; namespace object { class IRObjectFile : public SymbolicFile { OwningPtr M; + OwningPtr Mang; public: IRObjectFile(MemoryBuffer *Object, error_code &EC, LLVMContext &Context, bool BufferOwned); diff --git a/llvm/lib/Object/IRObjectFile.cpp b/llvm/lib/Object/IRObjectFile.cpp index 37e7eb80ca54..b3a5668fc20d 100644 --- a/llvm/lib/Object/IRObjectFile.cpp +++ b/llvm/lib/Object/IRObjectFile.cpp @@ -13,6 +13,7 @@ #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Mangler.h" #include "llvm/IR/Module.h" #include "llvm/Object/IRObjectFile.h" #include "llvm/Support/raw_ostream.h" @@ -27,6 +28,13 @@ IRObjectFile::IRObjectFile(MemoryBuffer *Object, error_code &EC, return; M.reset(MOrErr.get()); + + // If we have a DataLayout, setup a mangler. + const DataLayout *DL = M->getDataLayout(); + if (!DL) + return; + + Mang.reset(new Mangler(DL)); } static const GlobalValue &getGV(DataRefImpl &Symb) { @@ -86,9 +94,13 @@ void IRObjectFile::moveSymbolNext(DataRefImpl &Symb) const { error_code IRObjectFile::printSymbolName(raw_ostream &OS, DataRefImpl Symb) const { - // FIXME: This should use the Mangler. const GlobalValue &GV = getGV(Symb); - OS << GV.getName(); + + if (Mang) + Mang->getNameWithPrefix(OS, &GV, false); + else + OS << GV.getName(); + return object_error::success; } diff --git a/llvm/test/Object/mangle-ir.ll b/llvm/test/Object/mangle-ir.ll new file mode 100644 index 000000000000..725d788a19a3 --- /dev/null +++ b/llvm/test/Object/mangle-ir.ll @@ -0,0 +1,8 @@ +; RUN: llvm-as %s -o - | llvm-nm - | FileCheck %s + +target datalayout = "m:o" + +; CHECK: T _f +define void @f() { + ret void +}