mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Clean up code, no functionality changes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22382 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c569d79a2a
commit
0e18050797
@ -40,7 +40,13 @@
|
||||
#include "llvm/Support/Mangler.h"
|
||||
using namespace llvm;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// ELFCodeEmitter Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
namespace llvm {
|
||||
/// ELFCodeEmitter - This class is used by the ELFWriter to emit the code for
|
||||
/// functions to the ELF file.
|
||||
class ELFCodeEmitter : public MachineCodeEmitter {
|
||||
ELFWriter &EW;
|
||||
std::vector<unsigned char> &OutputBuffer;
|
||||
@ -48,55 +54,8 @@ namespace llvm {
|
||||
public:
|
||||
ELFCodeEmitter(ELFWriter &ew) : EW(ew), OutputBuffer(EW.OutputBuffer) {}
|
||||
|
||||
void startFunction(MachineFunction &F) {
|
||||
// Align the output buffer to the appropriate alignment.
|
||||
unsigned Align = 16; // FIXME: GENERICIZE!!
|
||||
ELFWriter::ELFSection &TextSection = EW.SectionList.back();
|
||||
|
||||
// Upgrade the section alignment if required.
|
||||
if (TextSection.Align < Align) TextSection.Align = Align;
|
||||
|
||||
// Add padding zeros to the end of the buffer to make sure that the
|
||||
// function will start on the correct byte alignment within the section.
|
||||
size_t SectionOff = OutputBuffer.size()-TextSection.Offset;
|
||||
if (SectionOff & (Align-1)) {
|
||||
// Add padding to get alignment to the correct place.
|
||||
size_t Pad = Align-(SectionOff & (Align-1));
|
||||
OutputBuffer.resize(OutputBuffer.size()+Pad);
|
||||
}
|
||||
|
||||
FnStart = OutputBuffer.size();
|
||||
}
|
||||
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 startFunction(MachineFunction &F);
|
||||
void finishFunction(MachineFunction &F);
|
||||
|
||||
void emitConstantPool(MachineConstantPool *MCP) {
|
||||
if (MCP->isEmpty()) return;
|
||||
@ -123,7 +82,8 @@ namespace llvm {
|
||||
virtual uint64_t getConstantPoolEntryAddress(unsigned Index) {
|
||||
assert(0 && "CP not implementated yet!");
|
||||
}
|
||||
/// JIT SPECIFIC FUNCTIONS
|
||||
|
||||
/// JIT SPECIFIC FUNCTIONS - DO NOT IMPLEMENT THESE HERE!
|
||||
void startFunctionStub(unsigned StubSize) {
|
||||
assert(0 && "JIT specific function called!");
|
||||
abort();
|
||||
@ -136,6 +96,64 @@ namespace llvm {
|
||||
};
|
||||
}
|
||||
|
||||
/// startFunction - This callback is invoked when a new machine function is
|
||||
/// about to be emitted.
|
||||
void ELFCodeEmitter::startFunction(MachineFunction &F) {
|
||||
// Align the output buffer to the appropriate alignment.
|
||||
unsigned Align = 16; // FIXME: GENERICIZE!!
|
||||
ELFWriter::ELFSection &TextSection = EW.SectionList.back();
|
||||
|
||||
// Upgrade the section alignment if required.
|
||||
if (TextSection.Align < Align) TextSection.Align = Align;
|
||||
|
||||
// Add padding zeros to the end of the buffer to make sure that the
|
||||
// function will start on the correct byte alignment within the section.
|
||||
size_t SectionOff = OutputBuffer.size()-TextSection.Offset;
|
||||
if (SectionOff & (Align-1)) {
|
||||
// Add padding to get alignment to the correct place.
|
||||
size_t Pad = Align-(SectionOff & (Align-1));
|
||||
OutputBuffer.resize(OutputBuffer.size()+Pad);
|
||||
}
|
||||
|
||||
FnStart = OutputBuffer.size();
|
||||
}
|
||||
|
||||
/// finishFunction - This callback is invoked after the function is completely
|
||||
/// finished.
|
||||
void ELFCodeEmitter::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);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// ELFWriter Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
ELFWriter::ELFWriter(std::ostream &o, TargetMachine &tm) : O(o), TM(tm) {
|
||||
e_machine = 0; // e_machine defaults to 'No Machine'
|
||||
|
Loading…
Reference in New Issue
Block a user