[llvm-commits] [llvm-gcc-4.2] r104181 - in /llvm-gcc-4.2/trunk/gcc: cp/cp-lang.c langhooks-def.h langhooks.h llvm-convert.cpp

Bill Wendling isanbard at gmail.com
Wed May 19 16:33:04 PDT 2010


Author: void
Date: Wed May 19 18:33:04 2010
New Revision: 104181

URL: http://llvm.org/viewvc/llvm-project?rev=104181&view=rev
Log:
Add a language hook that returns "true" if the function decl is a "thunk". If it
is, then we want to mark it as having "weak ODR" linkage, not just "weak".

Modified:
    llvm-gcc-4.2/trunk/gcc/cp/cp-lang.c
    llvm-gcc-4.2/trunk/gcc/langhooks-def.h
    llvm-gcc-4.2/trunk/gcc/langhooks.h
    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp

Modified: llvm-gcc-4.2/trunk/gcc/cp/cp-lang.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/cp/cp-lang.c?rev=104181&r1=104180&r2=104181&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/cp/cp-lang.c (original)
+++ llvm-gcc-4.2/trunk/gcc/cp/cp-lang.c Wed May 19 18:33:04 2010
@@ -36,20 +36,26 @@
 
 enum c_language_kind c_language = clk_cxx;
 static void cp_init_ts (void);
+/* LLVM LOCAL <rdar://problem/7929157> */
+static bool cp_function_thunk_p (tree fndecl);
 
 /* Lang hooks common to C++ and ObjC++ are declared in cp/cp-objcp-common.h;
    consequently, there should be very few hooks below.  */
 
 #undef LANG_HOOKS_NAME
-#define LANG_HOOKS_NAME "GNU C++"
+#define LANG_HOOKS_NAME                 "GNU C++"
 #undef LANG_HOOKS_INIT
-#define LANG_HOOKS_INIT cxx_init
+#define LANG_HOOKS_INIT                 cxx_init
 #undef LANG_HOOKS_DECL_PRINTABLE_NAME
 #define LANG_HOOKS_DECL_PRINTABLE_NAME	cxx_printable_name
 #undef LANG_HOOKS_FOLD_OBJ_TYPE_REF
-#define LANG_HOOKS_FOLD_OBJ_TYPE_REF cp_fold_obj_type_ref
+#define LANG_HOOKS_FOLD_OBJ_TYPE_REF    cp_fold_obj_type_ref
 #undef LANG_HOOKS_INIT_TS
-#define LANG_HOOKS_INIT_TS cp_init_ts
+#define LANG_HOOKS_INIT_TS              cp_init_ts
+/* LLVM LOCAL begin <rdar://problem/7929157> */
+#undef LANG_HOOKS_FUNCTION_THUNK_P
+#define LANG_HOOKS_FUNCTION_THUNK_P     cp_function_thunk_p
+/* LLVM LOCAL end <rdar://problem/7929157> */
 
 /* Each front end provides its own lang hook initializer.  */
 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
@@ -145,6 +151,14 @@
 
 }
 
+/* LLVM LOCAL begin <rdar://problem/7929157> */
+bool
+cp_function_thunk_p (tree fndecl)
+{
+  return DECL_THUNK_P (fndecl);
+}
+/* LLVM LOCAL end <rdar://problem/7929157> */
+
 void
 finish_file (void)
 {

Modified: llvm-gcc-4.2/trunk/gcc/langhooks-def.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/langhooks-def.h?rev=104181&r1=104180&r2=104181&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/langhooks-def.h (original)
+++ llvm-gcc-4.2/trunk/gcc/langhooks-def.h Wed May 19 18:33:04 2010
@@ -156,6 +156,9 @@
 #define LANG_HOOKS_FUNCTION_LEAVE_NESTED lhd_do_nothing_f
 #define LANG_HOOKS_FUNCTION_MISSING_NORETURN_OK_P hook_bool_tree_true
 
+/* LLVM LOCAL <rdar://problem/7929157> */
+#define LANG_HOOKS_FUNCTION_THUNK_P     hook_bool_tree_false
+
 /* APPLE LOCAL begin radar 6353006  */
 #define LANG_HOOKS_BUILD_GENERIC_BLOCK_STRUCT_TYPE \
   lhd_build_generic_block_struct_type
@@ -303,64 +306,66 @@
 }
 
 /* The whole thing.  The structure is defined in langhooks.h.  */
