mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-07 11:33:44 +00:00
Add a small temporary hack for producing identical eh_frame sections on OS X.
This removes one of the main advantages of moving eh_frame to MC, but makes the transition a lot easier to debug (run md5). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130379 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
514cecc72b
commit
235b830328
@ -23,6 +23,7 @@
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
class TargetAsmInfo;
|
||||
class MachineMove;
|
||||
class MCContext;
|
||||
class MCExpr;
|
||||
@ -282,7 +283,8 @@ namespace llvm {
|
||||
//
|
||||
static void Emit(MCStreamer &streamer);
|
||||
static void EmitAdvanceLoc(MCStreamer &Streamer, uint64_t AddrDelta);
|
||||
static void EncodeAdvanceLoc(uint64_t AddrDelta, raw_ostream &OS);
|
||||
static void EncodeAdvanceLoc(uint64_t AddrDelta, raw_ostream &OS,
|
||||
const TargetAsmInfo &AsmInfo);
|
||||
};
|
||||
} // end namespace llvm
|
||||
|
||||
|
@ -732,7 +732,8 @@ bool MCAssembler::RelaxDwarfCallFrameFragment(MCAsmLayout &Layout,
|
||||
SmallString<8> &Data = DF.getContents();
|
||||
Data.clear();
|
||||
raw_svector_ostream OSE(Data);
|
||||
MCDwarfFrameEmitter::EncodeAdvanceLoc(AddrDelta, OSE);
|
||||
const TargetAsmInfo &AsmInfo = getContext().getTargetAsmInfo();
|
||||
MCDwarfFrameEmitter::EncodeAdvanceLoc(AddrDelta, OSE, AsmInfo);
|
||||
OSE.flush();
|
||||
return OldSize != Data.size();
|
||||
}
|
||||
|
@ -843,21 +843,28 @@ void MCDwarfFrameEmitter::EmitAdvanceLoc(MCStreamer &Streamer,
|
||||
uint64_t AddrDelta) {
|
||||
SmallString<256> Tmp;
|
||||
raw_svector_ostream OS(Tmp);
|
||||
MCDwarfFrameEmitter::EncodeAdvanceLoc(AddrDelta, OS);
|
||||
const TargetAsmInfo &AsmInfo = Streamer.getContext().getTargetAsmInfo();
|
||||
MCDwarfFrameEmitter::EncodeAdvanceLoc(AddrDelta, OS, AsmInfo);
|
||||
Streamer.EmitBytes(OS.str(), /*AddrSpace=*/0);
|
||||
}
|
||||
|
||||
void MCDwarfFrameEmitter::EncodeAdvanceLoc(uint64_t AddrDelta,
|
||||
raw_ostream &OS) {
|
||||
raw_ostream &OS,
|
||||
const TargetAsmInfo &AsmInfo) {
|
||||
// This is a small hack to facilitate the transition to CFI on OS X. It
|
||||
// relaxes all address advances which lets us produces identical output
|
||||
// to the one produce by CodeGen.
|
||||
const bool Relax = !AsmInfo.isFunctionEHFrameSymbolPrivate();
|
||||
|
||||
// FIXME: Assumes the code alignment factor is 1.
|
||||
if (AddrDelta == 0) {
|
||||
} else if (isUIntN(6, AddrDelta)) {
|
||||
} else if (isUIntN(6, AddrDelta) && !Relax) {
|
||||
uint8_t Opcode = dwarf::DW_CFA_advance_loc | AddrDelta;
|
||||
OS << Opcode;
|
||||
} else if (isUInt<8>(AddrDelta)) {
|
||||
} else if (isUInt<8>(AddrDelta) && !Relax) {
|
||||
OS << uint8_t(dwarf::DW_CFA_advance_loc1);
|
||||
OS << uint8_t(AddrDelta);
|
||||
} else if (isUInt<16>(AddrDelta)) {
|
||||
} else if (isUInt<16>(AddrDelta) && !Relax) {
|
||||
// FIXME: check what is the correct behavior on a big endian machine.
|
||||
OS << uint8_t(dwarf::DW_CFA_advance_loc2);
|
||||
OS << uint8_t( AddrDelta & 0xff);
|
||||
|
Loading…
Reference in New Issue
Block a user