[llvm-branch-commits] [llvm-gcc-branch] r106565 - in /llvm-gcc-4.2/branches/Apple/Troughton: ./ gcc/cp/cp-lang.c gcc/langhooks-def.h gcc/langhooks.h gcc/llvm-backend.cpp gcc/llvm-convert.cpp
Bill Wendling
isanbard at gmail.com
Tue Jun 22 13:04:04 PDT 2010
Author: void
Date: Tue Jun 22 15:04:04 2010
New Revision: 106565
URL: http://llvm.org/viewvc/llvm-project?rev=106565&view=rev
Log:
$ svn merge -c 106564 https://llvm.org/svn/llvm-project/llvm-gcc-4.2/trunk
--- Merging r106564 into '.':
U gcc/cp/cp-lang.c
U gcc/llvm-backend.cpp
U gcc/llvm-convert.cpp
U gcc/langhooks.h
U gcc/langhooks-def.h
Modified:
llvm-gcc-4.2/branches/Apple/Troughton/ (props changed)
llvm-gcc-4.2/branches/Apple/Troughton/gcc/cp/cp-lang.c
llvm-gcc-4.2/branches/Apple/Troughton/gcc/langhooks-def.h
llvm-gcc-4.2/branches/Apple/Troughton/gcc/langhooks.h
llvm-gcc-4.2/branches/Apple/Troughton/gcc/llvm-backend.cpp
llvm-gcc-4.2/branches/Apple/Troughton/gcc/llvm-convert.cpp
Propchange: llvm-gcc-4.2/branches/Apple/Troughton/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jun 22 15:04:04 2010
@@ -1 +1,2 @@
-/llvm-gcc-4.2/trunk:105535,106018,106044,106524
+/llvm/trunk:106564
+/llvm-gcc-4.2/trunk:105535,106018,106044,106524,106564
Modified: llvm-gcc-4.2/branches/Apple/Troughton/gcc/cp/cp-lang.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/branches/Apple/Troughton/gcc/cp/cp-lang.c?rev=106565&r1=106564&r2=106565&view=diff
==============================================================================
--- llvm-gcc-4.2/branches/Apple/Troughton/gcc/cp/cp-lang.c (original)
+++ llvm-gcc-4.2/branches/Apple/Troughton/gcc/cp/cp-lang.c Tue Jun 22 15:04:04 2010
@@ -38,6 +38,8 @@
static void cp_init_ts (void);
/* LLVM LOCAL <rdar://problem/7929157> */
static bool cp_function_thunk_p (tree fndecl);
+/* LLVM LOCAL <rdar://problem/8104369> */
+static tree cp_thunk_target (tree thunk);
/* Lang hooks common to C++ and ObjC++ are declared in cp/cp-objcp-common.h;
consequently, there should be very few hooks below. */
@@ -56,6 +58,10 @@
#undef LANG_HOOKS_FUNCTION_THUNK_P
#define LANG_HOOKS_FUNCTION_THUNK_P cp_function_thunk_p
/* LLVM LOCAL end <rdar://problem/7929157> */
+/* LLVM LOCAL begin <rdar://problem/8104369> */
+#undef LANG_HOOKS_THUNK_TARGET
+#define LANG_HOOKS_THUNK_TARGET cp_thunk_target
+/* LLVM LOCAL end <rdar://problem/8104369> */
/* Each front end provides its own lang hook initializer. */
const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
@@ -152,13 +158,21 @@
}
/* LLVM LOCAL begin <rdar://problem/7929157> */
-bool
+static bool
cp_function_thunk_p (tree fndecl)
{
return DECL_THUNK_P (fndecl);
}
/* LLVM LOCAL end <rdar://problem/7929157> */
+/* LLVM LOCAL begin <rdar://problem/8104369> */
+static tree
+cp_thunk_target (tree thunk)
+{
+ return THUNK_TARGET (thunk);
+}
+/* LLVM LOCAL begin <rdar://problem/8104369> */
+
void
finish_file (void)
{
Modified: llvm-gcc-4.2/branches/Apple/Troughton/gcc/langhooks-def.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/branches/Apple/Troughton/gcc/langhooks-def.h?rev=106565&r1=106564&r2=106565&view=diff
==============================================================================
--- llvm-gcc-4.2/branches/Apple/Troughton/gcc/langhooks-def.h (original)
+++ llvm-gcc-4.2/branches/Apple/Troughton/gcc/langhooks-def.h Tue Jun 22 15:04:04 2010
@@ -159,6 +159,9 @@
/* LLVM LOCAL <rdar://problem/7929157> */
#define LANG_HOOKS_FUNCTION_THUNK_P hook_bool_tree_false
+/* LLVM LOCAL <rdar://problem/8104369> */
+#define LANG_HOOKS_THUNK_TARGET lhd_return_null_tree
+
/* APPLE LOCAL begin radar 6353006 */
#define LANG_HOOKS_BUILD_GENERIC_BLOCK_STRUCT_TYPE \
lhd_build_generic_block_struct_type
@@ -366,6 +369,8 @@
LANG_HOOKS_BUILD_GENERIC_BLOCK_STRUCT_TYPE, \
/* LLVM LOCAL <rdar://problem/7929157> */ \
LANG_HOOKS_FUNCTION_THUNK_P, \
+ /* LLVM LOCAL <rdar://problem/8104369> */ \
+ LANG_HOOKS_THUNK_TARGET, \
}
#endif /* GCC_LANG_HOOKS_DEF_H */
Modified: llvm-gcc-4.2/branches/Apple/Troughton/gcc/langhooks.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/branches/Apple/Troughton/gcc/langhooks.h?rev=106565&r1=106564&r2=106565&view=diff
==============================================================================
--- llvm-gcc-4.2/branches/Apple/Troughton/gcc/langhooks.h (original)
+++ llvm-gcc-4.2/branches/Apple/Troughton/gcc/langhooks.h Tue Jun 22 15:04:04 2010
@@ -490,6 +490,11 @@
bool (*function_is_thunk_p) (tree fndecl);
/* LLVM LOCAL end <rdar://problem/7929157> */
+ /* LLVM LOCAL begin <rdar://problem/8104369> */
+ /* Returns the target of a thunk. */
+ tree (*thunk_target) (tree thunk);
+ /* LLVM LOCAL end <rdar://problem/8104369> */
+
/* Whenever you add entries here, make sure you adjust langhooks-def.h
and langhooks.c accordingly. */
};
Modified: llvm-gcc-4.2/branches/Apple/Troughton/gcc/llvm-backend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/branches/Apple/Troughton/gcc/llvm-backend.cpp?rev=106565&r1=106564&r2=106565&view=diff
==============================================================================
--- llvm-gcc-4.2/branches/Apple/Troughton/gcc/llvm-backend.cpp (original)
+++ llvm-gcc-4.2/branches/Apple/Troughton/gcc/llvm-backend.cpp Tue Jun 22 15:04:04 2010
@@ -91,6 +91,9 @@
TargetFolder *TheFolder = 0;
TypeConverter *TheTypeConverter = 0;
+// A list of thunks to post-process.
+std::vector<tree> Thunks;
+
/// DisableLLVMOptimizations - Allow the user to specify:
/// "-mllvm -disable-llvm-optzns" on the llvm-gcc command line to force llvm
/// optimizations off.
@@ -121,8 +124,8 @@
// than the LLVM Value pointer while using PCH.
// Collection of LLVM Values
-static std::vector<Value *> LLVMValues;
-typedef DenseMap<Value *, unsigned> LLVMValuesMapTy;
+static std::vector<Value*> LLVMValues;
+typedef DenseMap<Value*, unsigned> LLVMValuesMapTy;
static LLVMValuesMapTy LLVMValuesMap;
/// LocalLLVMValueIDs - This is the set of local IDs we have in our mapping,
@@ -857,6 +860,47 @@
timevar_push(TV_LLVM_PERFILE);
LLVMContext &Context = getGlobalContext();
+ // Assign the correct linkage to the thunks now that we've set the linkage and
+ // visibility to their targets.
+ SmallPtrSet<tree, 4> ThunkOfThunk;
+
+ for (std::vector<tree>::iterator
+ I = Thunks.begin(), E = Thunks.end(); I != E; ++I) {
+ tree thunk = *I;
+ tree thunk_target = lang_hooks.thunk_target(thunk);
+
+ if (lang_hooks.function_is_thunk_p (thunk_target)) {
+ ThunkOfThunk.insert(thunk);
+ continue;
+ }
+
+ Function *Thunk = cast<Function>(DECL_LLVM(thunk));
+ const Function *ThunkTarget = cast<Function>(DECL_LLVM(thunk_target));
+
+ Thunk->setLinkage(ThunkTarget->getLinkage());
+ Thunk->setVisibility(ThunkTarget->getVisibility());
+ }
+
+ // There's a situation where a thunk calls another thunk. In that case, we
+ // want to process first the thunk that calls a non-thunk. Then we process
+ // each thunk in turn until all thunks have been processed.
+ while (!ThunkOfThunk.empty())
+ for (SmallPtrSet<tree, 4>::iterator
+ I = ThunkOfThunk.begin(), E = ThunkOfThunk.end(); I != E; ++I) {
+ tree thunk = *I;
+ tree thunk_target = lang_hooks.thunk_target(thunk);
+
+ if (!ThunkOfThunk.count(thunk_target)) {
+ Function *Thunk = cast<Function>(DECL_LLVM(thunk));
+ const Function *ThunkTarget = cast<Function>(DECL_LLVM(thunk_target));
+
+ Thunk->setLinkage(ThunkTarget->getLinkage());
+ Thunk->setVisibility(ThunkTarget->getVisibility());
+ ThunkOfThunk.erase(thunk);
+ break;
+ }
+ }
+
performLateBackendInitialization();
createPerFunctionOptimizationPasses();
Modified: llvm-gcc-4.2/branches/Apple/Troughton/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/branches/Apple/Troughton/gcc/llvm-convert.cpp?rev=106565&r1=106564&r2=106565&view=diff
==============================================================================
--- llvm-gcc-4.2/branches/Apple/Troughton/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/branches/Apple/Troughton/gcc/llvm-convert.cpp Tue Jun 22 15:04:04 2010
@@ -75,6 +75,8 @@
static LLVMContext &Context = getGlobalContext();
+extern std::vector<tree> Thunks;
+
// Check for GCC bug 17347: C++ FE sometimes creates bogus ctor trees
// which we should throw out
#define BOGUS_CTOR(exp) \
@@ -528,34 +530,41 @@
// 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);
- } else if (DECL_LLVM_LINKER_PRIVATE(FnDecl)) {
- Fn->setLinkage(Function::LinkerPrivateLinkage);
- } else if (!TREE_PUBLIC(FnDecl) /*|| lang_hooks.llvm_is_in_anon(subr)*/) {
- Fn->setLinkage(Function::InternalLinkage);
- } else if (DECL_EXTERNAL(FnDecl) &&
- lookup_attribute ("always_inline", DECL_ATTRIBUTES (FnDecl))) {
- Fn->setLinkage(Function::AvailableExternallyLinkage);
- } else if (DECL_COMDAT(FnDecl)) {
- Fn->setLinkage(Function::getLinkOnceLinkage(flag_odr));
- } 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) || lang_hooks.function_is_thunk_p (FnDecl)) {
- Fn->setLinkage(Function::getWeakLinkage(flag_odr));
- } else if (IS_EXTERN_INLINE(FnDecl)) {
- // gcc "extern inline", C99 "inline"
- Fn->setLinkage(Function::AvailableExternallyLinkage);
- }
+ if (!lang_hooks.function_is_thunk_p (FnDecl)) {
+ // Compute the linkage that the function should get.
+ if (DECL_LLVM_PRIVATE(FnDecl)) {
+ Fn->setLinkage(Function::PrivateLinkage);
+ } else if (DECL_LLVM_LINKER_PRIVATE(FnDecl)) {
+ Fn->setLinkage(Function::LinkerPrivateLinkage);
+ } else if (!TREE_PUBLIC(FnDecl) /*|| lang_hooks.llvm_is_in_anon(subr)*/) {
+ Fn->setLinkage(Function::InternalLinkage);
+ } else if (DECL_EXTERNAL(FnDecl) &&
+ lookup_attribute ("always_inline", DECL_ATTRIBUTES (FnDecl))) {
+ Fn->setLinkage(Function::AvailableExternallyLinkage);
+ } else if (DECL_COMDAT(FnDecl)) {
+ Fn->setLinkage(Function::getLinkOnceLinkage(flag_odr));
+ } else if (DECL_WEAK(FnDecl)) {
+ // The user may have explicitly asked for weak linkage - ignore flag_odr.
+ Fn->setLinkage(Function::WeakAnyLinkage);
+ } 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"
+ Fn->setLinkage(Function::AvailableExternallyLinkage);
+ }
#ifdef TARGET_ADJUST_LLVM_LINKAGE
- TARGET_ADJUST_LLVM_LINKAGE(Fn,FnDecl);
+ TARGET_ADJUST_LLVM_LINKAGE(Fn, FnDecl);
#endif /* TARGET_ADJUST_LLVM_LINKAGE */
- // Handle visibility style
- handleVisibility(FnDecl, Fn);
+ // Handle visibility style.
+ handleVisibility(FnDecl, Fn);
+ } else {
+ // A thunk should get its visibility and linkage from the function being
+ // thunked. Set the information after all functions have been processed
+ // through here.
+ Thunks.push_back(FnDecl);
+ }
// Handle attribute "aligned".
if (DECL_ALIGN (FnDecl) != FUNCTION_BOUNDARY)
More information about the llvm-branch-commits
mailing list