OSDN Git Service

Factor out label difference creation.
authorBill Wendling <isanbard@gmail.com>
Fri, 18 Sep 2009 21:37:56 +0000 (21:37 +0000)
committerBill Wendling <isanbard@gmail.com>
Fri, 18 Sep 2009 21:37:56 +0000 (21:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82282 91177308-0d34-0410-b5e6-96231b3b80d8

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

index f3897ff..d6000e6 100644 (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,23 +195,9 @@ 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);
@@ -912,24 +917,8 @@ void DwarfException::EmitExceptionTable() {
                                                 IsTypeInfoIndirect,
                                                 IsTypeInfoPCRel);
 
-        if (!IsTypeInfoPCRel) {
-          // If the reference to the type info 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.
-          SmallString<64> Name;
-          raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix()
-            << "typeinforef_addr" << Asm->getFunctionNumber() << "_" << Index;
-          MCSymbol *DotSym = Asm->OutContext.GetOrCreateSymbol(Name.str());
-          Asm->OutStreamer.EmitLabel(DotSym);
-
-          TypeInfoRef =
-            MCBinaryExpr::CreateSub(TypeInfoRef,
-                                    MCSymbolRefExpr::Create(DotSym,
-                                                            Asm->OutContext),
-                                    Asm->OutContext);
-        }
+        if (!IsTypeInfoPCRel)
+          TypeInfoRef = CreateLabelDiff(TypeInfoRef, "typeinforef_addr", Index);
 
         O << MAI->getData32bitsDirective();
         TypeInfoRef->print(O, MAI);
index f6f5025..7e89876 100644 (file)
@@ -25,6 +25,7 @@ namespace llvm {
 struct LandingPadInfo;
 class MachineModuleInfo;
 class MCAsmInfo;
+class MCExpr;
 class Timer;
 class raw_ostream;
 
@@ -168,6 +169,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.