Do not look here for elegance.
authorChris Lattner <sabre@nondot.org>
Fri, 3 Dec 2004 07:16:51 +0000 (07:16 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 3 Dec 2004 07:16:51 +0000 (07:16 +0000)
This fixes the ugly darwin "cannot find symbols starting with __" issue.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18454 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/JIT/Intercept.cpp

index 93d349ffa5d8e72245d9c25dba85afb07e7b8b09..669b6bad778959f7481ab892410c40f3742f0f61 100644 (file)
@@ -99,6 +99,30 @@ void *JIT::getPointerToNamedFunction(const std::string &Name) {
   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();