Tie dwarf generation to darwin assembler.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25093 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp
index 5fdfbfd..4759282 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 dcfb6e4..2fc65e6 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 f75e4aa..12b5f44 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 @@
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 @@
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 @@
}
}
+ // Emit post-function debug information.
+ DW.EndFunction();
+
// We didn't modify anything.
return false;
}
@@ -461,6 +481,9 @@
// 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 @@
// 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 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 c92122e..3115a57 100644
--- a/lib/Target/PowerPC/PPCTargetMachine.cpp
+++ b/lib/Target/PowerPC/PPCTargetMachine.cpp
@@ -80,7 +80,7 @@
CodeGenFileType FileType,
bool Fast) {
if (FileType != TargetMachine::AssemblyFile) return true;
-
+
// Run loop strength reduction before anything else.
if (!Fast) PM.add(createLoopStrengthReducePass());