[cfe-commits] r124834 - in /cfe/trunk: include/clang/Basic/DiagnosticDriverKinds.td lib/CodeGen/CodeGenModule.cpp lib/Frontend/CompilerInvocation.cpp test/CodeGenCXX/apple-kext-linkage.C

Fariborz Jahanian fjahanian at apple.com
Thu Feb 3 16:01:24 PST 2011


Author: fjahanian
Date: Thu Feb  3 18:01:24 2011
New Revision: 124834

URL: http://llvm.org/viewvc/llvm-project?rev=124834&view=rev
Log:
-fapple-kext cannot have 'weak' visibility in this
abi.

Added:
    cfe/trunk/test/CodeGenCXX/apple-kext-linkage.C
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
    cfe/trunk/lib/Frontend/CompilerInvocation.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=124834&r1=124833&r2=124834&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Thu Feb  3 18:01:24 2011
@@ -77,6 +77,8 @@
 def err_drv_preamble_format : Error<
     "incorrect format for -preamble-bytes=N,END">;
 
+def warn_c_kext : Warning<
+  "ignoring -fapple-kext which is valid for c++ and objective-c++ only">;
 def warn_drv_unsupported_option_argument : Warning<
   "ignoring unsupported argument '%1' to option '%0'">;
 def warn_drv_input_file_unused : Warning<

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=124834&r1=124833&r2=124834&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Thu Feb  3 18:01:24 2011
@@ -374,7 +374,9 @@
   // In C99 mode, 'inline' functions are guaranteed to have a strong
   // definition somewhere else, so we can use available_externally linkage.
   if (Linkage == GVA_C99Inline)
-    return llvm::Function::AvailableExternallyLinkage;
+    return !Context.getLangOptions().AppleKext
+             ? llvm::Function::AvailableExternallyLinkage
+             : llvm::Function::InternalLinkage;
   
   // In C++, the compiler has to emit a definition in every translation unit
   // that references the function.  We should use linkonce_odr because
@@ -383,14 +385,18 @@
   // merged with other definitions. c) C++ has the ODR, so we know the
   // definition is dependable.
   if (Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation)
-    return llvm::Function::LinkOnceODRLinkage;
+    return !Context.getLangOptions().AppleKext 
+             ? llvm::Function::LinkOnceODRLinkage 
+             : llvm::Function::InternalLinkage;
   
   // An explicit instantiation of a template has weak linkage, since
   // explicit instantiations can occur in multiple translation units
   // and must all be equivalent. However, we are not allowed to
   // throw away these explicit instantiations.
   if (Linkage == GVA_ExplicitTemplateInstantiation)
-    return llvm::Function::WeakODRLinkage;
+    return !Context.getLangOptions().AppleKext
+             ? llvm::Function::WeakODRLinkage
+             : llvm::Function::InternalLinkage;
   
   // Otherwise, we have strong external linkage.
   assert(Linkage == GVA_StrongExternal);
@@ -1089,21 +1095,29 @@
           return llvm::GlobalVariable::AvailableExternallyLinkage;
 
         if (KeyFunction->isInlined())
-          return llvm::GlobalVariable::LinkOnceODRLinkage;
+          return !Context.getLangOptions().AppleKext ?
+                   llvm::GlobalVariable::LinkOnceODRLinkage :
+                   llvm::Function::InternalLinkage;
         
         return llvm::GlobalVariable::ExternalLinkage;
         
       case TSK_ImplicitInstantiation:
-        return llvm::GlobalVariable::LinkOnceODRLinkage;
+        return !Context.getLangOptions().AppleKext ?
+                 llvm::GlobalVariable::LinkOnceODRLinkage :
+                 llvm::Function::InternalLinkage;
 
       case TSK_ExplicitInstantiationDefinition:
-        return llvm::GlobalVariable::WeakODRLinkage;
+        return !Context.getLangOptions().AppleKext ?
+                 llvm::GlobalVariable::WeakODRLinkage :
+                 llvm::Function::InternalLinkage;
   
       case TSK_ExplicitInstantiationDeclaration:
         // FIXME: Use available_externally linkage. However, this currently
         // breaks LLVM's build due to undefined symbols.
         //      return llvm::GlobalVariable::AvailableExternallyLinkage;
-        return llvm::GlobalVariable::LinkOnceODRLinkage;
+        return !Context.getLangOptions().AppleKext ?
+                 llvm::GlobalVariable::LinkOnceODRLinkage :
+                 llvm::Function::InternalLinkage;
     }
   }
   
@@ -1111,20 +1125,23 @@
   case TSK_Undeclared:
   case TSK_ExplicitSpecialization:
   case TSK_ImplicitInstantiation:
-    return llvm::GlobalVariable::LinkOnceODRLinkage;
-
-  case TSK_ExplicitInstantiationDefinition:
-    return llvm::GlobalVariable::WeakODRLinkage;
-    
-  case TSK_ExplicitInstantiationDeclaration:
     // FIXME: Use available_externally linkage. However, this currently
     // breaks LLVM's build due to undefined symbols.
     //   return llvm::GlobalVariable::AvailableExternallyLinkage;
-    return llvm::GlobalVariable::LinkOnceODRLinkage;
+  case TSK_ExplicitInstantiationDeclaration:
+    break;
+
+  case TSK_ExplicitInstantiationDefinition:
+    return !Context.getLangOptions().AppleKext ?
+             llvm::GlobalVariable::WeakODRLinkage :
+             llvm::Function::InternalLinkage;
+    
   }
   
   // Silence GCC warning.
-  return llvm::GlobalVariable::LinkOnceODRLinkage;
+  return !Context.getLangOptions().AppleKext ?
+           llvm::GlobalVariable::LinkOnceODRLinkage :
+           llvm::Function::InternalLinkage;
 }
 
 CharUnits CodeGenModule::GetTargetTypeStoreSize(const llvm::Type *Ty) const {

Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=124834&r1=124833&r2=124834&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Thu Feb  3 18:01:24 2011
@@ -1384,8 +1384,13 @@
   else if (Args.hasArg(OPT_fobjc_gc))
     Opts.setGCMode(LangOptions::HybridGC);
   
-  if (Args.hasArg(OPT_fapple_kext))
-    Opts.AppleKext = 1;
+  if (Args.hasArg(OPT_fapple_kext)) {
+    if (!Opts.CPlusPlus)
+      Diags.Report(diag::warn_c_kext);
+    else
+      Opts.AppleKext = 1;
+  }
+
   if (Args.hasArg(OPT_print_ivar_layout))
     Opts.ObjCGCBitmapPrint = 1;
   if (Args.hasArg(OPT_fno_constant_cfstrings))

Added: cfe/trunk/test/CodeGenCXX/apple-kext-linkage.C
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/apple-kext-linkage.C?rev=124834&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/apple-kext-linkage.C (added)
+++ cfe/trunk/test/CodeGenCXX/apple-kext-linkage.C Thu Feb  3 18:01:24 2011
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fapple-kext -emit-llvm -o - %s | FileCheck %s
+
+struct Base {
+  virtual ~Base();
+} ;
+
+struct Derived : Base {
+  void operator delete(void *) { }
+  Derived();
+};
+
+void foo() {
+  Derived d1;			// ok
+}
+
+inline unsigned f(unsigned n) { return n == 0 ? 0 : n + f(n-1); }
+
+unsigned g(unsigned n) { return f(n); }
+
+
+template <typename X> X ident(X x) { return x; }
+int foo(int n) { return ident(n); }
+
+// CHECK-NOT: define linkonce_odr
+// CHECK 5 : define internal





More information about the cfe-commits mailing list