mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-15 05:24:01 +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:
@ -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;
|
||||
|
Reference in New Issue
Block a user