diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index 602fa51e3ae..5b3e420a8fd 100644 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -167,31 +167,8 @@ std::string X86ATTAsmPrinter::getSectionForFunction(const Function &F) const { } } -/// runOnMachineFunction - This uses the printMachineInstruction() -/// method to print assembly for each instruction. -/// -bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { - if (TAI->doesSupportDebugInformation()) { - // Let PassManager know we need debug information and relay - // the MachineModuleInfo address on to DwarfWriter. - MMI = &getAnalysis(); - DW.SetModuleInfo(MMI); - } - - SetupMachineFunction(MF); - O << "\n\n"; - - // Print out constants referenced by the function - EmitConstantPool(MF.getConstantPool()); - - // Print out labels for the function. +void X86ATTAsmPrinter::emitFunctionHeader(const MachineFunction &MF) { const Function *F = MF.getFunction(); - unsigned CC = F->getCallingConv(); - - // Populate function information map. Actually, We don't want to populate - // non-stdcall or non-fastcall functions' information right now. - if (CC == CallingConv::X86_StdCall || CC == CallingConv::X86_FastCall) - FunctionInfoMap[F] = *MF.getInfo(); decorateName(CurrentFnName, F); @@ -204,8 +181,6 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { EmitAlignment(FnAlign, F); break; case Function::DLLExportLinkage: - DLLExportedFns.insert(Mang->makeNameProper(F->getName(), "")); - //FALLS THROUGH case Function::ExternalLinkage: EmitAlignment(FnAlign, F); O << "\t.globl\t" << CurrentFnName << "\n"; @@ -248,13 +223,43 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { (F->getLinkage() == Function::LinkOnceLinkage || F->getLinkage() == Function::WeakLinkage)) O << "Lllvm$workaround$fake$stub$" << CurrentFnName << ":\n"; +} - if (TAI->doesSupportDebugInformation() || - TAI->doesSupportExceptionHandling()) { - // Emit pre-function debug and/or EH information. - DW.BeginFunction(&MF); +/// runOnMachineFunction - This uses the printMachineInstruction() +/// method to print assembly for each instruction. +/// +bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { + const Function *F = MF.getFunction(); + unsigned CC = F->getCallingConv(); + + if (TAI->doesSupportDebugInformation()) { + // Let PassManager know we need debug information and relay + // the MachineModuleInfo address on to DwarfWriter. + MMI = &getAnalysis(); + DW.SetModuleInfo(MMI); } + SetupMachineFunction(MF); + O << "\n\n"; + + // Populate function information map. Actually, We don't want to populate + // non-stdcall or non-fastcall functions' information right now. + if (CC == CallingConv::X86_StdCall || CC == CallingConv::X86_FastCall) + FunctionInfoMap[F] = *MF.getInfo(); + + // Print out constants referenced by the function + EmitConstantPool(MF.getConstantPool()); + + if (F->hasDLLExportLinkage()) + DLLExportedFns.insert(Mang->makeNameProper(F->getName(), "")); + + // Print the 'header' of function + emitFunctionHeader(MF); + + // Emit pre-function debug and/or EH information. + if (TAI->doesSupportDebugInformation() || TAI->doesSupportExceptionHandling()) + DW.BeginFunction(&MF); + // Print out code for the function. bool hasAnyRealCode = false; for (MachineFunction::const_iterator I = MF.begin(), E = MF.end(); @@ -284,10 +289,9 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { if (TAI->hasDotTypeDotSizeDirective()) O << "\t.size\t" << CurrentFnName << ", .-" << CurrentFnName << "\n"; - if (TAI->doesSupportDebugInformation()) { - // Emit post-function debug information. + // Emit post-function debug information. + if (TAI->doesSupportDebugInformation()) DW.EndFunction(); - } // Print out jump tables referenced by the function. EmitJumpTableInfo(MF.getJumpTableInfo(), MF); diff --git a/lib/Target/X86/X86ATTAsmPrinter.h b/lib/Target/X86/X86ATTAsmPrinter.h index 2c80df41fcd..025a157ac26 100644 --- a/lib/Target/X86/X86ATTAsmPrinter.h +++ b/lib/Target/X86/X86ATTAsmPrinter.h @@ -124,6 +124,8 @@ struct VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter { /// specified function body into. virtual std::string getSectionForFunction(const Function &F) const; + void emitFunctionHeader(const MachineFunction &MF); + // Necessary for Darwin to print out the apprioriate types of linker stubs StringSet<> FnStubs, GVStubs, LinkOnceStubs;