From df0b6503d601c2150e3242b66f02fe906f838979 Mon Sep 17 00:00:00 2001 From: Bruno Cardoso Lopes Date: Mon, 27 Jul 2009 19:32:57 +0000 Subject: [PATCH] add module identifier to the elf object file git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77238 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/ELF.h | 22 +++++++++++++++++----- lib/CodeGen/ELFWriter.cpp | 11 ++++++++--- lib/CodeGen/ELFWriter.h | 2 +- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/CodeGen/ELF.h b/lib/CodeGen/ELF.h index cd0c68a7a2e..48e0946b0a4 100644 --- a/lib/CodeGen/ELF.h +++ b/lib/CodeGen/ELF.h @@ -59,10 +59,10 @@ namespace llvm { // ELF symbols are related to llvm ones by being one of the two llvm // types, for the other ones (section, file, func) a null pointer is - // assumed. + // assumed by default. union { const GlobalValue *GV; // If this is a pointer to a GV - const char *Ext; // If this is a pointer to a named symbol + const char *Ext; // If this is a pointer to a named symbol } Source; // Describes from which source type this ELF symbol comes from, @@ -118,9 +118,20 @@ namespace llvm { // getSectionSym - Returns a elf symbol to represent an elf section static ELFSym *getSectionSym() { ELFSym *Sym = new ELFSym(); - Sym->setBind(ELFSym::STB_LOCAL); - Sym->setType(ELFSym::STT_SECTION); - Sym->setVisibility(ELFSym::STV_DEFAULT); + Sym->setBind(STB_LOCAL); + Sym->setType(STT_SECTION); + Sym->setVisibility(STV_DEFAULT); + Sym->SourceType = isOther; + return Sym; + } + + // getSectionSym - Returns a elf symbol to represent an elf section + static ELFSym *getFileSym() { + ELFSym *Sym = new ELFSym(); + Sym->setBind(STB_LOCAL); + Sym->setType(STT_FILE); + Sym->setVisibility(STV_DEFAULT); + Sym->SectionIdx = 0xfff1; // ELFSection::SHN_ABS; Sym->SourceType = isOther; return Sym; } @@ -164,6 +175,7 @@ namespace llvm { unsigned getBind() const { return (Info >> 4) & 0xf; } unsigned getType() const { return Info & 0xf; } bool isLocalBind() const { return getBind() == STB_LOCAL; } + bool isFileType() const { return getType() == STT_FILE; } void setBind(unsigned X) { assert(X == (X & 0xF) && "Bind value out of range!"); diff --git a/lib/CodeGen/ELFWriter.cpp b/lib/CodeGen/ELFWriter.cpp index f2a9bf34e58..2679d983f44 100644 --- a/lib/CodeGen/ELFWriter.cpp +++ b/lib/CodeGen/ELFWriter.cpp @@ -514,6 +514,9 @@ bool ELFWriter::doFinalization(Module &M) { if (TAI->getNonexecutableStackDirective()) getNonExecStackSection(); + // Emit module name + SymbolList.push_back(ELFSym::getFileSym()); + // Emit a symbol for each section created until now, skip null section for (unsigned i = 1, e = SectionList.size(); i < e; ++i) { ELFSection &ES = *SectionList[i]; @@ -524,7 +527,7 @@ bool ELFWriter::doFinalization(Module &M) { } // Emit string table - EmitStringTable(); + EmitStringTable(M.getModuleIdentifier()); // Emit the symbol table now, if non-empty. EmitSymbolTable(); @@ -709,7 +712,7 @@ void ELFWriter::EmitSectionHeader(BinaryObject &SHdrTab, /// EmitStringTable - If the current symbol table is non-empty, emit the string /// table for it -void ELFWriter::EmitStringTable() { +void ELFWriter::EmitStringTable(const std::string &ModuleName) { if (!SymbolList.size()) return; // Empty symbol table. ELFSection &StrTab = getStringTableSection(); @@ -721,12 +724,14 @@ void ELFWriter::EmitStringTable() { for (ELFSymIter I=SymbolList.begin(), E=SymbolList.end(); I != E; ++I) { ELFSym &Sym = *(*I); - // Use the name mangler to uniquify the LLVM symbol. std::string Name; if (Sym.isGlobalValue()) + // Use the name mangler to uniquify the LLVM symbol. Name.append(Mang->getMangledName(Sym.getGlobalValue())); else if (Sym.isExternalSym()) Name.append(Sym.getExternalSymbol()); + else if (Sym.isFileType()) + Name.append(ModuleName); if (Name.empty()) { Sym.NameIdx = 0; diff --git a/lib/CodeGen/ELFWriter.h b/lib/CodeGen/ELFWriter.h index 021fbeb5d59..b8bfa7d2a0f 100644 --- a/lib/CodeGen/ELFWriter.h +++ b/lib/CodeGen/ELFWriter.h @@ -250,7 +250,7 @@ namespace llvm { void EmitSectionTableStringTable(); void EmitSymbol(BinaryObject &SymbolTable, ELFSym &Sym); void EmitSymbolTable(); - void EmitStringTable(); + void EmitStringTable(const std::string &ModuleName); void OutputSectionsAndSectionTable(); void RelocateField(BinaryObject &BO, uint32_t Offset, int64_t Value, unsigned Size); -- 2.34.1