mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-12 18:33:22 +00:00
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 :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22378 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f0cf1b7e5f
commit
5fe7b6e2be
@ -67,7 +67,37 @@ namespace llvm {
|
|||||||
|
|
||||||
FnStart = OutputBuffer.size();
|
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) {
|
void emitConstantPool(MachineConstantPool *MCP) {
|
||||||
if (MCP->isEmpty()) return;
|
if (MCP->isEmpty()) return;
|
||||||
assert(0 && "unimp");
|
assert(0 && "unimp");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user