[llvm-commits] [126949] From Anton: this patch modifies the alias support in llvm-gcc

clattner at apple.com clattner at apple.com
Sat May 5 11:11:47 PDT 2007


Revision: 126949
Author:   clattner
Date:     2007-05-05 11:11:46 -0700 (Sat, 05 May 2007)

Log Message:
-----------
>From Anton: this patch modifies the alias support in llvm-gcc
to not use c-front-end specific functions.

Modified Paths:
--------------
    apple-local/branches/llvm/gcc/cgraph.c
    apple-local/branches/llvm/gcc/llvm-backend.cpp
    apple-local/branches/llvm/gcc/llvm.h
    apple-local/branches/llvm/gcc/varasm.c

Modified: apple-local/branches/llvm/gcc/cgraph.c
===================================================================
--- apple-local/branches/llvm/gcc/cgraph.c	2007-05-05 17:57:58 UTC (rev 126948)
+++ apple-local/branches/llvm/gcc/cgraph.c	2007-05-05 18:11:46 UTC (rev 126949)
@@ -213,7 +213,13 @@
      historically been doing the wrong thing in assemble_alias by always
      printing the leading underscore.  Since we're not changing that, make
      sure user_label_prefix follows the '*' before matching.  */
+/* APPLE LOCAL begin LLVM */  
+#ifdef ENABLE_LLVM
+  if (IDENTIFIER_POINTER (decl_asmname)[0] == 1)
+#else  
   if (IDENTIFIER_POINTER (decl_asmname)[0] == '*')
+#endif
+/* APPLE LOCAL end LLVM */
     {
       const char *decl_str = IDENTIFIER_POINTER (decl_asmname) + 1;
       size_t ulp_len = strlen (user_label_prefix);

Modified: apple-local/branches/llvm/gcc/llvm-backend.cpp
===================================================================
--- apple-local/branches/llvm/gcc/llvm-backend.cpp	2007-05-05 17:57:58 UTC (rev 126948)
+++ apple-local/branches/llvm/gcc/llvm-backend.cpp	2007-05-05 18:11:46 UTC (rev 126949)
@@ -58,7 +58,6 @@
 #include "coretypes.h"
 #include "flags.h"
 #include "tree.h"
-#include "c-tree.h" // For aliases
 #include "diagnostic.h"
 #include "output.h"
 #include "toplev.h"
@@ -534,48 +533,45 @@
   timevar_pop(TV_LLVM_FUNCS);
 }
 
-// emit_alias_to_llvm - Given decl and target emit alias to target. gcc is
-// little bit insane, it can ask us for alias emission in many places. Such
-// places are divided into two stages: it's allowed to have unresolved target at
-// stage 0 (hence result code -1), but not on stage 1 (error). Zero is returned
-// if alias was emitted.
-int emit_alias_to_llvm(tree decl, tree target, unsigned stage) {
-  if (errorcount || sorrycount) return -2;
-    
+// emit_alias_to_llvm - Given decl and target emit alias to target.
+void emit_alias_to_llvm(tree decl, tree target, tree target_decl) {
+  if (errorcount || sorrycount) return;
+
   timevar_push(TV_LLVM_GLOBALS);
 
   // Get or create LLVM global for our alias.
   GlobalValue *V = cast<GlobalValue>(DECL_LLVM(decl));
   
-  // Try to grab decl from IDENTIFIER_NODE
-  GlobalValue *Aliasee = 0;
-  if (tree c_decl = lookup_name(target))
-    Aliasee = cast<GlobalValue>(DECL_LLVM(c_decl));
+  GlobalValue *Aliasee = NULL;
+  
+  if (target_decl)
+    Aliasee = cast<GlobalValue>(DECL_LLVM(target_decl));
+  else {
+    // This is something insane. Probably only LTHUNKs can be here
+    // Try to grab decl from IDENTIFIER_NODE
 
-  // Query SymTab for aliasee
-  const char* AliaseeName = IDENTIFIER_POINTER(target);
-  if (!Aliasee) {
+    // Query SymTab for aliasee
+    const char* AliaseeName = IDENTIFIER_POINTER(target);
     Aliasee =
       dyn_cast_or_null<GlobalValue>(TheModule->
                                     getValueSymbolTable().lookup(AliaseeName));
-  }
 
-  // Last resort. Query for name set via __asm__
-  if (!Aliasee) {
-    std::string starred = std::string("\001") + AliaseeName;
-    Aliasee =
-      dyn_cast_or_null<GlobalValue>(TheModule->
-                                    getValueSymbolTable().lookup(starred));
-  }
-  
-  if (!Aliasee) {
-    if (stage)
+    // Last resort. Query for name set via __asm__
+    if (!Aliasee) {
+      std::string starred = std::string("\001") + AliaseeName;
+      Aliasee =
+        dyn_cast_or_null<GlobalValue>(TheModule->
+                                      getValueSymbolTable().lookup(starred));
+    }
+    
+    if (!Aliasee) {
       error ("%J%qD aliased to undefined symbol %qE",
              decl, decl, target);
-    timevar_pop(TV_LLVM_GLOBALS);
-    return -1;
-  }  
-    
+      timevar_pop(TV_LLVM_GLOBALS);
+      return;
+    }
+  }
+  
   GlobalValue::LinkageTypes Linkage;
   GlobalValue::VisibilityTypes Visibility;
 
@@ -598,7 +594,7 @@
   else if (!V->use_empty()) {
     error ("%J Alias %qD used with invalid type!", decl, decl);
     timevar_pop(TV_LLVM_GLOBALS);
-    return -1;
+    return;
   }
     
   changeLLVMValue(V, GA);
@@ -611,9 +607,11 @@
     F->eraseFromParent();
   else
     assert(0 && "Unsuported global value");
+
+  TREE_ASM_WRITTEN(decl) = 1;
   
   timevar_pop(TV_LLVM_GLOBALS);
-  return 0;
+  return;
 }
 
   

Modified: apple-local/branches/llvm/gcc/llvm.h
===================================================================
--- apple-local/branches/llvm/gcc/llvm.h	2007-05-05 17:57:58 UTC (rev 126948)
+++ apple-local/branches/llvm/gcc/llvm.h	2007-05-05 18:11:46 UTC (rev 126949)
@@ -51,7 +51,7 @@
 
 /* emit_global_to_llvm - Emit the specified alias to LLVM
  */
-int emit_alias_to_llvm(union tree_node*, union tree_node*, unsigned);
+void emit_alias_to_llvm(union tree_node*, union tree_node*, union tree_node*);
 
 /* llvm_get_decl_name - Used by varasm.c, returns the specified declaration's
  * name.

Modified: apple-local/branches/llvm/gcc/varasm.c
===================================================================
--- apple-local/branches/llvm/gcc/varasm.c	2007-05-05 17:57:58 UTC (rev 126948)
+++ apple-local/branches/llvm/gcc/varasm.c	2007-05-05 18:11:46 UTC (rev 126949)
@@ -4634,8 +4634,6 @@
 /* Given an assembly name, find the decl it is associated with.  At the
    same time, mark it needed for cgraph.  */
 
-/* APPLE LOCAL LLVM */
-#ifndef ENABLE_LLVM
 static tree
 find_decl_and_mark_needed (tree decl, tree target)
 {
@@ -4673,20 +4671,12 @@
   else 
     return NULL_TREE;
 }
-/* APPLE LOCAL LLVM */
-#endif
 
+/* APPLE LOCAL LLVM */
+#ifndef ENABLE_LLVM  
 static void
 do_assemble_alias (tree decl, tree target)
 {
-/* APPLE LOCAL begin LLVM */
-#ifdef ENABLE_LLVM  
-  if (emit_alias_to_llvm(decl, target, 1) == -1)
-    error ("%J%qD aliased to undefined symbol %qE",
-           decl, decl, target);
-  return;
-#endif
-/* APPLE LOCAL end LLVM */
   if (TREE_ASM_WRITTEN (decl))
     return;
 
@@ -4724,12 +4714,14 @@
        we do not emit multiple .weak directives for it.  */
     for (p = &weak_decls; (t = *p) ; )
       if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
-	*p = TREE_CHAIN (t);
+       *p = TREE_CHAIN (t);
       else
-	p = &TREE_CHAIN (t);
+       p = &TREE_CHAIN (t);
   }
 #endif
 }
