mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-12 01:25:10 +00:00
Relax address updates in the eh_frame section.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122591 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -323,6 +323,8 @@ uint64_t MCAssembler::ComputeFragmentSize(const MCAsmLayout &Layout,
|
||||
|
||||
case MCFragment::FT_Dwarf:
|
||||
return cast<MCDwarfLineAddrFragment>(F).getContents().size();
|
||||
case MCFragment::FT_DwarfFrame:
|
||||
return cast<MCDwarfCallFrameFragment>(F).getContents().size();
|
||||
}
|
||||
|
||||
assert(0 && "invalid fragment kind");
|
||||
@@ -453,6 +455,11 @@ static void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout,
|
||||
OW->WriteBytes(OF.getContents().str());
|
||||
break;
|
||||
}
|
||||
case MCFragment::FT_DwarfFrame: {
|
||||
const MCDwarfCallFrameFragment &CF = cast<MCDwarfCallFrameFragment>(F);
|
||||
OW->WriteBytes(CF.getContents().str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
assert(OW->getStream().tell() - Start == FragmentSize);
|
||||
@@ -712,6 +719,21 @@ bool MCAssembler::RelaxDwarfLineAddr(MCAsmLayout &Layout,
|
||||
return OldSize != Data.size();
|
||||
}
|
||||
|
||||
bool MCAssembler::RelaxDwarfCallFrameFragment(MCAsmLayout &Layout,
|
||||
MCDwarfCallFrameFragment &DF) {
|
||||
int64_t AddrDelta = 0;
|
||||
uint64_t OldSize = DF.getContents().size();
|
||||
bool IsAbs = DF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, Layout);
|
||||
(void)IsAbs;
|
||||
assert(IsAbs);
|
||||
SmallString<8> &Data = DF.getContents();
|
||||
Data.clear();
|
||||
raw_svector_ostream OSE(Data);
|
||||
MCDwarfFrameEmitter::EncodeAdvanceLoc(AddrDelta, OSE);
|
||||
OSE.flush();
|
||||
return OldSize != Data.size();
|
||||
}
|
||||
|
||||
bool MCAssembler::LayoutSectionOnce(MCAsmLayout &Layout,
|
||||
MCSectionData &SD) {
|
||||
MCFragment *FirstInvalidFragment = NULL;
|
||||
@@ -730,9 +752,14 @@ bool MCAssembler::LayoutSectionOnce(MCAsmLayout &Layout,
|
||||
relaxedFrag = RelaxDwarfLineAddr(Layout,
|
||||
*cast<MCDwarfLineAddrFragment>(it2));
|
||||
break;
|
||||
case MCFragment::FT_LEB:
|
||||
relaxedFrag = RelaxLEB(Layout, *cast<MCLEBFragment>(it2));
|
||||
break;
|
||||
case MCFragment::FT_DwarfFrame:
|
||||
relaxedFrag =
|
||||
RelaxDwarfCallFrameFragment(Layout,
|
||||
*cast<MCDwarfCallFrameFragment>(it2));
|
||||
break;
|
||||
case MCFragment::FT_LEB:
|
||||
relaxedFrag = RelaxLEB(Layout, *cast<MCLEBFragment>(it2));
|
||||
break;
|
||||
}
|
||||
// Update the layout, and remember that we relaxed.
|
||||
if (relaxedFrag && !FirstInvalidFragment)
|
||||
@@ -789,6 +816,7 @@ void MCFragment::dump() {
|
||||
case MCFragment::FT_Inst: OS << "MCInstFragment"; break;
|
||||
case MCFragment::FT_Org: OS << "MCOrgFragment"; break;
|
||||
case MCFragment::FT_Dwarf: OS << "MCDwarfFragment"; break;
|
||||
case MCFragment::FT_DwarfFrame: OS << "MCDwarfCallFrameFragment"; break;
|
||||
case MCFragment::FT_LEB: OS << "MCLEBFragment"; break;
|
||||
}
|
||||
|
||||
@@ -855,6 +883,12 @@ void MCFragment::dump() {
|
||||
<< " LineDelta:" << OF->getLineDelta();
|
||||
break;
|
||||
}
|
||||
case MCFragment::FT_DwarfFrame: {
|
||||
const MCDwarfCallFrameFragment *CF = cast<MCDwarfCallFrameFragment>(this);
|
||||
OS << "\n ";
|
||||
OS << " AddrDelta:" << CF->getAddrDelta();
|
||||
break;
|
||||
}
|
||||
case MCFragment::FT_LEB: {
|
||||
const MCLEBFragment *LF = cast<MCLEBFragment>(this);
|
||||
OS << "\n ";
|
||||
|
Reference in New Issue
Block a user