From 85e8cda14b07245936eea50e07a09697d2fd3d6d Mon Sep 17 00:00:00 2001
From: Logan Chien <loganchien@google.com>
Date: Wed, 5 Sep 2012 23:37:51 +0800
Subject: [PATCH 2/2] Fix ARM EHABI exception support.

---
 llvm-3.1/lib/CodeGen/AsmPrinter/ARMException.cpp   |   36 ++++++++++++++------
 llvm-3.1/lib/CodeGen/AsmPrinter/DwarfException.cpp |   15 +++++---
 llvm-3.1/lib/CodeGen/AsmPrinter/DwarfException.h   |    6 +++
 .../tools/clang/include/clang/Driver/Options.td    |    1 +
 llvm-3.1/tools/clang/lib/Driver/Tools.cpp          |    8 ++++
 5 files changed, 50 insertions(+), 16 deletions(-)

diff --git a/llvm-3.1/lib/CodeGen/AsmPrinter/ARMException.cpp b/llvm-3.1/lib/CodeGen/AsmPrinter/ARMException.cpp
index b60fda8..9e2f59e 100644
--- a/llvm-3.1/lib/CodeGen/AsmPrinter/ARMException.cpp
+++ b/llvm-3.1/lib/CodeGen/AsmPrinter/ARMException.cpp
@@ -71,24 +71,38 @@ void ARMException::EndFunction() {
     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_end",
                                                   Asm->getFunctionNumber()));
 
-    // Emit references to personality.
-    if (const Function * Personality =
-        MMI->getPersonalities()[MMI->getPersonalityIndex()]) {
-      MCSymbol *PerSym = Asm->Mang->getSymbol(Personality);
-      Asm->OutStreamer.EmitSymbolAttribute(PerSym, MCSA_Global);
-      Asm->OutStreamer.EmitPersonality(PerSym);
-    }
-
     if (EnableARMEHABIDescriptors) {
       // Map all labels and get rid of any dead landing pads.
       MMI->TidyLandingPads();
 
-      Asm->OutStreamer.EmitHandlerData();
+      const std::vector<LandingPadInfo> &PadInfos = MMI->getLandingPads();
+
+      if (!PadInfos.empty()) {
+        // Emit references to personality.
+        if (const Function * Personality =
+            MMI->getPersonalities()[MMI->getPersonalityIndex()]) {
+          MCSymbol *PerSym = Asm->Mang->getSymbol(Personality);
+          Asm->OutStreamer.EmitSymbolAttribute(PerSym, MCSA_Global);
+          Asm->OutStreamer.EmitPersonality(PerSym);
+        }
+
+        // Emit .handlerdata directive.
+        Asm->OutStreamer.EmitHandlerData();
 
-      // Emit actual exception table
-      EmitExceptionTable();
+        // Emit actual exception table
+        EmitExceptionTable();
+      }
     }
   }
 
   Asm->OutStreamer.EmitFnEnd();
 }
+
+void ARMException::EmitTypeInfoReference(const GlobalVariable *GV,
+                                         unsigned TTypeEncoding) {
+  if (GV) {
+    Asm->OutStreamer.EmitRawText("\t.word\t" + GV->getName() + "(TARGET2)\n");
+  } else {
+    Asm->OutStreamer.EmitRawText(Twine("\t.word\t0\n"));
+  }
+}
diff --git a/llvm-3.1/lib/CodeGen/AsmPrinter/DwarfException.cpp b/llvm-3.1/lib/CodeGen/AsmPrinter/DwarfException.cpp
index 70cc2e5..7d58102 100644
--- a/llvm-3.1/lib/CodeGen/AsmPrinter/DwarfException.cpp
+++ b/llvm-3.1/lib/CodeGen/AsmPrinter/DwarfException.cpp
@@ -684,11 +684,7 @@ void DwarfException::EmitExceptionTable() {
     const GlobalVariable *GV = *I;
     if (VerboseAsm)
       Asm->OutStreamer.AddComment("TypeInfo " + Twine(Entry--));
-    if (GV)
-      Asm->EmitReference(GV, TTypeEncoding);
-    else
-      Asm->OutStreamer.EmitIntValue(0,Asm->GetSizeOfEncodedValue(TTypeEncoding),
-                                    0);
+    EmitTypeInfoReference(GV, TTypeEncoding);
   }
 
   // Emit the Exception Specifications.
