[llvm-commits] CVS: llvm/lib/ExecutionEngine/JIT/Intercept.cpp

Chris Lattner lattner at cs.uiuc.edu
Thu Dec 2 23:17:05 PST 2004



Changes in directory llvm/lib/ExecutionEngine/JIT:

Intercept.cpp updated: 1.18 -> 1.19
---
Log message:

Do not look here for elegance.

This fixes the ugly darwin "cannot find symbols starting with __" issue.

Thanks for Owen/resistor for testing this out for me.


---
Diffs of the changes:  (+24 -0)

Index: llvm/lib/ExecutionEngine/JIT/Intercept.cpp
diff -u llvm/lib/ExecutionEngine/JIT/Intercept.cpp:1.18 llvm/lib/ExecutionEngine/JIT/Intercept.cpp:1.19
--- llvm/lib/ExecutionEngine/JIT/Intercept.cpp:1.18	Mon Nov 29 08:11:29 2004
+++ llvm/lib/ExecutionEngine/JIT/Intercept.cpp	Fri Dec  3 01:16:51 2004
@@ -99,6 +99,30 @@
   void *Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(Name);
   if (Ptr) return Ptr;
 
+  // If this is darwin, it has some funky issues, try to solve them here.  Some
+  // important symbols are marked 'private external' which doesn't allow
+  // SearchForAddressOfSymbol to find them.  As such, we special case them here,
+  // there is only a small handful of them.
+#ifdef __APPLE__
+  {
+    extern void *__ashldi3;    if (Name == "__ashldi3")    return &__ashldi3;
+    extern void *__ashrdi3;    if (Name == "__ashrdi3")    return &__ashrdi3;
+    extern void *__cmpdi2;     if (Name == "__cmpdi2")     return &__cmpdi2;
+    extern void *__divdi3;     if (Name == "__divdi3")     return &__divdi3;
+    extern void *__eprintf;    if (Name == "__eprintf")    return &__eprintf;
+    extern void *__fixdfdi;    if (Name == "__fixdfdi")    return &__fixdfdi;
+    extern void *__fixsfdi;    if (Name == "__fixsfdi")    return &__fixsfdi;
+    extern void *__fixunsdfdi; if (Name == "__fixunsdfdi") return &__fixunsdfdi;
+    extern void *__fixunssfdi; if (Name == "__fixunssfdi") return &__fixunssfdi;
+    extern void *__floatdidf;  if (Name == "__floatdidf")  return &__floatdidf;
+    extern void *__floatdisf;  if (Name == "__floatdisf")  return &__floatdisf;
+    extern void *__lshrdi3;    if (Name == "__lshrdi3")    return &__lshrdi3;
+    extern void *__moddi3;     if (Name == "__moddi3")     return &__moddi3;
+    extern void *__udivdi3;    if (Name == "__udivdi3")    return &__udivdi3;
+    extern void *__umoddi3;    if (Name == "__umoddi3")    return &__umoddi3;
+  }
+#endif
+
   std::cerr << "ERROR: Program used external function '" << Name
             << "' which could not be resolved!\n";
   abort();






More information about the llvm-commits mailing list