void cloneExpression(DataExtractor &Data, DWARFExpression Expression,
const DWARFFile &File, CompileUnit &Unit,
SmallVectorImpl<uint8_t> &OutputBuffer,
- int64_t AddrRelocAdjustment);
+ int64_t AddrRelocAdjustment, bool IsLittleEndian);
/// Clone an attribute referencing another DIE and add
/// it to \p Die.
void DWARFLinker::DIECloner::cloneExpression(
DataExtractor &Data, DWARFExpression Expression, const DWARFFile &File,
CompileUnit &Unit, SmallVectorImpl<uint8_t> &OutputBuffer,
- int64_t AddrRelocAdjustment) {
+ int64_t AddrRelocAdjustment, bool IsLittleEndian) {
using Encoding = DWARFExpression::Operation::Encoding;
uint8_t OrigAddressByteSize = Unit.getOrigUnit().getAddressByteSize();
// processed by applyValidRelocs.
OutputBuffer.push_back(dwarf::DW_OP_addr);
uint64_t LinkedAddress = SA->Address + AddrRelocAdjustment;
+ if (!IsLittleEndian)
+ sys::swapByteOrder(LinkedAddress);
ArrayRef<uint8_t> AddressBytes(
reinterpret_cast<const uint8_t *>(&LinkedAddress),
OrigAddressByteSize);
if (OutOperandKind) {
OutputBuffer.push_back(*OutOperandKind);
uint64_t LinkedAddress = SA->Address + AddrRelocAdjustment;
+ if (!IsLittleEndian)
+ sys::swapByteOrder(LinkedAddress);
ArrayRef<uint8_t> AddressBytes(
reinterpret_cast<const uint8_t *>(&LinkedAddress),
OrigAddressByteSize);
DWARFExpression Expr(Data, OrigUnit.getAddressByteSize(),
OrigUnit.getFormParams().Format);
cloneExpression(Data, Expr, File, Unit, Buffer,
- Unit.getInfo(InputDIE).AddrAdjust);
+ Unit.getInfo(InputDIE).AddrAdjust, IsLittleEndian);
Bytes = Buffer;
}
for (auto Byte : Bytes)
cloneExpression(Data,
DWARFExpression(Data, OrigUnit.getAddressByteSize(),
OrigUnit.getFormParams().Format),
- File, *CurrentUnit, OutBytes, RelocAdjustment);
+ File, *CurrentUnit, OutBytes, RelocAdjustment,
+ IsLittleEndian);
};
Linker.generateUnitLocations(*CurrentUnit, File, ProcessExpr);
}