+/* APPLE LOCAL LLVM */
+#endif
 
 /* First pass of completing pending aliases.  Make sure that cgraph knows
    which symbols will be required.  */
@@ -4737,11 +4729,6 @@
 void
 finish_aliases_1 (void)
 {
-/* APPLE LOCAL begin LLVM */
-#ifdef ENABLE_LLVM
-  return;
-#else
-/* APPLE LOCAL end LLVM */
   unsigned i;
   alias_pair p;
 
@@ -4757,9 +4744,6 @@
 	error ("%J%qD aliased to external symbol %qE",
 	       p->decl, p->decl, p->target);
     }
-/* APPLE LOCAL begin LLVM */
-#endif
-/* APPLE LOCAL end LLVM */
 }
 
 /* Second pass of completing pending aliases.  Emit the actual assembly.
@@ -4773,7 +4757,17 @@
   alias_pair p;
 
   for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
+/* APPLE LOCAL begin LLVM */
+#ifdef ENABLE_LLVM
+    {
+      tree target_decl;
+      target_decl = find_decl_and_mark_needed (p->decl, p->target);
+      emit_alias_to_llvm(p->decl, p->target, target_decl);
+    }
+#else  
     do_assemble_alias (p->decl, p->target);
+#endif    
+/*APPLE LOCAL end LLVM */
 
   alias_pairs = NULL;
 }
@@ -4784,12 +4778,8 @@
 void
 assemble_alias (tree decl, tree target)
 {
-/* APPLE LOCAL begin LLVM */
-#ifndef ENABLE_LLVM
   tree target_decl;
-#endif  
-/* APPLE LOCAL end LLVM */
-  
+
 #if !defined (ASM_OUTPUT_DEF)
 # if !defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL)
   error ("%Jalias definitions not supported in this configuration", decl);
@@ -4825,20 +4815,16 @@
   else
     cgraph_varpool_node (decl)->alias = true;
 
-/* APPLE LOCAL begin LLVM */
-#ifdef ENABLE_LLVM
-  /* Can we emit alias right now (usually true for C functions)? If yes - do it,
-   * otherwise save for late processing */
-  if (emit_alias_to_llvm(decl, target, 0) == -1)
-#else  
   /* If the target has already been emitted, we don't have to queue the
      alias.  This saves a tad o memory.  */
   target_decl = find_decl_and_mark_needed (decl, target);
   if (target_decl && TREE_ASM_WRITTEN (target_decl))
-    do_assemble_alias (decl, target);
-  else
+#ifdef ENABLE_LLVM
+    emit_alias_to_llvm(decl, target, target_decl);
+#else
+  do_assemble_alias (decl, target);
 #endif
-/* APPLE LOCAL end LLVM */    
+  else
     {
       alias_pair p;
 





More information about the llvm-commits mailing list