From f8a01a966120a041fe96300271573a8bf5a3e668 Mon Sep 17 00:00:00 2001
From: Jim Laskey
Date: Thu, 15 Jun 2006 20:51:43 +0000
Subject: [PATCH] 1. Support standard dwarf format (was bootstrapping in Apple
format.)
2. Add vector support.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28807 91177308-0d34-0410-b5e6-96231b3b80d8
---
docs/SourceLevelDebugging.html | 7 ++++++-
include/llvm/CodeGen/MachineDebugInfo.h | 5 ++++-
include/llvm/Support/Dwarf.h | 13 ++++++++++---
lib/CodeGen/DwarfWriter.cpp | 16 ++++++++++++----
lib/CodeGen/MachineDebugInfo.cpp | 2 ++
lib/Support/Dwarf.cpp | 7 +++++++
lib/Target/PowerPC/PPCAsmPrinter.cpp | 22 +++++++++++-----------
7 files changed, 52 insertions(+), 20 deletions(-)
diff --git a/docs/SourceLevelDebugging.html b/docs/SourceLevelDebugging.html
index 447a659dec0..2538aeaa109 100644
--- a/docs/SourceLevelDebugging.html
+++ b/docs/SourceLevelDebugging.html
@@ -575,6 +575,7 @@ NULL derived type.
uint, ;; Size in bits
uint, ;; Alignment in bits
uint, ;; Offset in bits
+ bool, ;; Is vector flag
{ }* ;; Reference to array of member descriptors
}
@@ -590,6 +591,8 @@ are possible tag values;
DW_TAG_union_type = 23
+The vector flag indicates that an array type is a native packed vector.
+
The members of array types (tag = DW_TAG_array_type) are subrange descriptors, each representing the range of
subscripts at that level of indexing.
@@ -1600,7 +1603,8 @@ struct Color {
uint 96,
uint 32,
uint 0,
- { }* null,
+ { }* null,
+ bool false,
{ }* cast ([3 x { }*]* %llvm.dbg.array to { }*) }, section "llvm.metadata"
%str2 = internal constant [6 x sbyte] c"Color\00", section "llvm.metadata"
@@ -1693,6 +1697,7 @@ enum Trees {
uint 32,
uint 0,
{ }* null,
+ bool false,
{ }* cast ([3 x { }*]* %llvm.dbg.array to { }*) }, section "llvm.metadata"
%str1 = internal constant [6 x sbyte] c"Trees\00", section "llvm.metadata"
diff --git a/include/llvm/CodeGen/MachineDebugInfo.h b/include/llvm/CodeGen/MachineDebugInfo.h
index 8a7160caca2..ba135def3f0 100644
--- a/include/llvm/CodeGen/MachineDebugInfo.h
+++ b/include/llvm/CodeGen/MachineDebugInfo.h
@@ -57,7 +57,7 @@ class StructType;
// Debug info constants.
enum {
- LLVMDebugVersion = 3 // Current version of debug information.
+ LLVMDebugVersion = 4 // Current version of debug information.
};
//===----------------------------------------------------------------------===//
@@ -400,13 +400,16 @@ public:
/// array/struct types (eg., arrays, struct, union, enums.)
class CompositeTypeDesc : public DerivedTypeDesc {
private:
+ bool IsVector; // packed/vector array
std::vector Elements;// Information used to compose type.
public:
CompositeTypeDesc(unsigned T);
// Accessors
+ bool isVector() const { return IsVector; }
std::vector &getElements() { return Elements; }
+ void setIsVector() { IsVector = true; }
// Implement isa/cast/dyncast.
static bool classof(const CompositeTypeDesc *) { return true; }
diff --git a/include/llvm/Support/Dwarf.h b/include/llvm/Support/Dwarf.h
index fb434f64652..49a7d3de990 100644
--- a/include/llvm/Support/Dwarf.h
+++ b/include/llvm/Support/Dwarf.h
@@ -37,10 +37,10 @@ enum llvm_dwarf_constants {
DW_TAG_arg_variable = 0x101, // Tag for argument variables.
DW_TAG_return_variable = 0x102, // Tag for return variables.
- DW_TAG_user_base = 0x1000, // Recommended base for user tags.
+ DW_TAG_user_base = 0x1000, // Recommended base for user tags.
- DW_CIE_VERSION = 1, // Common frame information version.
- DW_CIE_ID = 0xffffffff // Common frame information mark.
+ DW_CIE_VERSION = 1, // Common frame information version.
+ DW_CIE_ID = 0xffffffff // Common frame information mark.
};
enum dwarf_constants {
@@ -198,6 +198,13 @@ enum dwarf_constants {
DW_AT_elemental = 0x66,
DW_AT_pure = 0x67,
DW_AT_recursive = 0x68,
+ DW_AT_sf_names = 0x2101,
+ DW_AT_src_info = 0x2102,
+ DW_AT_mac_info = 0x2103,
+ DW_AT_src_coords = 0x2104,
+ DW_AT_body_begin = 0x2105,
+ DW_AT_body_end = 0x2106,
+ DW_AT_GNU_vector = 0x2107,
DW_AT_lo_user = 0x2000,
DW_AT_hi_user = 0x3fff,
diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp
index 3aadd97f2a1..7805bbcbbf0 100644
--- a/lib/CodeGen/DwarfWriter.cpp
+++ b/lib/CodeGen/DwarfWriter.cpp
@@ -1265,7 +1265,7 @@ DIE *DwarfWriter::NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit) {
// Fundamental types like int, float, bool
Slot = Ty = new DIE(DW_TAG_base_type);
unsigned Encoding = BasicTy->getEncoding();
- Ty->AddUInt (DW_AT_encoding, DW_FORM_data1, Encoding);
+ Ty->AddUInt(DW_AT_encoding, DW_FORM_data1, Encoding);
} else if (DerivedTypeDesc *DerivedTy = dyn_cast(TyDesc)) {
// Create specific DIE.
Slot = Ty = new DIE(DerivedTy->getTag());
@@ -1287,6 +1287,12 @@ DIE *DwarfWriter::NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit) {
Ty->AddDIEntry(DW_AT_type, DW_FORM_ref4,
NewType(Context, FromTy, Unit));
}
+
+ // check for vector type
+ if (CompTy->isVector()) {
+ Ty->AddUInt(DW_AT_GNU_vector, DW_FORM_flag, 1);
+ }
+
// Don't emit size attribute.
Size = 0;
@@ -1419,7 +1425,8 @@ CompileUnit *DwarfWriter::NewCompileUnit(CompileUnitDesc *UnitDesc,
unsigned ID) {
// Construct debug information entry.
DIE *Die = new DIE(DW_TAG_compile_unit);
- Die->AddLabel (DW_AT_stmt_list, DW_FORM_data4, DWLabel("line", 0));
+ Die->AddDelta (DW_AT_stmt_list, DW_FORM_data4, DWLabel("line", 0),
+ DWLabel("section_line", 0));
Die->AddLabel (DW_AT_high_pc, DW_FORM_addr, DWLabel("text_end", 0));
Die->AddLabel (DW_AT_low_pc, DW_FORM_addr, DWLabel("text_begin", 0));
Die->AddString(DW_AT_producer, DW_FORM_string, UnitDesc->getProducer());
@@ -1842,7 +1849,7 @@ void DwarfWriter::EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
int stackGrowth =
Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
TargetFrameInfo::StackGrowsUp ?
- AddressSize : -AddressSize;
+ AddressSize : -AddressSize;
EmitULEB128Bytes(Src.getOffset() / stackGrowth);
EOL("Offset");
@@ -1875,7 +1882,8 @@ void DwarfWriter::EmitDebugInfo() const {
EmitInt32(ContentSize); EOL("Length of Compilation Unit Info");
EmitInt16(DWARF_VERSION); EOL("DWARF version number");
- EmitReference("abbrev_begin", 0); EOL("Offset Into Abbrev. Section");
+ EmitDifference("abbrev_begin", 0, "section_abbrev", 0);
+ EOL("Offset Into Abbrev. Section");
EmitInt8(AddressSize); EOL("Address Size (in bytes)");
EmitDIE(Die);
diff --git a/lib/CodeGen/MachineDebugInfo.cpp b/lib/CodeGen/MachineDebugInfo.cpp
index fcdf30d9c96..a3013e9608e 100644
--- a/lib/CodeGen/MachineDebugInfo.cpp
+++ b/lib/CodeGen/MachineDebugInfo.cpp
@@ -817,6 +817,7 @@ void DerivedTypeDesc::dump() {
CompositeTypeDesc::CompositeTypeDesc(unsigned T)
: DerivedTypeDesc(T)
+, IsVector(false)
, Elements()
{}
@@ -839,6 +840,7 @@ bool CompositeTypeDesc::classof(const DebugInfoDesc *D) {
void CompositeTypeDesc::ApplyToFields(DIVisitor *Visitor) {
DerivedTypeDesc::ApplyToFields(Visitor);
+ Visitor->Apply(IsVector);
Visitor->Apply(Elements);
}
diff --git a/lib/Support/Dwarf.cpp b/lib/Support/Dwarf.cpp
index 1f2eef4dfd8..409eadd5607 100644
--- a/lib/Support/Dwarf.cpp
+++ b/lib/Support/Dwarf.cpp
@@ -188,6 +188,13 @@ const char *AttributeString(unsigned Attribute) {
case DW_AT_elemental: return "AT_elemental";
case DW_AT_pure: return "AT_pure";
case DW_AT_recursive: return "AT_recursive";
+ case DW_AT_sf_names: return "AT_sf_names";
+ case DW_AT_src_info: return "AT_src_info";
+ case DW_AT_mac_info: return "AT_mac_info";
+ case DW_AT_src_coords: return "AT_src_coords";
+ case DW_AT_body_begin: return "AT_body_begin";
+ case DW_AT_body_end: return "AT_body_end";
+ case DW_AT_GNU_vector: return "AT_GNU_vector";
case DW_AT_lo_user: return "AT_lo_user";
case DW_AT_hi_user: return "AT_hi_user";
}
diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp
index 44ab7f83c2d..6d78a5d0aef 100644
--- a/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -246,17 +246,17 @@ namespace {
: DwarfWriter(o, ap)
{
needsSet = true;
- DwarfAbbrevSection = ".section __DWARFA,__debug_abbrev";
- DwarfInfoSection = ".section __DWARFA,__debug_info";
- DwarfLineSection = ".section __DWARFA,__debug_line";
- DwarfFrameSection = ".section __DWARFA,__debug_frame";
- DwarfPubNamesSection = ".section __DWARFA,__debug_pubnames";
- DwarfPubTypesSection = ".section __DWARFA,__debug_pubtypes";
- DwarfStrSection = ".section __DWARFA,__debug_str";
- DwarfLocSection = ".section __DWARFA,__debug_loc";
- DwarfARangesSection = ".section __DWARFA,__debug_aranges";
- DwarfRangesSection = ".section __DWARFA,__debug_ranges";
- DwarfMacInfoSection = ".section __DWARFA,__debug_macinfo";
+ DwarfAbbrevSection = ".section __DWARF,__debug_abbrev";
+ DwarfInfoSection = ".section __DWARF,__debug_info";
+ DwarfLineSection = ".section __DWARF,__debug_line";
+ DwarfFrameSection = ".section __DWARF,__debug_frame";
+ DwarfPubNamesSection = ".section __DWARF,__debug_pubnames";
+ DwarfPubTypesSection = ".section __DWARF,__debug_pubtypes";
+ DwarfStrSection = ".section __DWARF,__debug_str";
+ DwarfLocSection = ".section __DWARF,__debug_loc";
+ DwarfARangesSection = ".section __DWARF,__debug_aranges";
+ DwarfRangesSection = ".section __DWARF,__debug_ranges";
+ DwarfMacInfoSection = ".section __DWARF,__debug_macinfo";
TextSection = ".text";
DataSection = ".data";
}