-#define LANG_HOOKS_INITIALIZER { \
-  LANG_HOOKS_NAME, \
-  LANG_HOOKS_IDENTIFIER_SIZE, \
-  LANG_HOOKS_TREE_SIZE, \
-  LANG_HOOKS_INIT_OPTIONS, \
-  LANG_HOOKS_INITIALIZE_DIAGNOSTICS, \
-  LANG_HOOKS_HANDLE_OPTION, \
-  LANG_HOOKS_MISSING_ARGUMENT, \
-  LANG_HOOKS_POST_OPTIONS, \
-  LANG_HOOKS_INIT, \
-  LANG_HOOKS_FINISH, \
-  LANG_HOOKS_PARSE_FILE, \
-  LANG_HOOKS_CLEAR_BINDING_STACK, \
-  LANG_HOOKS_GET_ALIAS_SET, \
-  LANG_HOOKS_EXPAND_CONSTANT, \
-  LANG_HOOKS_EXPAND_EXPR, \
-  LANG_HOOKS_EXPAND_DECL, \
-  LANG_HOOKS_SAFE_FROM_P, \
-  LANG_HOOKS_FINISH_INCOMPLETE_DECL, \
-  LANG_HOOKS_MARK_ADDRESSABLE, \
-  LANG_HOOKS_STATICP, \
-  LANG_HOOKS_DUP_LANG_SPECIFIC_DECL, \
-  LANG_HOOKS_SET_DECL_ASSEMBLER_NAME, \
-  LANG_HOOKS_CAN_USE_BIT_FIELDS_P, \
-  LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS, \
-  LANG_HOOKS_NO_BODY_BLOCKS, \
-  LANG_HOOKS_PRINT_STATISTICS, \
-  LANG_HOOKS_PRINT_XNODE, \
-  LANG_HOOKS_PRINT_DECL, \
-  LANG_HOOKS_PRINT_TYPE, \
-  LANG_HOOKS_PRINT_IDENTIFIER, \
-  LANG_HOOKS_DECL_PRINTABLE_NAME, \
-  LANG_HOOKS_DWARF_NAME, \
-  LANG_HOOKS_TYPES_COMPATIBLE_P, \
-  LANG_HOOKS_GET_CALLEE_FNDECL, \
-  LANG_HOOKS_PRINT_ERROR_FUNCTION, \
-  LANG_HOOKS_EXPR_SIZE, \
-/* LLVM LOCAL 7659636 */ \
-  LANG_HOOKS_EMPTY_TYPE_P, \
-  LANG_HOOKS_TO_TARGET_CHARSET, \
-  LANG_HOOKS_ATTRIBUTE_TABLE, \
-  LANG_HOOKS_COMMON_ATTRIBUTE_TABLE, \
-  LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE, \
-/* APPLE LOCAL kext identify vtables */ \
-  LANG_HOOKS_VTABLE_P, \
-  LANG_HOOKS_FUNCTION_INITIALIZER, \
-  LANG_HOOKS_TREE_INLINING_INITIALIZER, \
-  LANG_HOOKS_CALLGRAPH_INITIALIZER, \
-  LANG_HOOKS_TREE_DUMP_INITIALIZER, \
-  LANG_HOOKS_DECLS, \
-  LANG_HOOKS_FOR_TYPES_INITIALIZER, \
-  LANG_HOOKS_GIMPLIFY_EXPR, \
-  LANG_HOOKS_FOLD_OBJ_TYPE_REF, \
-  LANG_HOOKS_BUILTIN_FUNCTION, \
-  LANG_HOOKS_INIT_TS,          \
-  LANG_HOOKS_EXPR_TO_DECL, \
-/* APPLE LOCAL radar 6353006  */ \
-  LANG_HOOKS_BUILD_GENERIC_BLOCK_STRUCT_TYPE, \
+#define LANG_HOOKS_INITIALIZER {                        \
+    LANG_HOOKS_NAME,                                    \
+      LANG_HOOKS_IDENTIFIER_SIZE,                       \
+      LANG_HOOKS_TREE_SIZE,                             \
+      LANG_HOOKS_INIT_OPTIONS,                          \
+      LANG_HOOKS_INITIALIZE_DIAGNOSTICS,                \
+      LANG_HOOKS_HANDLE_OPTION,                         \
+      LANG_HOOKS_MISSING_ARGUMENT,                      \
+      LANG_HOOKS_POST_OPTIONS,                          \
+      LANG_HOOKS_INIT,                                  \
+      LANG_HOOKS_FINISH,                                \
+      LANG_HOOKS_PARSE_FILE,                            \
+      LANG_HOOKS_CLEAR_BINDING_STACK,                   \
+      LANG_HOOKS_GET_ALIAS_SET,                         \
+      LANG_HOOKS_EXPAND_CONSTANT,                       \
+      LANG_HOOKS_EXPAND_EXPR,                           \
+      LANG_HOOKS_EXPAND_DECL,                           \
+      LANG_HOOKS_SAFE_FROM_P,                           \
+      LANG_HOOKS_FINISH_INCOMPLETE_DECL,                \
+      LANG_HOOKS_MARK_ADDRESSABLE,                      \
+      LANG_HOOKS_STATICP,                               \
+      LANG_HOOKS_DUP_LANG_SPECIFIC_DECL,                \
+      LANG_HOOKS_SET_DECL_ASSEMBLER_NAME,               \
+      LANG_HOOKS_CAN_USE_BIT_FIELDS_P,                  \
+      LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS,           \
+      LANG_HOOKS_NO_BODY_BLOCKS,                        \
+      LANG_HOOKS_PRINT_STATISTICS,                      \
+      LANG_HOOKS_PRINT_XNODE,                           \
+      LANG_HOOKS_PRINT_DECL,                            \
+      LANG_HOOKS_PRINT_TYPE,                            \
+      LANG_HOOKS_PRINT_IDENTIFIER,                      \
+      LANG_HOOKS_DECL_PRINTABLE_NAME,                   \
+      LANG_HOOKS_DWARF_NAME,                            \
+      LANG_HOOKS_TYPES_COMPATIBLE_P,                    \
+      LANG_HOOKS_GET_CALLEE_FNDECL,                     \
+      LANG_HOOKS_PRINT_ERROR_FUNCTION,                  \
+      LANG_HOOKS_EXPR_SIZE,                             \
+      /* LLVM LOCAL 7659636 */                          \
+      LANG_HOOKS_EMPTY_TYPE_P,                          \
+      LANG_HOOKS_TO_TARGET_CHARSET,                     \
+      LANG_HOOKS_ATTRIBUTE_TABLE,                       \
+      LANG_HOOKS_COMMON_ATTRIBUTE_TABLE,                \
+      LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE,                \
+      /* APPLE LOCAL kext identify vtables */           \
+      LANG_HOOKS_VTABLE_P,                              \
+      LANG_HOOKS_FUNCTION_INITIALIZER,                  \
+      LANG_HOOKS_TREE_INLINING_INITIALIZER,             \
+      LANG_HOOKS_CALLGRAPH_INITIALIZER,                 \
+      LANG_HOOKS_TREE_DUMP_INITIALIZER,                 \
+      LANG_HOOKS_DECLS,                                 \
+      LANG_HOOKS_FOR_TYPES_INITIALIZER,                 \
+      LANG_HOOKS_GIMPLIFY_EXPR,                         \
+      LANG_HOOKS_FOLD_OBJ_TYPE_REF,                     \
+      LANG_HOOKS_BUILTIN_FUNCTION,                      \
+      LANG_HOOKS_INIT_TS,                               \
+      LANG_HOOKS_EXPR_TO_DECL,                          \
+      /* APPLE LOCAL radar 6353006  */                  \
+      LANG_HOOKS_BUILD_GENERIC_BLOCK_STRUCT_TYPE,       \
+      /* LLVM LOCAL <rdar://problem/7929157> */         \
+      LANG_HOOKS_FUNCTION_THUNK_P,                      \
 }
 
 #endif /* GCC_LANG_HOOKS_DEF_H */

