diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/AsmPrinter.cpp | 1 | ||||
-rw-r--r-- | lib/CodeGen/DwarfWriter.cpp | 95 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCAsmPrinter.cpp | 42 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCTargetMachine.cpp | 2 |
4 files changed, 131 insertions, 9 deletions
diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp index 5fdfbfd5a3..475928250e 100644 --- a/lib/CodeGen/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter.cpp @@ -16,6 +16,7 @@ #include "llvm/Constants.h" #include "llvm/Module.h" #include "llvm/CodeGen/MachineConstantPool.h" +#include "llvm/CodeGen/MachineDebugInfo.h" #include "llvm/Support/Mangler.h" #include "llvm/Support/MathExtras.h" #include "llvm/Target/TargetMachine.h" diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index dcfb6e4e0e..2fc65e6f95 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -12,4 +12,99 @@ //===----------------------------------------------------------------------===// +#include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/DwarfWriter.h" +#include "llvm/Support/CommandLine.h" + + +namespace llvm { + +static cl::opt<bool> +DwarfVerbose("dwarf-verbose", cl::Hidden, + cl::desc("Add comments to dwarf directives.")); + +/// EmitULEB128Bytes - Emit an assembler byte data directive to compose an +/// unsigned leb128 value. +/// +void DwarfWriter::EmitULEB128Bytes(unsigned Value, std::string Comment) { + if (hasLEB128) { + O << "\t.uleb128\t" + << Value; + } else { + O << Asm->getData8bitsDirective(); + EmitULEB128(Value); + } + if (DwarfVerbose) { + O << "\t" + << Asm->getCommentString() + << " " + << Comment + << " " + << Value; + } + O << "\n"; +} + +/// EmitSLEB128Bytes - Emit an assembler byte data directive to compose a +/// signed leb128 value. +/// +void DwarfWriter::EmitSLEB128Bytes(int Value, std::string Comment) { + if (hasLEB128) { + O << "\t.sleb128\t" + << Value; + } else { + O << Asm->getData8bitsDirective(); + EmitSLEB128(Value); + } + if (DwarfVerbose) { + O << "\t" + << Asm->getCommentString() + << " " + << Comment + << " " + << Value; + } + O << "\n"; +} + +/// BeginModule - Emit all dwarf sections that should come prior to the content. +/// +void DwarfWriter::BeginModule() { + EmitComment("Dwarf Begin Module"); + + // define base addresses for dwarf sections + Asm->SwitchSection(DwarfAbbrevSection, 0); + EmitLabel("abbrev", 0); + Asm->SwitchSection(DwarfInfoSection, 0); + EmitLabel("info", 0); + Asm->SwitchSection(DwarfLineSection, 0); + EmitLabel("line", 0); +} + +/// EndModule - Emit all dwarf sections that should come after the content. +/// +void DwarfWriter::EndModule() { + EmitComment("Dwarf End Module"); + // Print out dwarf file info + std::vector<std::string> Sources = DebugInfo.getSourceFiles(); + for (unsigned i = 0, N = Sources.size(); i < N; i++) { + O << "\t; .file\t" << (i + 1) << "," << "\"" << Sources[i] << "\"" << "\n"; + } +} + + +/// BeginFunction - Emit pre-function debug information. +/// +void DwarfWriter::BeginFunction() { + EmitComment("Dwarf Begin Function"); +} + +/// EndFunction - Emit post-function debug information. +/// +void DwarfWriter::EndFunction() { + EmitComment("Dwarf End Function"); +} + + +} // End llvm namespace + diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index f75e4aae22..12b5f44775 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -25,6 +25,7 @@ #include "llvm/Module.h" #include "llvm/Assembly/Writer.h" #include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/CodeGen/DwarfWriter.h" #include "llvm/CodeGen/MachineDebugInfo.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstr.h" @@ -205,13 +206,33 @@ namespace { virtual bool doFinalization(Module &M) = 0; }; + /// DarwinDwarfWriter - Dwarf debug info writer customized for Darwin/Mac OS X + /// + struct DarwinDwarfWriter : public DwarfWriter { + // Ctor. + DarwinDwarfWriter(std::ostream &o, AsmPrinter *ap, MachineDebugInfo &di) + : DwarfWriter(o, ap, di) + { + hasLEB128 = false; + needsSet = true; + DwarfAbbrevSection = ".section __DWARFA,__debug_abbrev,regular,debug"; + DwarfInfoSection = ".section __DWARFA,__debug_info,regular,debug"; + DwarfLineSection = ".section __DWARFA,__debug_line,regular,debug"; + } + }; + /// DarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac OS /// X /// struct DarwinAsmPrinter : public PPCAsmPrinter { + + DarwinDwarfWriter DW; DarwinAsmPrinter(std::ostream &O, TargetMachine &TM) - : PPCAsmPrinter(O, TM) { + : PPCAsmPrinter(O, TM), + // FIXME - MachineDebugInfo needs a proper location + DW(O, this, getMachineDebugInfo()) + { CommentString = ";"; GlobalPrefix = "_"; PrivateGlobalPrefix = "L"; // Marker for constant pool idxs @@ -397,12 +418,8 @@ bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) { SetupMachineFunction(MF); O << "\n\n"; - // Print out dwarf file info - MachineDebugInfo &DebugInfo = MF.getDebugInfo(); - std::vector<std::string> Sources = DebugInfo.getSourceFiles(); - for (unsigned i = 0, N = Sources.size(); i < N; i++) { - O << "\t; .file\t" << (i + 1) << "," << "\"" << Sources[i] << "\"" << "\n"; - } + // Emit pre-function debug information. + DW.BeginFunction(); // Print out constants referenced by the function EmitConstantPool(MF.getConstantPool()); @@ -449,6 +466,9 @@ bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) { } } + // Emit post-function debug information. + DW.EndFunction(); + // We didn't modify anything. return false; } @@ -461,6 +481,9 @@ bool DarwinAsmPrinter::doInitialization(Module &M) { // Darwin wants symbols to be quoted if they have complex names. Mang->setUseQuotes(true); + + // Emit initial debug information. + DW.BeginModule(); return false; } @@ -583,6 +606,9 @@ bool DarwinAsmPrinter::doFinalization(Module &M) { // code that does this, it is always safe to set. O << "\t.subsections_via_symbols\n"; + // Emit initial debug information. + DW.EndModule(); + AsmPrinter::doFinalization(M); return false; // success } @@ -592,7 +618,7 @@ bool DarwinAsmPrinter::doFinalization(Module &M) { /// bool AIXAsmPrinter::runOnMachineFunction(MachineFunction &MF) { SetupMachineFunction(MF); - + // Print out constants referenced by the function EmitConstantPool(MF.getConstantPool()); diff --git a/lib/Target/PowerPC/PPCTargetMachine.cpp b/lib/Target/PowerPC/PPCTargetMachine.cpp index c92122ec7d..3115a57a90 100644 --- a/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -80,7 +80,7 @@ bool PPCTargetMachine::addPassesToEmitFile(PassManager &PM, CodeGenFileType FileType, bool Fast) { if (FileType != TargetMachine::AssemblyFile) return true; - + // Run loop strength reduction before anything else. if (!Fast) PM.add(createLoopStrengthReducePass()); |