aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/DwarfWriter.cpp
blob: c62cf8996f70e7e7fd3f1c749decebd9cc4cc8c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//===-- llvm/CodeGen/DwarfWriter.cpp - Dwarf Framework ----------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file was developed by James M. Laskey and is distributed under the
// University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains support for writing dwarf debug info into asm files.
//
//===----------------------------------------------------------------------===//


#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() {
  if (!DebugInfo.hasInfo()) return;
  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() {
  if (!DebugInfo.hasInfo()) return;
  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() {
  if (!DebugInfo.hasInfo()) return;
  EmitComment("Dwarf Begin Function");
}

/// EndFunction - Emit post-function debug information.
///
void DwarfWriter::EndFunction() {
  if (!DebugInfo.hasInfo()) return;
  EmitComment("Dwarf End Function");
}


} // End llvm namespace