add module identifier to the elf object file
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Mon, 27 Jul 2009 19:32:57 +0000 (19:32 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Mon, 27 Jul 2009 19:32:57 +0000 (19:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77238 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/ELF.h
lib/CodeGen/ELFWriter.cpp
lib/CodeGen/ELFWriter.h

index cd0c68a7a2e4ca5cbc6976a53e64982e9af3e7e8..48e0946b0a42bc67be36a23d19e679c1569c5ec0 100644 (file)
@@ -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!");
index f2a9bf34e587bdba7b2c98b217264d441764c14d..2679d983f44e3c1451cdc4d086fb7af9e1fdc6ed 100644 (file)
@@ -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;
index 021fbeb5d5900bb4991524dd22b3243621c23503..b8bfa7d2a0f1a02973210bf284d1d8ba5187f3bd 100644 (file)
@@ -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);