mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-25 00:29:20 +00:00
now that enough stuff is constified, move function header printing
logic up from X86 into the common code. The other targets will hopefully start using this soon. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94614 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
eec791afb1
commit
b11caedd6f
@ -211,12 +211,16 @@ namespace llvm {
|
||||
/// is being processed from runOnMachineFunction.
|
||||
void SetupMachineFunction(MachineFunction &MF);
|
||||
|
||||
/// EmitFunctionHeader - This method emits the header for the current
|
||||
/// function.
|
||||
void EmitFunctionHeader();
|
||||
|
||||
/// EmitConstantPool - Print to the current output stream assembly
|
||||
/// representations of the constants in the constant pool MCP. This is
|
||||
/// used to print out constants which have been "spilled to memory" by
|
||||
/// the code generator.
|
||||
///
|
||||
void EmitConstantPool(MachineConstantPool *MCP);
|
||||
void EmitConstantPool(const MachineConstantPool *MCP);
|
||||
|
||||
/// EmitJumpTableInfo - Print assembly representations of the jump tables
|
||||
/// used by the current function to the current output stream.
|
||||
|
@ -285,6 +285,73 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
OutStreamer.AddBlankLine();
|
||||
}
|
||||
|
||||
/// EmitFunctionHeader - This method emits the header for the current
|
||||
/// function.
|
||||
void AsmPrinter::EmitFunctionHeader() {
|
||||
// Print out constants referenced by the function
|
||||
EmitConstantPool(MF->getConstantPool());
|
||||
|
||||
// Print the 'header' of function.
|
||||
unsigned FnAlign = MF->getAlignment();
|
||||
const Function *F = MF->getFunction();
|
||||
|
||||
OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F, Mang, TM));
|
||||
EmitAlignment(FnAlign, F);
|
||||
|
||||
switch (F->getLinkage()) {
|
||||
default: llvm_unreachable("Unknown linkage type!");
|
||||
case Function::InternalLinkage: // Symbols default to internal.
|
||||
case Function::PrivateLinkage:
|
||||
break;
|
||||
case Function::DLLExportLinkage:
|
||||
case Function::ExternalLinkage:
|
||||
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
|
||||
break;
|
||||
case Function::LinkerPrivateLinkage:
|
||||
case Function::LinkOnceAnyLinkage:
|
||||
case Function::LinkOnceODRLinkage:
|
||||
case Function::WeakAnyLinkage:
|
||||
case Function::WeakODRLinkage:
|
||||
if (MAI->getWeakDefDirective() != 0) {
|
||||
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
|
||||
O << MAI->getWeakDefDirective() << *CurrentFnSym << '\n';
|
||||
} else if (MAI->getLinkOnceDirective() != 0) {
|
||||
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
|
||||
// FIXME: linkonce should be a section attribute, handled by COFF Section
|
||||
// assignment.
|
||||
// http://sourceware.org/binutils/docs-2.20/as/Linkonce.html#Linkonce
|
||||
O << "\t.linkonce discard\n";
|
||||
} else {
|
||||
O << "\t.weak\t" << *CurrentFnSym << '\n';
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
printVisibility(CurrentFnSym, F->getVisibility());
|
||||
|
||||
if (MAI->hasDotTypeDotSizeDirective())
|
||||
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
|
||||
|
||||
O << *CurrentFnSym << ':';
|
||||
if (VerboseAsm) {
|
||||
O.PadToColumn(MAI->getCommentColumn());
|
||||
O << MAI->getCommentString() << ' ';
|
||||
WriteAsOperand(O, F, /*PrintType=*/false, F->getParent());
|
||||
}
|
||||
O << '\n';
|
||||
|
||||
// Add some workaround for linkonce linkage on Cygwin\MinGW.
|
||||
if (MAI->getLinkOnceDirective() != 0 &&
|
||||
(F->hasLinkOnceLinkage() || F->hasWeakLinkage()))
|
||||
O << "Lllvm$workaround$fake$stub$" << *CurrentFnSym << ":\n";
|
||||
|
||||
// Emit pre-function debug and/or EH information.
|
||||
if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling())
|
||||
DW->BeginFunction(MF);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
bool AsmPrinter::doFinalization(Module &M) {
|
||||
// Emit global variables.
|
||||
@ -390,7 +457,7 @@ namespace {
|
||||
/// used to print out constants which have been "spilled to memory" by
|
||||
/// the code generator.
|
||||
///
|
||||
void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) {
|
||||
void AsmPrinter::EmitConstantPool(const MachineConstantPool *MCP) {
|
||||
const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants();
|
||||
if (CP.empty()) return;
|
||||
|
||||
@ -1556,6 +1623,7 @@ void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock *MBB) const {
|
||||
}
|
||||
|
||||
void AsmPrinter::printVisibility(MCSymbol *Sym, unsigned Visibility) const {
|
||||
// FIXME: RENAME TO EmitVisibility.
|
||||
MCSymbolAttr Attr = MCSA_Invalid;
|
||||
|
||||
switch (Visibility) {
|
||||
|
@ -63,54 +63,32 @@ void X86AsmPrinter::PrintPICBaseSymbol() const {
|
||||
OutContext);
|
||||
}
|
||||
|
||||
void X86AsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
|
||||
unsigned FnAlign = MF.getAlignment();
|
||||
const Function *F = MF.getFunction();
|
||||
/// runOnMachineFunction - This uses the printMachineInstruction()
|
||||
/// method to print assembly for each instruction.
|
||||
///
|
||||
bool X86AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
SetupMachineFunction(MF);
|
||||
O << "\n\n";
|
||||
|
||||
if (Subtarget->isTargetCygMing()) {
|
||||
// COFF and Cygwin specific mangling stuff. This should be moved out to the
|
||||
// mangler or handled some other way?
|
||||
if (Subtarget->isTargetCOFF()) {
|
||||
X86COFFMachineModuleInfo &COFFMMI =
|
||||
MMI->getObjFileInfo<X86COFFMachineModuleInfo>();
|
||||
COFFMMI.DecorateCygMingName(CurrentFnSym, OutContext, F,
|
||||
*TM.getTargetData());
|
||||
|
||||
// Populate function information map. Don't want to populate
|
||||
// non-stdcall or non-fastcall functions' information right now.
|
||||
const Function *F = MF.getFunction();
|
||||
CallingConv::ID CC = F->getCallingConv();
|
||||
if (CC == CallingConv::X86_StdCall || CC == CallingConv::X86_FastCall)
|
||||
COFFMMI.AddFunctionInfo(F, *MF.getInfo<X86MachineFunctionInfo>());
|
||||
}
|
||||
if (Subtarget->isTargetCygMing()) {
|
||||
const Function *F = MF.getFunction();
|
||||
X86COFFMachineModuleInfo &COFFMMI =
|
||||
MMI->getObjFileInfo<X86COFFMachineModuleInfo>();
|
||||
COFFMMI.DecorateCygMingName(CurrentFnSym, OutContext,F,*TM.getTargetData());
|
||||
|
||||
OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F, Mang, TM));
|
||||
EmitAlignment(FnAlign, F);
|
||||
|
||||
switch (F->getLinkage()) {
|
||||
default: llvm_unreachable("Unknown linkage type!");
|
||||
case Function::InternalLinkage: // Symbols default to internal.
|
||||
case Function::PrivateLinkage:
|
||||
break;
|
||||
case Function::DLLExportLinkage:
|
||||
case Function::ExternalLinkage:
|
||||
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
|
||||
break;
|
||||
case Function::LinkerPrivateLinkage:
|
||||
case Function::LinkOnceAnyLinkage:
|
||||
case Function::LinkOnceODRLinkage:
|
||||
case Function::WeakAnyLinkage:
|
||||
case Function::WeakODRLinkage:
|
||||
if (Subtarget->isTargetDarwin()) {
|
||||
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
|
||||
O << MAI->getWeakDefDirective() << *CurrentFnSym << '\n';
|
||||
} else if (Subtarget->isTargetCygMing()) {
|
||||
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
|
||||
// FIXME: linkonce should be a section attribute, handled by COFF Section
|
||||
// assignment.
|
||||
// http://sourceware.org/binutils/docs-2.20/as/Linkonce.html#Linkonce
|
||||
O << "\t.linkonce discard\n";
|
||||
} else {
|
||||
O << "\t.weak\t" << *CurrentFnSym << '\n';
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
printVisibility(CurrentFnSym, F->getVisibility());
|
||||
|
||||
if (MAI->hasDotTypeDotSizeDirective()) {
|
||||
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
|
||||
} else if (Subtarget->isTargetCygMing()) {
|
||||
O << "\t.def\t " << *CurrentFnSym;
|
||||
O << ";\t.scl\t" <<
|
||||
(F->hasInternalLinkage() ? COFF::C_STAT : COFF::C_EXT)
|
||||
@ -118,49 +96,9 @@ void X86AsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
|
||||
<< ";\t.endef\n";
|
||||
}
|
||||
|
||||
O << *CurrentFnSym << ':';
|
||||
if (VerboseAsm) {
|
||||
O.PadToColumn(MAI->getCommentColumn());
|
||||
O << MAI->getCommentString() << ' ';
|
||||
WriteAsOperand(O, F, /*PrintType=*/false, F->getParent());
|
||||
}
|
||||
O << '\n';
|
||||
// Have common code print out the function header with linkage info etc.
|
||||
EmitFunctionHeader();
|
||||
|
||||
// Add some workaround for linkonce linkage on Cygwin\MinGW
|
||||
if (Subtarget->isTargetCygMing() &&
|
||||
(F->hasLinkOnceLinkage() || F->hasWeakLinkage()))
|
||||
O << "Lllvm$workaround$fake$stub$" << *CurrentFnSym << ":\n";
|
||||
}
|
||||
|
||||
/// runOnMachineFunction - This uses the printMachineInstruction()
|
||||
/// method to print assembly for each instruction.
|
||||
///
|
||||
bool X86AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
const Function *F = MF.getFunction();
|
||||
CallingConv::ID CC = F->getCallingConv();
|
||||
|
||||
SetupMachineFunction(MF);
|
||||
O << "\n\n";
|
||||
|
||||
if (Subtarget->isTargetCOFF()) {
|
||||
X86COFFMachineModuleInfo &COFFMMI =
|
||||
MMI->getObjFileInfo<X86COFFMachineModuleInfo>();
|
||||
|
||||
// Populate function information map. Don't want to populate
|
||||
// non-stdcall or non-fastcall functions' information right now.
|
||||
if (CC == CallingConv::X86_StdCall || CC == CallingConv::X86_FastCall)
|
||||
COFFMMI.AddFunctionInfo(F, *MF.getInfo<X86MachineFunctionInfo>());
|
||||
}
|
||||
|
||||
// Print out constants referenced by the function
|
||||
EmitConstantPool(MF.getConstantPool());
|
||||
|
||||
// Print the 'header' of function
|
||||
emitFunctionHeader(MF);
|
||||
|
||||
// Emit pre-function debug and/or EH information.
|
||||
if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling())
|
||||
DW->BeginFunction(&MF);
|
||||
|
||||
// Print out code for the function.
|
||||
bool hasAnyRealCode = false;
|
||||
@ -181,7 +119,6 @@ bool X86AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
// If the function is empty, then we need to emit *something*. Otherwise,
|
||||
// the function's label might be associated with something that it wasn't
|
||||
// meant to be associated with. We emit a noop in this situation.
|
||||
// We are assuming inline asms are code.
|
||||
O << "\tnop\n";
|
||||
}
|
||||
|
||||
|
@ -130,9 +130,6 @@ class VISIBILITY_HIDDEN X86AsmPrinter : public AsmPrinter {
|
||||
void PrintPICBaseSymbol() const;
|
||||
|
||||
bool runOnMachineFunction(MachineFunction &F);
|
||||
|
||||
void emitFunctionHeader(const MachineFunction &MF);
|
||||
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
Loading…
Reference in New Issue
Block a user