[llvm-commits] CVS: llvm/lib/CodeGen/ELFWriter.cpp

Chris Lattner lattner at cs.uiuc.edu
Sun Jul 10 23:17:47 PDT 2005



Changes in directory llvm/lib/CodeGen:

ELFWriter.cpp updated: 1.5 -> 1.6
---
Log message:

Emit a symbol table entry for each function we output to the ELF file.  This
allows objdump to know which function we are emitting to:

00000000 <foo>:     <----
   0:   b8 01 00 00 00          mov    $0x1,%eax
   5:   03 44 24 04             add    0x4(%esp,1),%eax
   9:   c3                      ret    

... and allows .o files to be useful for linking :)


---
Diffs of the changes:  (+31 -1)

 ELFWriter.cpp |   32 +++++++++++++++++++++++++++++++-
 1 files changed, 31 insertions(+), 1 deletion(-)


Index: llvm/lib/CodeGen/ELFWriter.cpp
diff -u llvm/lib/CodeGen/ELFWriter.cpp:1.5 llvm/lib/CodeGen/ELFWriter.cpp:1.6
--- llvm/lib/CodeGen/ELFWriter.cpp:1.5	Mon Jul 11 00:17:18 2005
+++ llvm/lib/CodeGen/ELFWriter.cpp	Mon Jul 11 01:17:35 2005
@@ -67,7 +67,37 @@
 
       FnStart = OutputBuffer.size();
     }
-    void finishFunction(MachineFunction &F) {}
+    void finishFunction(MachineFunction &F) {
+      // We now know the size of the function, add a symbol to represent it.
+      ELFWriter::ELFSym FnSym(F.getFunction());
+
+      // Figure out the binding (linkage) of the symbol.
+      switch (F.getFunction()->getLinkage()) {
+      default:
+        // appending linkage is illegal for functions.
+        assert(0 && "Unknown linkage type!");
+      case GlobalValue::ExternalLinkage:
+        FnSym.SetBind(ELFWriter::ELFSym::STB_GLOBAL);
+        break;
+      case GlobalValue::LinkOnceLinkage:
+      case GlobalValue::WeakLinkage:
+        FnSym.SetBind(ELFWriter::ELFSym::STB_WEAK);
+        break;
+      case GlobalValue::InternalLinkage:
+        FnSym.SetBind(ELFWriter::ELFSym::STB_LOCAL);
+        break;
+      }
+
+      FnSym.SetType(ELFWriter::ELFSym::STT_FUNC);
+      FnSym.SectionIdx = EW.SectionList.size()-1;  // .text section.
+      // Value = Offset from start of .text
+      FnSym.Value = FnStart - EW.SectionList.back().Offset;
+      FnSym.Size = OutputBuffer.size()-FnStart;
+
+      // Finally, add it to the symtab.
+      EW.SymbolTable.push_back(FnSym);
+    }
+
     void emitConstantPool(MachineConstantPool *MCP) {
       if (MCP->isEmpty()) return;
       assert(0 && "unimp");






More information about the llvm-commits mailing list