Refactor the code that creates the "dot-label" difference. This may be used in

more than one place. No intended functionality change.

llvm-svn: 89024
This commit is contained in:
Bill Wendling 2009-11-17 01:23:53 +00:00
parent 7fc73a45da
commit dcecc143ae
2 changed files with 29 additions and 18 deletions

View File

@ -74,6 +74,25 @@ unsigned DwarfException::SizeOfEncodedValue(unsigned Encoding) {
return 0;
}
/// CreateLabelDiff - Emit a label and subtract it from the expression we
/// already have. This is equivalent to emitting "foo - .", but we have to emit
/// the label for "." directly.
const MCExpr *DwarfException::CreateLabelDiff(const MCExpr *ExprRef,
const char *LabelName,
unsigned Index) {
SmallString<64> Name;
raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix()
<< LabelName << Asm->getFunctionNumber()
<< "_" << Index;
MCSymbol *DotSym = Asm->OutContext.GetOrCreateSymbol(Name.str());
Asm->OutStreamer.EmitLabel(DotSym);
return MCBinaryExpr::CreateSub(ExprRef,
MCSymbolRefExpr::Create(DotSym,
Asm->OutContext),
Asm->OutContext);
}
/// EmitCIE - Emit a Common Information Entry (CIE). This holds information that
/// is shared among many Frame Description Entries. There is at least one CIE
/// in every non-empty .debug_frame section.
@ -176,24 +195,10 @@ void DwarfException::EmitCIE(const Function *PersonalityFn, unsigned Index) {
// If there is a personality, we need to indicate the function's location.
if (PersonalityRef) {
// If the reference to the personality function symbol is not already
// pc-relative, then we need to subtract our current address from it. Do
// this by emitting a label and subtracting it from the expression we
// already have. This is equivalent to emitting "foo - .", but we have to
// emit the label for "." directly.
if (!IsPersonalityPCRel) {
SmallString<64> Name;
raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix()
<< "personalityref_addr" << Asm->getFunctionNumber() << "_" << Index;
MCSymbol *DotSym = Asm->OutContext.GetOrCreateSymbol(Name.str());
Asm->OutStreamer.EmitLabel(DotSym);
PersonalityRef =
MCBinaryExpr::CreateSub(PersonalityRef,
MCSymbolRefExpr::Create(DotSym,Asm->OutContext),
Asm->OutContext);
}
if (!IsPersonalityPCRel)
PersonalityRef = CreateLabelDiff(PersonalityRef, "personalityref_addr",
Index);
O << MAI->getData32bitsDirective();
PersonalityRef->print(O, MAI);
Asm->EOL("Personality");

View File

@ -25,6 +25,7 @@ namespace llvm {
struct LandingPadInfo;
class MachineModuleInfo;
class MCAsmInfo;
class MCExpr;
class Timer;
class raw_ostream;
@ -172,6 +173,11 @@ class VISIBILITY_HIDDEN DwarfException : public Dwarf {
const SmallVectorImpl<unsigned> &FirstActions);
void EmitExceptionTable();
/// CreateLabelDiff - Emit a label and subtract it from the expression we
/// already have. This is equivalent to emitting "foo - .", but we have to
/// emit the label for "." directly.
const MCExpr *CreateLabelDiff(const MCExpr *ExprRef, const char *LabelName,
unsigned Index);
public:
//===--------------------------------------------------------------------===//
// Main entry points.