diff options
author | Jim Laskey <jlaskey@mac.com> | 2006-01-04 22:28:25 +0000 |
---|---|---|
committer | Jim Laskey <jlaskey@mac.com> | 2006-01-04 22:28:25 +0000 |
commit | b2efb853f00d45b1c8d57f92acd0028fbdeffda6 (patch) | |
tree | b5563153d7d0593950bc90ea1253acb1d787c556 /lib/CodeGen/DwarfWriter.cpp | |
parent | 62281a132f11e742a96ff9caeaaaa17900020acd (diff) |
Applied some recommend changes from sabre. The dominate one beginning "let the
pass manager do it's thing." Fixes crash when compiling -g files and suppresses
dwarf statements if no debug info is present.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25100 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/DwarfWriter.cpp')
-rw-r--r-- | lib/CodeGen/DwarfWriter.cpp | 132 |
1 files changed, 108 insertions, 24 deletions
diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index c62cf8996f..b44b1aaa55 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -11,32 +11,35 @@ // //===----------------------------------------------------------------------===// +#include "llvm/CodeGen/DwarfWriter.h" #include "llvm/CodeGen/AsmPrinter.h" -#include "llvm/CodeGen/DwarfWriter.h" +#include "llvm/CodeGen/MachineDebugInfo.h" #include "llvm/Support/CommandLine.h" +#include <iostream> -namespace llvm { +using 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. +/// unsigned leb128 value. Comment is added to the end of the directive if +/// DwarfVerbose is true (should not contain any newlines.) /// -void DwarfWriter::EmitULEB128Bytes(unsigned Value, std::string Comment) { +void DwarfWriter::EmitULEB128Bytes(unsigned Value, const char *Comment) const { if (hasLEB128) { O << "\t.uleb128\t" << Value; } else { - O << Asm->getData8bitsDirective(); + O << Asm->Data8bitsDirective; EmitULEB128(Value); } if (DwarfVerbose) { O << "\t" - << Asm->getCommentString() + << Asm->CommentString << " " << Comment << " " @@ -46,19 +49,20 @@ void DwarfWriter::EmitULEB128Bytes(unsigned Value, std::string Comment) { } /// EmitSLEB128Bytes - Emit an assembler byte data directive to compose a -/// signed leb128 value. +/// signed leb128 value. Comment is added to the end of the directive if +/// DwarfVerbose is true (should not contain any newlines.) /// -void DwarfWriter::EmitSLEB128Bytes(int Value, std::string Comment) { +void DwarfWriter::EmitSLEB128Bytes(int Value, const char *Comment) const { if (hasLEB128) { O << "\t.sleb128\t" << Value; } else { - O << Asm->getData8bitsDirective(); + O << Asm->Data8bitsDirective; EmitSLEB128(Value); } if (DwarfVerbose) { O << "\t" - << Asm->getCommentString() + << Asm->CommentString << " " << Comment << " " @@ -67,13 +71,75 @@ void DwarfWriter::EmitSLEB128Bytes(int Value, std::string Comment) { O << "\n"; } -/// BeginModule - Emit all dwarf sections that should come prior to the content. +/// EmitHex - Emit a hexidecimal string to the output stream. /// -void DwarfWriter::BeginModule() { - if (!DebugInfo.hasInfo()) return; - EmitComment("Dwarf Begin Module"); +void DwarfWriter::EmitHex(unsigned Value) const { + O << "0x" + << std::hex + << Value + << std::dec; +} + +/// EmitComment - Emit a simple string comment. +/// +void DwarfWriter::EmitComment(const char *Comment) const { + O << "\t" + << Asm->CommentString + << " " + << Comment + << "\n"; +} + +/// EmitULEB128 - Emit a series of hexidecimal values (separated by commas) +/// representing an unsigned leb128 value. +/// +void DwarfWriter::EmitULEB128(unsigned Value) const { + do { + unsigned Byte = Value & 0x7f; + Value >>= 7; + if (Value) Byte |= 0x80; + EmitHex(Byte); + if (Value) O << ", "; + } while (Value); +} + +/// EmitSLEB128 - Emit a series of hexidecimal values (separated by commas) +/// representing a signed leb128 value. +/// +void DwarfWriter::EmitSLEB128(int Value) const { + int Sign = Value >> (8 * sizeof(Value) - 1); + bool IsMore; - // define base addresses for dwarf sections + do { + unsigned Byte = Value & 0x7f; + Value >>= 7; + IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; + if (IsMore) Byte |= 0x80; + EmitHex(Byte); + if (IsMore) O << ", "; + } while (IsMore); +} + +/// EmitLabelName - Emit label name for internal use by dwarf. +/// +void DwarfWriter::EmitLabelName(const char *Tag, int Num) const { + O << Asm->PrivateGlobalPrefix + << "debug_" + << Tag + << Num; +} + +/// EmitLabel - Emit location label for internal use by dwarf. +/// +void DwarfWriter::EmitLabel(const char *Tag, int Num) const { + EmitLabelName(Tag, Num); + O << ":\n"; +} + +/// EmitInitial -Emit initial dwarf declarations. +/// +void DwarfWriter::EmitInitial() const { + // Dwarf section's base addresses. Asm->SwitchSection(DwarfAbbrevSection, 0); EmitLabel("abbrev", 0); Asm->SwitchSection(DwarfInfoSection, 0); @@ -82,33 +148,51 @@ void DwarfWriter::BeginModule() { EmitLabel("line", 0); } +/// ShouldEmitDwarf - Determine if dwarf declarations should be made. +/// +bool DwarfWriter::ShouldEmitDwarf() { + // Check if debug info is present. + if (!DebugInfo || !DebugInfo->hasInfo()) return false; + + // Make sure initial declarations are made. + if (!didInitial) { + EmitInitial(); + didInitial = true; + } + + // Okay to emit. + return true; +} + +/// BeginModule - Emit all dwarf sections that should come prior to the content. +/// +void DwarfWriter::BeginModule() { + if (!ShouldEmitDwarf()) return; + EmitComment("Dwarf Begin Module"); +} + /// EndModule - Emit all dwarf sections that should come after the content. /// void DwarfWriter::EndModule() { - if (!DebugInfo.hasInfo()) return; + if (!ShouldEmitDwarf()) return; EmitComment("Dwarf End Module"); // Print out dwarf file info - std::vector<std::string> Sources = DebugInfo.getSourceFiles(); + 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() { - if (!DebugInfo.hasInfo()) return; + if (!ShouldEmitDwarf()) return; EmitComment("Dwarf Begin Function"); } /// EndFunction - Emit post-function debug information. /// void DwarfWriter::EndFunction() { - if (!DebugInfo.hasInfo()) return; + if (!ShouldEmitDwarf()) return; EmitComment("Dwarf End Function"); } - - -} // End llvm namespace - |