aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/AsmPrinter.cpp1
-rw-r--r--lib/CodeGen/DwarfWriter.cpp132
-rw-r--r--lib/CodeGen/MachineDebugInfo.cpp106
-rw-r--r--lib/CodeGen/SelectionDAG/LegalizeDAG.cpp8
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp3
5 files changed, 156 insertions, 94 deletions
diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp
index 475928250e..5fdfbfd5a3 100644
--- a/lib/CodeGen/AsmPrinter.cpp
+++ b/lib/CodeGen/AsmPrinter.cpp
@@ -16,7 +16,6 @@
#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 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
-
diff --git a/lib/CodeGen/MachineDebugInfo.cpp b/lib/CodeGen/MachineDebugInfo.cpp
index fc88b8ca00..d2a5fd5eb3 100644
--- a/lib/CodeGen/MachineDebugInfo.cpp
+++ b/lib/CodeGen/MachineDebugInfo.cpp
@@ -18,74 +18,52 @@ using namespace llvm;
// Handle the Pass registration stuff necessary to use TargetData's.
namespace {
- RegisterPass<MachineDebugInfo> X("machinedebuginfo", "Debug Information",
- PassInfo::Analysis | PassInfo::Optimization);
+ RegisterPass<MachineDebugInfo> X("machinedebuginfo", "Debug Information");
}
-
-namespace llvm {
-
- /// DebugInfo - Keep track of debug information for the function.
- ///
- // FIXME - making it global until we can find a proper place to hang it from.
- MachineDebugInfo *DebugInfo;
-
- // FIXME - temporary hack until we can find a place to hand debug info from.
- ModulePass *createDebugInfoPass() {
- if (!DebugInfo) DebugInfo = new MachineDebugInfo();
- return (ModulePass *)DebugInfo;
- }
- /// getDebugInfo - Returns the DebugInfo.
- MachineDebugInfo &getMachineDebugInfo() {
- assert(DebugInfo && "DebugInfo pass not created");
- return *DebugInfo;
- }
-
- /// doInitialization - Initialize the debug state for a new module.
- ///
- bool MachineDebugInfo::doInitialization() {
- return true;
- }
+/// doInitialization - Initialize the debug state for a new module.
+///
+bool MachineDebugInfo::doInitialization() {
+ return false;
+}
- /// doFinalization - Tear down the debug state after completion of a module.
- ///
- bool MachineDebugInfo::doFinalization() {
-
- return true;
- }
+/// doFinalization - Tear down the debug state after completion of a module.
+///
+bool MachineDebugInfo::doFinalization() {
+ return false;
+}
- /// RecordSource - Register a source file with debug info. Returns an id.
- ///
- unsigned MachineDebugInfo::RecordSource(std::string fname,
- std::string dirname) {
- // Compose a key
- std::string path = dirname + "/" + fname;
- // Check if the source file is already recorded
- StrIntMapIter SMI = SourceMap.find(path);
- // If already there return existing id
- if (SMI != SourceMap.end()) return SMI->second;
- // Bump up the count
- ++SourceCount;
- // Record the count
- SourceMap[path] = SourceCount;
- // Return id
- return SourceCount;
- }
+/// getUniqueSourceID - Register a source file with debug info. Returns an id.
+///
+unsigned MachineDebugInfo::getUniqueSourceID(const std::string &fname,
+ const std::string &dirname) {
+ // Compose a key
+ const std::string path = dirname + "/" + fname;
+ // Check if the source file is already recorded
+ std::map<std::string, unsigned>::iterator
+ SMI = SourceMap.lower_bound(path);
+ // If already there return existing id
+ if (SMI != SourceMap.end() && SMI->first == path) return SMI->second;
+ // Bump up the count
+ ++SourceCount;
+ // Record the count
+ SourceMap.insert(SMI, std::make_pair(path, SourceCount));
+ // Return id
+ return SourceCount;
+}
- /// getSourceFiles - Return a vector of files. Vector index + 1 equals id.
- ///
- std::vector<std::string> MachineDebugInfo::getSourceFiles() {
- std::vector<std::string> Sources(SourceCount);
-
- for (StrIntMapIter SMI = SourceMap.begin(), E = SourceMap.end(); SMI != E;
- SMI++) {
- unsigned Index = SMI->second - 1;
- std::string Path = SMI->first;
- Sources[Index] = Path;
- }
- return Sources;
+/// getSourceFiles - Return a vector of files. Vector index + 1 equals id.
+///
+std::vector<std::string> MachineDebugInfo::getSourceFiles() const {
+ std::vector<std::string> Sources(SourceCount);
+
+ for (std::map<std::string, unsigned>::const_iterator SMI = SourceMap.begin(),
+ E = SourceMap.end();
+ SMI != E; SMI++) {
+ unsigned Index = SMI->second - 1;
+ const std::string &Path = SMI->first;
+ Sources[Index] = Path;
}
-
-
-};
+ return Sources;
+}
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index bd8c50a53d..dec782a070 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -618,8 +618,8 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
case TargetLowering::Promote:
default: assert(0 && "This action is not supported yet!");
case TargetLowering::Expand: {
- if (TLI.isOperationLegal(ISD::DEBUG_LOC, MVT::Other)) {
- MachineDebugInfo &DebugInfo = getMachineDebugInfo();
+ MachineDebugInfo *DebugInfo = DAG.getMachineDebugInfo();
+ if (TLI.isOperationLegal(ISD::DEBUG_LOC, MVT::Other) && DebugInfo) {
std::vector<SDOperand> Ops;
Ops.push_back(Tmp1); // chain
Ops.push_back(Node->getOperand(1)); // line #
@@ -628,9 +628,9 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
cast<StringSDNode>(Node->getOperand(3))->getValue();
const std::string &dirname =
cast<StringSDNode>(Node->getOperand(4))->getValue();
- unsigned srcfile = DebugInfo.RecordSource(fname, dirname);
+ unsigned srcfile = DebugInfo->getUniqueSourceID(fname, dirname);
Ops.push_back(DAG.getConstant(srcfile, MVT::i32)); // source file id
- unsigned id = DebugInfo.NextUniqueID();
+ unsigned id = DebugInfo->getNextUniqueID();
Ops.push_back(DAG.getConstant(id, MVT::i32)); // label id
Result = DAG.getNode(ISD::DEBUG_LOC, MVT::Other, Ops);
} else {
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 103a00a25c..b7dd97c62a 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -21,6 +21,7 @@
#include "llvm/Instructions.h"
#include "llvm/Intrinsics.h"
#include "llvm/CodeGen/IntrinsicLowering.h"
+#include "llvm/CodeGen/MachineDebugInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
@@ -1640,7 +1641,7 @@ void SelectionDAGISel::BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB,
void SelectionDAGISel::SelectBasicBlock(BasicBlock *LLVMBB, MachineFunction &MF,
FunctionLoweringInfo &FuncInfo) {
- SelectionDAG DAG(TLI, MF);
+ SelectionDAG DAG(TLI, MF, getAnalysisToUpdate<MachineDebugInfo>());
CurDAG = &DAG;
std::vector<std::pair<MachineInstr*, unsigned> > PHINodesToUpdate;