mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
Use DW_FORM_sdata for signed constant values and udata on occasion
when we can. Migrate from using blocks when we're adding just a single attribute and floating point values are an unsigned, not signed, bag of bits. Update all test cases accordingly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189419 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -606,21 +606,36 @@ void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
|
||||
// their maximum bit width which is a bit unfortunate (& doesn't prefer
|
||||
// udata/sdata over dataN as suggested by the DWARF spec)
|
||||
assert(MO.isImm() && "Invalid machine operand!");
|
||||
DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
|
||||
int SizeInBits = -1;
|
||||
bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
|
||||
uint16_t Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
|
||||
switch (SizeInBits) {
|
||||
case 8: Form = dwarf::DW_FORM_data1; break;
|
||||
case 16: Form = dwarf::DW_FORM_data2; break;
|
||||
case 32: Form = dwarf::DW_FORM_data4; break;
|
||||
case 64: Form = dwarf::DW_FORM_data8; break;
|
||||
default: break;
|
||||
}
|
||||
SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
|
||||
: addUInt(Block, 0, Form, MO.getImm());
|
||||
uint16_t Form;
|
||||
|
||||
addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
|
||||
// If we're a signed constant definitely use sdata.
|
||||
if (SignedConstant) {
|
||||
addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
|
||||
return;
|
||||
}
|
||||
|
||||
// Else use data for now unless it's larger than we can deal with.
|
||||
switch (SizeInBits) {
|
||||
case 8:
|
||||
Form = dwarf::DW_FORM_data1;
|
||||
break;
|
||||
case 16:
|
||||
Form = dwarf::DW_FORM_data2;
|
||||
break;
|
||||
case 32:
|
||||
Form = dwarf::DW_FORM_data4;
|
||||
break;
|
||||
case 64:
|
||||
Form = dwarf::DW_FORM_data8;
|
||||
break;
|
||||
default:
|
||||
Form = dwarf::DW_FORM_udata;
|
||||
addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
|
||||
return;
|
||||
}
|
||||
addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
|
||||
}
|
||||
|
||||
/// addConstantFPValue - Add constant value entry in variable DIE.
|
||||
@ -649,7 +664,8 @@ void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
|
||||
|
||||
/// addConstantFPValue - Add constant value entry in variable DIE.
|
||||
void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
|
||||
addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), false);
|
||||
// Pass this down to addConstantValue as an unsigned bag of bits.
|
||||
addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
|
||||
}
|
||||
|
||||
/// addConstantValue - Add constant value entry in variable DIE.
|
||||
@ -662,19 +678,34 @@ void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
|
||||
void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
|
||||
unsigned CIBitWidth = Val.getBitWidth();
|
||||
if (CIBitWidth <= 64) {
|
||||
unsigned form = 0;
|
||||
switch (CIBitWidth) {
|
||||
case 8: form = dwarf::DW_FORM_data1; break;
|
||||
case 16: form = dwarf::DW_FORM_data2; break;
|
||||
case 32: form = dwarf::DW_FORM_data4; break;
|
||||
case 64: form = dwarf::DW_FORM_data8; break;
|
||||
default:
|
||||
form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
|
||||
// If we're a signed constant definitely use sdata.
|
||||
if (!Unsigned) {
|
||||
addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
|
||||
Val.getSExtValue());
|
||||
return;
|
||||
}
|
||||
if (Unsigned)
|
||||
addUInt(Die, dwarf::DW_AT_const_value, form, Val.getZExtValue());
|
||||
else
|
||||
addSInt(Die, dwarf::DW_AT_const_value, form, Val.getSExtValue());
|
||||
|
||||
// Else use data for now unless it's larger than we can deal with.
|
||||
uint16_t Form;
|
||||
switch (CIBitWidth) {
|
||||
case 8:
|
||||
Form = dwarf::DW_FORM_data1;
|
||||
break;
|
||||
case 16:
|
||||
Form = dwarf::DW_FORM_data2;
|
||||
break;
|
||||
case 32:
|
||||
Form = dwarf::DW_FORM_data4;
|
||||
break;
|
||||
case 64:
|
||||
Form = dwarf::DW_FORM_data8;
|
||||
break;
|
||||
default:
|
||||
addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
|
||||
Val.getZExtValue());
|
||||
return;
|
||||
}
|
||||
addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
|
||||
return;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user