From b11caedd6f36afc6518cf0ea9bbff6500fd77334 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 26 Jan 2010 23:18:44 +0000 Subject: [PATCH] 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 --- include/llvm/CodeGen/AsmPrinter.h | 6 +- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 70 ++++++++++++- lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp | 107 ++++---------------- lib/Target/X86/AsmPrinter/X86AsmPrinter.h | 3 - 4 files changed, 96 insertions(+), 90 deletions(-) diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index 86072812619..fed0894c88a 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -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. diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 50e88773e8b..2dbb83646b6 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -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 &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) { diff --git a/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp index 9390ff37041..16432341e19 100644 --- a/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp @@ -63,104 +63,42 @@ void X86AsmPrinter::PrintPICBaseSymbol() const { OutContext); } -void X86AsmPrinter::emitFunctionHeader(const MachineFunction &MF) { - unsigned FnAlign = MF.getAlignment(); - const Function *F = MF.getFunction(); - - if (Subtarget->isTargetCygMing()) { - X86COFFMachineModuleInfo &COFFMMI = - MMI->getObjFileInfo(); - 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) - << ";\t.type\t" << (COFF::DT_FCN << COFF::N_BTSHFT) - << ";\t.endef\n"; - } - - 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 (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"; - + + // 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(); + MMI->getObjFileInfo(); // 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()); } - - // 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); + if (Subtarget->isTargetCygMing()) { + const Function *F = MF.getFunction(); + X86COFFMachineModuleInfo &COFFMMI = + MMI->getObjFileInfo(); + COFFMMI.DecorateCygMingName(CurrentFnSym, OutContext,F,*TM.getTargetData()); + + O << "\t.def\t " << *CurrentFnSym; + O << ";\t.scl\t" << + (F->hasInternalLinkage() ? COFF::C_STAT : COFF::C_EXT) + << ";\t.type\t" << (COFF::DT_FCN << COFF::N_BTSHFT) + << ";\t.endef\n"; + } + + // Have common code print out the function header with linkage info etc. + EmitFunctionHeader(); + // 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"; } diff --git a/lib/Target/X86/AsmPrinter/X86AsmPrinter.h b/lib/Target/X86/AsmPrinter/X86AsmPrinter.h index b4d88e74caa..e7dc939e205 100644 --- a/lib/Target/X86/AsmPrinter/X86AsmPrinter.h +++ b/lib/Target/X86/AsmPrinter/X86AsmPrinter.h @@ -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