mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Teach our Dwarf emission to use the string pool.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@143097 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -613,6 +613,10 @@ bool AsmPrinter::needsSEHMoves() {
|
||||
MF->getFunction()->needsUnwindTableEntry();
|
||||
}
|
||||
|
||||
bool AsmPrinter::needsRelocationsForDwarfStringPool() const {
|
||||
return MAI->doesDwarfUseRelocationsForStringPool();
|
||||
}
|
||||
|
||||
void AsmPrinter::emitPrologLabel(const MachineInstr &MI) {
|
||||
MCSymbol *Label = MI.getOperand(0).getMCSymbol();
|
||||
|
||||
@@ -2092,4 +2096,3 @@ GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy *S) {
|
||||
report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -267,6 +267,7 @@ void DIELabel::EmitValue(AsmPrinter *AP, unsigned Form) const {
|
||||
///
|
||||
unsigned DIELabel::SizeOf(AsmPrinter *AP, unsigned Form) const {
|
||||
if (Form == dwarf::DW_FORM_data4) return 4;
|
||||
if (Form == dwarf::DW_FORM_strp) return 4;
|
||||
return AP->getTargetData().getPointerSize();
|
||||
}
|
||||
|
||||
@@ -290,6 +291,7 @@ void DIEDelta::EmitValue(AsmPrinter *AP, unsigned Form) const {
|
||||
///
|
||||
unsigned DIEDelta::SizeOf(AsmPrinter *AP, unsigned Form) const {
|
||||
if (Form == dwarf::DW_FORM_data4) return 4;
|
||||
if (Form == dwarf::DW_FORM_strp) return 4;
|
||||
return AP->getTargetData().getPointerSize();
|
||||
}
|
||||
|
||||
|
@@ -69,10 +69,21 @@ void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
|
||||
|
||||
/// addString - Add a string attribute data and value. DIEString only
|
||||
/// keeps string reference.
|
||||
void CompileUnit::addString(DIE *Die, unsigned Attribute, unsigned Form,
|
||||
StringRef String) {
|
||||
DIEValue *Value = new (DIEValueAllocator) DIEString(String);
|
||||
Die->addValue(Attribute, Form, Value);
|
||||
void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
|
||||
if (String.size() > 3) {
|
||||
MCSymbol *Symb = DD->getStringPoolEntry(String);
|
||||
DIEValue *Value;
|
||||
if (Asm->needsRelocationsForDwarfStringPool())
|
||||
Value = new (DIEValueAllocator) DIELabel(Symb);
|
||||
else {
|
||||
MCSymbol *StringPool = DD->getStringPool();
|
||||
Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
|
||||
}
|
||||
Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
|
||||
} else {
|
||||
DIEValue *Value = new (DIEValueAllocator) DIEString(String);
|
||||
Die->addValue(Attribute, dwarf::DW_FORM_string, Value);
|
||||
}
|
||||
}
|
||||
|
||||
/// addLabel - Add a Dwarf label attribute data and value.
|
||||
@@ -479,7 +490,7 @@ bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
|
||||
|
||||
/// addConstantFPValue - Add constant value entry in variable DIE.
|
||||
bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
|
||||
assert(MO.isFPImm() && "Invalid machine operand!");
|
||||
assert (MO.isFPImm() && "Invalid machine operand!");
|
||||
DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
|
||||
APFloat FPImm = MO.getFPImm()->getValueAPF();
|
||||
|
||||
@@ -660,7 +671,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
|
||||
StringRef Name = BTy.getName();
|
||||
// Add name if not anonymous or intermediate type.
|
||||
if (!Name.empty())
|
||||
addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
|
||||
addString(&Buffer, dwarf::DW_AT_name, Name);
|
||||
|
||||
if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
|
||||
Buffer.setTag(dwarf::DW_TAG_unspecified_type);
|
||||
@@ -694,7 +705,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
|
||||
|
||||
// Add name if not anonymous or intermediate type.
|
||||
if (!Name.empty())
|
||||
addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
|
||||
addString(&Buffer, dwarf::DW_AT_name, Name);
|
||||
|
||||
// Add size if non-zero (derived types might be zero-sized.)
|
||||
if (Size)
|
||||
@@ -791,8 +802,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
|
||||
else if (Element.isVariable()) {
|
||||
DIVariable DV(Element);
|
||||
ElemDie = new DIE(dwarf::DW_TAG_variable);
|
||||
addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
|
||||
DV.getName());
|
||||
addString(ElemDie, dwarf::DW_AT_name, DV.getName());
|
||||
addType(ElemDie, DV.getType());
|
||||
addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
|
||||
addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
|
||||
@@ -836,7 +846,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
|
||||
|
||||
// Add name if not anonymous or intermediate type.
|
||||
if (!Name.empty())
|
||||
addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
|
||||
addString(&Buffer, dwarf::DW_AT_name, Name);
|
||||
|
||||
if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
|
||||
|| Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
|
||||
@@ -868,7 +878,7 @@ CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
|
||||
|
||||
ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
|
||||
addType(ParamDIE, TP.getType());
|
||||
addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());
|
||||
addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
|
||||
return ParamDIE;
|
||||
}
|
||||
|
||||
@@ -883,7 +893,7 @@ CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV)
|
||||
ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
|
||||
addType(ParamDIE, TPV.getType());
|
||||
if (!TPV.getName().empty())
|
||||
addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());
|
||||
addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
|
||||
addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
|
||||
TPV.getValue());
|
||||
return ParamDIE;
|
||||
@@ -897,7 +907,7 @@ DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
|
||||
NDie = new DIE(dwarf::DW_TAG_namespace);
|
||||
insertDIE(NS, NDie);
|
||||
if (!NS.getName().empty())
|
||||
addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
|
||||
addString(NDie, dwarf::DW_AT_name, NS.getName());
|
||||
addSourceLine(NDie, NS);
|
||||
addToContextOwner(NDie, NS.getContext());
|
||||
return NDie;
|
||||
@@ -932,7 +942,7 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
|
||||
|
||||
StringRef LinkageName = SP.getLinkageName();
|
||||
if (!LinkageName.empty())
|
||||
addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
|
||||
addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
|
||||
getRealLinkageName(LinkageName));
|
||||
|
||||
// If this DIE is going to refer declaration info using AT_specification
|
||||
@@ -942,7 +952,7 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
|
||||
|
||||
// Constructors and operators for anonymous aggregates do not have names.
|
||||
if (!SP.getName().empty())
|
||||
addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
|
||||
addString(SPDie, dwarf::DW_AT_name, SP.getName());
|
||||
|
||||
addSourceLine(SPDie, SP);
|
||||
|
||||
@@ -1048,13 +1058,12 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
|
||||
insertDIE(N, VariableDIE);
|
||||
|
||||
// Add name.
|
||||
addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
|
||||
GV.getDisplayName());
|
||||
addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
|
||||
StringRef LinkageName = GV.getLinkageName();
|
||||
bool isGlobalVariable = GV.getGlobal() != NULL;
|
||||
if (!LinkageName.empty() && isGlobalVariable)
|
||||
addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
|
||||
dwarf::DW_FORM_string, getRealLinkageName(LinkageName));
|
||||
getRealLinkageName(LinkageName));
|
||||
// Add type.
|
||||
DIType GTy = GV.getType();
|
||||
addType(VariableDIE, GTy);
|
||||
@@ -1170,7 +1179,7 @@ void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
|
||||
DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
|
||||
DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
|
||||
StringRef Name = ETy.getName();
|
||||
addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
|
||||
addString(Enumerator, dwarf::DW_AT_name, Name);
|
||||
int64_t Value = ETy.getEnumValue();
|
||||
addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
|
||||
return Enumerator;
|
||||
@@ -1207,8 +1216,7 @@ DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
|
||||
addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
|
||||
dwarf::DW_FORM_ref4, AbsDIE);
|
||||
else {
|
||||
addString(VariableDie, dwarf::DW_AT_name,
|
||||
dwarf::DW_FORM_string, Name);
|
||||
addString(VariableDie, dwarf::DW_AT_name, Name);
|
||||
addSourceLine(VariableDie, DV->getVariable());
|
||||
addType(VariableDie, DV->getType());
|
||||
}
|
||||
@@ -1303,7 +1311,7 @@ DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
|
||||
DIE *MemberDie = new DIE(DT.getTag());
|
||||
StringRef Name = DT.getName();
|
||||
if (!Name.empty())
|
||||
addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
|
||||
addString(MemberDie, dwarf::DW_AT_name, Name);
|
||||
|
||||
addType(MemberDie, DT.getTypeDerivedFrom());
|
||||
|
||||
@@ -1377,16 +1385,13 @@ DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
|
||||
// Objective-C properties.
|
||||
StringRef PropertyName = DT.getObjCPropertyName();
|
||||
if (!PropertyName.empty()) {
|
||||
addString(MemberDie, dwarf::DW_AT_APPLE_property_name, dwarf::DW_FORM_string,
|
||||
PropertyName);
|
||||
addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
|
||||
StringRef GetterName = DT.getObjCPropertyGetterName();
|
||||
if (!GetterName.empty())
|
||||
addString(MemberDie, dwarf::DW_AT_APPLE_property_getter,
|
||||
dwarf::DW_FORM_string, GetterName);
|
||||
addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
|
||||
StringRef SetterName = DT.getObjCPropertySetterName();
|
||||
if (!SetterName.empty())
|
||||
addString(MemberDie, dwarf::DW_AT_APPLE_property_setter,
|
||||
dwarf::DW_FORM_string, SetterName);
|
||||
addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
|
||||
unsigned PropertyAttributes = 0;
|
||||
if (DT.isReadOnlyObjCProperty())
|
||||
PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
|
||||
|
@@ -150,8 +150,7 @@ public:
|
||||
|
||||
/// addString - Add a string attribute data and value.
|
||||
///
|
||||
void addString(DIE *Die, unsigned Attribute, unsigned Form,
|
||||
const StringRef Str);
|
||||
void addString(DIE *Die, unsigned Attribute, const StringRef Str);
|
||||
|
||||
/// addLabel - Add a Dwarf label attribute data and value.
|
||||
///
|
||||
|
@@ -136,6 +136,10 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
|
||||
DwarfDebug::~DwarfDebug() {
|
||||
}
|
||||
|
||||
MCSymbol *DwarfDebug::getStringPool() {
|
||||
return Asm->GetTempSymbol("section_str");
|
||||
}
|
||||
|
||||
MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
|
||||
std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
|
||||
if (Entry.first) return Entry.first;
|
||||
@@ -467,11 +471,10 @@ CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
|
||||
|
||||
DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
|
||||
CompileUnit *NewCU = new CompileUnit(ID, Die, Asm, this);
|
||||
NewCU->addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
|
||||
DIUnit.getProducer());
|
||||
NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
|
||||
NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
|
||||
DIUnit.getLanguage());
|
||||
NewCU->addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
|
||||
NewCU->addString(Die, dwarf::DW_AT_name, FN);
|
||||
// Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
|
||||
// simplifies debug range entries.
|
||||
NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
|
||||
@@ -484,14 +487,13 @@ CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
|
||||
NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
|
||||
|
||||
if (!Dir.empty())
|
||||
NewCU->addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
|
||||
NewCU->addString(Die, dwarf::DW_AT_comp_dir, Dir);
|
||||
if (DIUnit.isOptimized())
|
||||
NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
|
||||
|
||||
StringRef Flags = DIUnit.getFlags();
|
||||
if (!Flags.empty())
|
||||
NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string,
|
||||
Flags);
|
||||
NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
|
||||
|
||||
if (unsigned RVer = DIUnit.getRunTimeVersion())
|
||||
NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
|
||||
@@ -1796,6 +1798,7 @@ void DwarfDebug::emitDebugStr() {
|
||||
|
||||
// Emit the string itself.
|
||||
Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
|
||||
Asm->OutStreamer.EmitZeros(1, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -216,8 +216,6 @@ class DwarfDebug {
|
||||
StringMap<std::pair<MCSymbol*, unsigned> > StringPool;
|
||||
unsigned NextStringPoolNumber;
|
||||
|
||||
MCSymbol *getStringPoolEntry(StringRef Str);
|
||||
|
||||
/// SectionMap - Provides a unique id per text section.
|
||||
///
|
||||
UniqueVector<const MCSection*> SectionMap;
|
||||
@@ -504,6 +502,13 @@ public:
|
||||
|
||||
/// createSubprogramDIE - Create new DIE using SP.
|
||||
DIE *createSubprogramDIE(DISubprogram SP);
|
||||
|
||||
/// getStringPool - returns the entry into the start of the pool.
|
||||
MCSymbol *getStringPool();
|
||||
|
||||
/// getStringPoolEntry - returns an entry into the string pool with the given
|
||||
/// string text.
|
||||
MCSymbol *getStringPoolEntry(StringRef Str);
|
||||
};
|
||||
} // End of namespace llvm
|
||||
|
||||
|
Reference in New Issue
Block a user