--- Reverse-merging r82282 into '.':

U    lib/CodeGen/AsmPrinter/DwarfException.cpp
U    lib/CodeGen/AsmPrinter/DwarfException.h

--- Reverse-merging r82274 into '.':
U    lib/Target/TargetLoweringObjectFile.cpp
G    lib/CodeGen/AsmPrinter/DwarfException.cpp

These revisions were breaking everything.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82396 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2009-09-20 09:13:15 +00:00
parent 705764110c
commit 711bb91574
3 changed files with 22 additions and 58 deletions

View File

@ -74,25 +74,6 @@ 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.
@ -195,9 +176,23 @@ void DwarfException::EmitCIE(const Function *PersonalityFn, unsigned Index) {
// If there is a personality, we need to indicate the function's location.
if (PersonalityRef) {
if (!IsPersonalityPCRel)
PersonalityRef = CreateLabelDiff(PersonalityRef, "personalityref_addr",
Index);
// 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);
}
O << MAI->getData32bitsDirective();
PersonalityRef->print(O, MAI);
@ -898,34 +893,14 @@ void DwarfException::EmitExceptionTable() {
// of the catch clauses as they appear in the source code, and must be kept in
// the same order. As a result, changing the order of the catch clause would
// change the semantics of the program.
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
unsigned Index = 1;
for (std::vector<GlobalVariable *>::const_reverse_iterator
I = TypeInfos.rbegin(), E = TypeInfos.rend(); I != E; ++I, ++Index) {
const GlobalVariable *TI = *I;
I = TypeInfos.rbegin(), E = TypeInfos.rend(); I != E; ++I) {
const GlobalVariable *GV = *I;
PrintRelDirective();
if (TI) {
if (TTypeFormat == dwarf::DW_EH_PE_absptr ||
TI->getLinkage() == GlobalValue::InternalLinkage) {
// Print out the unadorned name of the type info.
PrintRelDirective();
O << Asm->Mang->getMangledName(TI);
} else {
bool IsTypeInfoIndirect = false, IsTypeInfoPCRel = false;
const MCExpr *TypeInfoRef =
TLOF.getSymbolForDwarfGlobalReference(TI, Asm->Mang, Asm->MMI,
IsTypeInfoIndirect,
IsTypeInfoPCRel);
if (!IsTypeInfoPCRel)
TypeInfoRef = CreateLabelDiff(TypeInfoRef, "typeinforef_addr", Index);
O << MAI->getData32bitsDirective();
TypeInfoRef->print(O, MAI);
}
if (GV) {
O << Asm->Mang->getMangledName(GV);
} else {
PrintRelDirective();
O << "0x0";
}

View File

@ -25,7 +25,6 @@ namespace llvm {
struct LandingPadInfo;
class MachineModuleInfo;
class MCAsmInfo;
class MCExpr;
class Timer;
class raw_ostream;
@ -169,11 +168,6 @@ 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.

View File

@ -782,13 +782,8 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
}
// Exception Handling.
#if 0
LSDASection = getMachOSection("__TEXT", "__gcc_except_tab", 0,
SectionKind::getReadOnly());
#else
LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0,
SectionKind::getDataRel());
#endif
EHFrameSection =
getMachOSection("__TEXT", "__eh_frame",
MCSectionMachO::S_COALESCED |