diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h
index ad4f431..250b69b 100644
--- a/include/llvm/Target/TargetAsmInfo.h
+++ b/include/llvm/Target/TargetAsmInfo.h
@@ -24,15 +24,6 @@
   template <typename T> class SmallVectorImpl;
   class TargetMachine;
   
-  // DWARF encoding query type
-  namespace DwarfEncoding {
-    enum Target {
-      Data       = 0,
-      CodeLabels = 1,
-      Functions  = 2
-    };
-  }
-
   /// TargetAsmInfo - This class is intended to be used as a base class for asm
   /// properties and features specific to the target.
   class TargetAsmInfo {
@@ -429,11 +420,8 @@
     virtual unsigned getInlineAsmLength(const char *Str) const;
 
     /// PreferredEHDataFormat - This hook allows the target to select data
-    /// format used for encoding pointers in exception handling data. Reason is
-    /// 0 for data, 1 for code labels, 2 for function pointers. Global is true
-    /// if the symbol can be relocated.
-    virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
-                                           bool Global) const;
+    /// format used for encoding pointers in exception handling data.
+    virtual unsigned PreferredEHDataFormat() const;
 
 
     /// getSLEB128Size - Compute the number of bytes required for a signed
diff --git a/lib/CodeGen/AsmPrinter/DwarfException.cpp b/lib/CodeGen/AsmPrinter/DwarfException.cpp
index 49512a3..a05bbb2 100644
--- a/lib/CodeGen/AsmPrinter/DwarfException.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfException.cpp
@@ -557,7 +557,7 @@
 #if 0
   // FIXME: This should default to what the system wants, not just "absptr".
   if (!TypeInfos.empty() || !FilterIds.empty()) {
-    Asm->EmitInt8(TAI->PreferredEHDataFormat(DwarfEncoding::Data, true));
+    Asm->EmitInt8(TAI->PreferredEHDataFormat());
     // FIXME: The comment here should correspond with what PreferredEHDataFormat
     // returned.
     Asm->EOL("TType format (DW_EH_PE_xxxxx)");
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp
index e71bd01..4c6100b 100644
--- a/lib/Target/TargetAsmInfo.cpp
+++ b/lib/Target/TargetAsmInfo.cpp
@@ -148,8 +148,7 @@
   return Length;
 }
 
-unsigned TargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
-                                              bool Global) const {
+unsigned TargetAsmInfo::PreferredEHDataFormat() const {
   return dwarf::DW_EH_PE_absptr;
 }
 
diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp
index 3223f3c..09adc43 100644
--- a/lib/Target/X86/X86TargetAsmInfo.cpp
+++ b/lib/Target/X86/X86TargetAsmInfo.cpp
@@ -91,19 +91,10 @@
   DwarfExceptionSection = ".section __DATA,__gcc_except_tab";
 }
 
-unsigned
-X86DarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
-                                              bool Global) const {
+unsigned X86DarwinTargetAsmInfo::PreferredEHDataFormat() const {
   const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
-
-  if (Subtarget->getDarwinVers() > 9) {
-    if ((Reason == DwarfEncoding::Data || Reason == DwarfEncoding::Functions)
-        && Global)
-      return DW_EH_PE_pcrel | DW_EH_PE_indirect | DW_EH_PE_sdata4;
-
-    if (Reason == DwarfEncoding::CodeLabels || !Global)
-      return DW_EH_PE_pcrel;
-  }
+  if (Subtarget->getDarwinVers() > 9)
+    return DW_EH_PE_pcrel | DW_EH_PE_indirect | DW_EH_PE_sdata4;
 
   return DW_EH_PE_absptr;
 }
@@ -155,8 +146,7 @@
 }
 
 unsigned
-X86ELFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
-                                           bool Global) const {
+X86ELFTargetAsmInfo::PreferredEHDataFormat() const {
   CodeModel::Model CM = TM.getCodeModel();
   bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit();
 
@@ -171,32 +161,24 @@
       // - code model is small OR
       // - code model is medium and we're emitting externally visible symbols
       //   or any code symbols
-      if (CM == CodeModel::Small ||
-          (CM == CodeModel::Medium && (Global ||
-                                       Reason != DwarfEncoding::Data)))
+      if (CM == CodeModel::Small || CM == CodeModel::Medium)
         Format = DW_EH_PE_sdata4;
       else
         Format = DW_EH_PE_sdata8;
     }
 
-    if (Global)
-      Format |= DW_EH_PE_indirect;
-
+    Format |= DW_EH_PE_indirect;
     return (Format | DW_EH_PE_pcrel);
-  } else {
-    if (is64Bit &&
-        (CM == CodeModel::Small ||
-         (CM == CodeModel::Medium && Reason != DwarfEncoding::Data)))
-      return DW_EH_PE_udata4;
-    else
-      return DW_EH_PE_absptr;
   }
+  
+  if (is64Bit && CM == CodeModel::Small)
+    return DW_EH_PE_udata4;
+  return DW_EH_PE_absptr;
 }
 
 
 unsigned
-X86COFFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
-                                            bool Global) const {
+X86COFFTargetAsmInfo::PreferredEHDataFormat() const {
   CodeModel::Model CM = TM.getCodeModel();
   bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit();
 
@@ -211,23 +193,17 @@
       // - code model is small OR
       // - code model is medium and we're emitting externally visible symbols
       //   or any code symbols
-      if (CM == CodeModel::Small ||
-          (CM == CodeModel::Medium && (Global ||
-                                       Reason != DwarfEncoding::Data)))
+      if (CM == CodeModel::Small || CM == CodeModel::Medium)
         Format = DW_EH_PE_sdata4;
       else
         Format = DW_EH_PE_sdata8;
     }
 
-    if (Global)
-      Format |= DW_EH_PE_indirect;
-
+    Format |= DW_EH_PE_indirect;
     return (Format | DW_EH_PE_pcrel);
   }
   
-  if (is64Bit &&
-      (CM == CodeModel::Small ||
-       (CM == CodeModel::Medium && Reason != DwarfEncoding::Data)))
+  if (is64Bit && CM == CodeModel::Small)
     return DW_EH_PE_udata4;
   return DW_EH_PE_absptr;
 }
diff --git a/lib/Target/X86/X86TargetAsmInfo.h b/lib/Target/X86/X86TargetAsmInfo.h
index 9b4e809..3cc0271 100644
--- a/lib/Target/X86/X86TargetAsmInfo.h
+++ b/lib/Target/X86/X86TargetAsmInfo.h
@@ -37,22 +37,19 @@
 
   struct X86DarwinTargetAsmInfo : public X86TargetAsmInfo<DarwinTargetAsmInfo> {
     explicit X86DarwinTargetAsmInfo(const X86TargetMachine &TM);
-    virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
-                                           bool Global) const;
+    virtual unsigned PreferredEHDataFormat() const;
     virtual const char *getEHGlobalPrefix() const;
   };
 
   struct X86ELFTargetAsmInfo : public X86TargetAsmInfo<ELFTargetAsmInfo> {
     explicit X86ELFTargetAsmInfo(const X86TargetMachine &TM);
-    virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
-                                           bool Global) const;
+    virtual unsigned PreferredEHDataFormat() const;
   };
 
   struct X86COFFTargetAsmInfo : public X86TargetAsmInfo<COFFTargetAsmInfo> {
     explicit X86COFFTargetAsmInfo(const X86TargetMachine &TM) :
       X86TargetAsmInfo<COFFTargetAsmInfo>(TM) {}
-    virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
-                                           bool Global) const;
+    virtual unsigned PreferredEHDataFormat() const;
   };
   
 
