Compute the size of the FDE encoding instead of hard coding it. Update

X8664_ELFTargetObjectFile::getFDEEncoding to match reality.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129959 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2011-04-22 00:08:43 +00:00
parent e8cfbd843d
commit abf9af60ad
3 changed files with 25 additions and 25 deletions

View File

@@ -58,6 +58,10 @@ public:
return TLOF->getEHFrameSection(); return TLOF->getEHFrameSection();
} }
const unsigned getFDEEncoding() const {
return TLOF->getFDEEncoding();
}
unsigned getDwarfRARegNum(bool isEH) const { unsigned getDwarfRARegNum(bool isEH) const {
return TRI->getDwarfRegNum(TRI->getRARegister(), isEH); return TRI->getDwarfRegNum(TRI->getRARegister(), isEH);
} }

View File

@@ -439,33 +439,35 @@ static int getDataAlignmentFactor(MCStreamer &streamer) {
return -size; return -size;
} }
static void EmitSymbol(MCStreamer &streamer, const MCSymbol &symbol, static unsigned getSizeForEncoding(MCStreamer &streamer,
unsigned symbolEncoding) { unsigned symbolEncoding) {
MCContext &context = streamer.getContext(); MCContext &context = streamer.getContext();
const TargetAsmInfo &asmInfo = context.getTargetAsmInfo(); const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
unsigned format = symbolEncoding & 0x0f; unsigned format = symbolEncoding & 0x0f;
unsigned application = symbolEncoding & 0x70;
unsigned size;
switch (format) { switch (format) {
default: default:
assert(0 && "Unknown Encoding"); assert(0 && "Unknown Encoding");
case dwarf::DW_EH_PE_absptr: case dwarf::DW_EH_PE_absptr:
case dwarf::DW_EH_PE_signed: case dwarf::DW_EH_PE_signed:
size = asmInfo.getPointerSize(); return asmInfo.getPointerSize();
break;
case dwarf::DW_EH_PE_udata2: case dwarf::DW_EH_PE_udata2:
case dwarf::DW_EH_PE_sdata2: case dwarf::DW_EH_PE_sdata2:
size = 2; return 2;
break;
case dwarf::DW_EH_PE_udata4: case dwarf::DW_EH_PE_udata4:
case dwarf::DW_EH_PE_sdata4: case dwarf::DW_EH_PE_sdata4:
size = 4; return 4;
break;
case dwarf::DW_EH_PE_udata8: case dwarf::DW_EH_PE_udata8:
case dwarf::DW_EH_PE_sdata8: case dwarf::DW_EH_PE_sdata8:
size = 8; return 8;
break;
} }
}
static void EmitSymbol(MCStreamer &streamer, const MCSymbol &symbol,
unsigned symbolEncoding) {
MCContext &context = streamer.getContext();
const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
unsigned size = getSizeForEncoding(streamer, symbolEncoding);
unsigned application = symbolEncoding & 0x70;
switch (application) { switch (application) {
default: default:
assert(0 && "Unknown Encoding"); assert(0 && "Unknown Encoding");
@@ -678,7 +680,7 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
streamer.EmitIntValue(lsdaEncoding, 1); streamer.EmitIntValue(lsdaEncoding, 1);
} }
// Encoding of the FDE pointers // Encoding of the FDE pointers
streamer.EmitIntValue(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4, 1); streamer.EmitIntValue(asmInfo.getFDEEncoding(), 1);
streamer.EmitLabel(augmentationEnd); streamer.EmitLabel(augmentationEnd);
// Initial Instructions // Initial Instructions
@@ -711,6 +713,7 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
MCContext &context = streamer.getContext(); MCContext &context = streamer.getContext();
MCSymbol *fdeStart = context.CreateTempSymbol(); MCSymbol *fdeStart = context.CreateTempSymbol();
MCSymbol *fdeEnd = context.CreateTempSymbol(); MCSymbol *fdeEnd = context.CreateTempSymbol();
const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
// Length // Length
const MCExpr *Length = MakeStartMinusEndExpr(streamer, *fdeStart, *fdeEnd, 0); const MCExpr *Length = MakeStartMinusEndExpr(streamer, *fdeStart, *fdeEnd, 0);
@@ -721,14 +724,16 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
const MCExpr *offset = MakeStartMinusEndExpr(streamer, cieStart, *fdeStart, const MCExpr *offset = MakeStartMinusEndExpr(streamer, cieStart, *fdeStart,
0); 0);
streamer.EmitValue(offset, 4); streamer.EmitValue(offset, 4);
unsigned fdeEncoding = asmInfo.getFDEEncoding();
unsigned size = getSizeForEncoding(streamer, fdeEncoding);
// PC Begin // PC Begin
streamer.EmitPCRelSymbolValue(frame.Begin, 4); streamer.EmitPCRelSymbolValue(frame.Begin, size);
// PC Range // PC Range
const MCExpr *Range = MakeStartMinusEndExpr(streamer, *frame.Begin, const MCExpr *Range = MakeStartMinusEndExpr(streamer, *frame.Begin,
*frame.End, 0); *frame.End, 0);
streamer.EmitValue(Range, 4); streamer.EmitValue(Range, size);
// Augmentation Data Length // Augmentation Data Length
MCSymbol *augmentationStart = streamer.getContext().CreateTempSymbol(); MCSymbol *augmentationStart = streamer.getContext().CreateTempSymbol();

View File

@@ -92,16 +92,7 @@ unsigned X8664_ELFTargetObjectFile::getLSDAEncoding() const {
} }
unsigned X8664_ELFTargetObjectFile::getFDEEncoding() const { unsigned X8664_ELFTargetObjectFile::getFDEEncoding() const {
CodeModel::Model Model = TM.getCodeModel(); return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
if (TM.getRelocationModel() == Reloc::PIC_)
return DW_EH_PE_pcrel | (Model == CodeModel::Small ||
Model == CodeModel::Medium ?
DW_EH_PE_sdata4 : DW_EH_PE_sdata8);
if (Model == CodeModel::Small || Model == CodeModel::Medium)
return DW_EH_PE_udata4;
return DW_EH_PE_absptr;
} }
unsigned X8664_ELFTargetObjectFile::getTTypeEncoding() const { unsigned X8664_ELFTargetObjectFile::getTTypeEncoding() const {