Modified: llvm-gcc-4.2/trunk/gcc/langhooks.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/langhooks.h?rev=104181&r1=104180&r2=104181&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/langhooks.h (original)
+++ llvm-gcc-4.2/trunk/gcc/langhooks.h Wed May 19 18:33:04 2010
@@ -479,13 +479,17 @@
      TREE_SIDE_EFFECTS need updating.  */
   tree (*expr_to_decl) (tree expr, bool *tc, bool *ti, bool *se);
 
-
   /* APPLE LOCAL begin radar 6353006  */
   /*  For c-based languages, builds a generic type for Blocks pointers (for
       emitting debug information.  For other languages, returns NULL.  */
   tree (*build_generic_block_struct_type) (void);
   /* APPLE LOCAL end radar 6353006  */
 
+  /* LLVM LOCAL begin <rdar://problem/7929157> */
+  /* Returns true if the function decl is a thunk.  */
+  bool (*function_is_thunk_p) (tree fndecl);
+  /* LLVM LOCAL end <rdar://problem/7929157> */
+
   /* Whenever you add entries here, make sure you adjust langhooks-def.h
      and langhooks.c accordingly.  */
 };

Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=104181&r1=104180&r2=104181&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Wed May 19 18:33:04 2010
@@ -527,7 +527,7 @@
 
   // The function should not already have a body.
   assert(Fn->empty() && "Function expanded multiple times!");
-  
+
   // Compute the linkage that the function should get.
   if (DECL_LLVM_PRIVATE(FnDecl)) {
     Fn->setLinkage(Function::PrivateLinkage);
@@ -540,10 +540,10 @@
     Fn->setLinkage(Function::AvailableExternallyLinkage);
   } else if (DECL_COMDAT(FnDecl)) {
     Fn->setLinkage(Function::getLinkOnceLinkage(flag_odr));
-  } else if (DECL_WEAK(FnDecl)) {
+  } else if (DECL_WEAK(FnDecl) && !lang_hooks.function_is_thunk_p (FnDecl)) {
     // The user may have explicitly asked for weak linkage - ignore flag_odr.
     Fn->setLinkage(Function::WeakAnyLinkage);
-  } else if (DECL_ONE_ONLY(FnDecl)) {
+  } else if (DECL_ONE_ONLY(FnDecl) || lang_hooks.function_is_thunk_p (FnDecl)) {
     Fn->setLinkage(Function::getWeakLinkage(flag_odr));
   } else if (IS_EXTERN_INLINE(FnDecl)) {
     // gcc "extern inline", C99 "inline"





More information about the llvm-commits mailing list