@@ -712,6 +708,15 @@ void DwarfException::EmitExceptionTable() {
   Asm->EmitAlignment(2);
 }
 
+void DwarfException::EmitTypeInfoReference(const GlobalVariable *GV,
+                                           unsigned TTypeEncoding) {
+  if (GV)
+    Asm->EmitReference(GV, TTypeEncoding);
+  else
+    Asm->OutStreamer.EmitIntValue(0,Asm->GetSizeOfEncodedValue(TTypeEncoding),
+                                  0);
+}
+
 /// EndModule - Emit all exception information that should come after the
 /// content.
 void DwarfException::EndModule() {
diff --git a/llvm-3.1/lib/CodeGen/AsmPrinter/DwarfException.h b/llvm-3.1/lib/CodeGen/AsmPrinter/DwarfException.h
index b5f86ab..f361d36 100644
--- a/llvm-3.1/lib/CodeGen/AsmPrinter/DwarfException.h
+++ b/llvm-3.1/lib/CodeGen/AsmPrinter/DwarfException.h
@@ -138,6 +138,9 @@ public:
 
   /// EndFunction - Gather and emit post-function exception information.
   virtual void EndFunction();
+
+  virtual void EmitTypeInfoReference(const GlobalVariable *GV,
+                                     unsigned TTypeEncoding);
 };
 
 class DwarfCFIException : public DwarfException {
@@ -203,6 +206,9 @@ public:
 
   /// EndFunction - Gather and emit post-function exception information.
   virtual void EndFunction();
+
+  virtual void EmitTypeInfoReference(const GlobalVariable *GV,
+                                     unsigned TTypeEncoding);
 };
 
 class Win64Exception : public DwarfException {
diff --git a/llvm-3.1/tools/clang/include/clang/Driver/Options.td b/llvm-3.1/tools/clang/include/clang/Driver/Options.td
index 6d138b0..3a31ea1 100644
--- a/llvm-3.1/tools/clang/include/clang/Driver/Options.td
+++ b/llvm-3.1/tools/clang/include/clang/Driver/Options.td
@@ -651,6 +651,7 @@ def mno_thumb : Flag<"-mno-thumb">, Group<m_Group>;
 def marm : Flag<"-marm">, Alias<mno_thumb>;
 
 def mignore_has_ras : Flag<"-mignore-has-ras">;
+def mehabi : Flag<"-mehabi">;
 
 def mno_warn_nonportable_cfstrings : Flag<"-mno-warn-nonportable-cfstrings">, Group<m_Group>;
 def mno_omit_leaf_frame_pointer : Flag<"-mno-omit-leaf-frame-pointer">, Group<f_Group>;
diff --git a/llvm-3.1/tools/clang/lib/Driver/Tools.cpp b/llvm-3.1/tools/clang/lib/Driver/Tools.cpp
index 2958393..b69e838 100644
--- a/llvm-3.1/tools/clang/lib/Driver/Tools.cpp
+++ b/llvm-3.1/tools/clang/lib/Driver/Tools.cpp
@@ -756,6 +756,14 @@ void Clang::AddARMTargetArgs(const ArgList &Args,
       CmdArgs.push_back("-mno-global-merge");
   }
 
+  if (Args.hasArg(options::OPT_mehabi)) {
+    CmdArgs.push_back("-backend-option");
+    CmdArgs.push_back("-arm-enable-ehabi");
+
+    CmdArgs.push_back("-backend-option");
+    CmdArgs.push_back("-arm-enable-ehabi-descriptors");
+  }
+
   if (Args.hasArg(options::OPT_mignore_has_ras)) {
     CmdArgs.push_back("-backend-option");
     CmdArgs.push_back("-arm-ignore-has-ras");
-- 
1.7.7.3