mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Add a DIELoc class to cover the DW_FORM_exprloc set of expressions
alongside DIEBlock and replace uses accordingly. Use DW_FORM_exprloc in DWARF4 and later code. Update testcases. Adding a DIELoc instead of using extra forms inside DIEBlock so that we can keep location expressions separate from other uses. No direct use at the moment, however, it's not a lot of code and using a separately named class keeps it somewhat more obvious what's going on in various locations. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201481 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -418,6 +418,61 @@ void DIETypeSignature::print(raw_ostream &O) const {
|
||||
void DIETypeSignature::dump() const { print(dbgs()); }
|
||||
#endif
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// DIELoc Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// ComputeSize - calculate the size of the location expression.
|
||||
///
|
||||
unsigned DIELoc::ComputeSize(AsmPrinter *AP) {
|
||||
if (!Size) {
|
||||
const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
|
||||
for (unsigned i = 0, N = Values.size(); i < N; ++i)
|
||||
Size += Values[i]->SizeOf(AP, AbbrevData[i].getForm());
|
||||
}
|
||||
|
||||
return Size;
|
||||
}
|
||||
|
||||
/// EmitValue - Emit location data.
|
||||
///
|
||||
void DIELoc::EmitValue(AsmPrinter *Asm, dwarf::Form Form) const {
|
||||
switch (Form) {
|
||||
default: llvm_unreachable("Improper form for block");
|
||||
case dwarf::DW_FORM_block1: Asm->EmitInt8(Size); break;
|
||||
case dwarf::DW_FORM_block2: Asm->EmitInt16(Size); break;
|
||||
case dwarf::DW_FORM_block4: Asm->EmitInt32(Size); break;
|
||||
case dwarf::DW_FORM_block:
|
||||
case dwarf::DW_FORM_exprloc:
|
||||
Asm->EmitULEB128(Size); break;
|
||||
}
|
||||
|
||||
const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
|
||||
for (unsigned i = 0, N = Values.size(); i < N; ++i)
|
||||
Values[i]->EmitValue(Asm, AbbrevData[i].getForm());
|
||||
}
|
||||
|
||||
/// SizeOf - Determine size of location data in bytes.
|
||||
///
|
||||
unsigned DIELoc::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
switch (Form) {
|
||||
case dwarf::DW_FORM_block1: return Size + sizeof(int8_t);
|
||||
case dwarf::DW_FORM_block2: return Size + sizeof(int16_t);
|
||||
case dwarf::DW_FORM_block4: return Size + sizeof(int32_t);
|
||||
case dwarf::DW_FORM_block:
|
||||
case dwarf::DW_FORM_exprloc:
|
||||
return Size + MCAsmInfo::getULEB128Size(Size);
|
||||
default: llvm_unreachable("Improper form for block");
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
void DIELoc::print(raw_ostream &O) const {
|
||||
O << "ExprLoc: ";
|
||||
DIE::print(O, 5);
|
||||
}
|
||||
#endif
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// DIEBlock Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
Reference in New Issue
Block a user