[llvm-commits] CVS: llvm-gcc/gcc/llvm-expand.c llvm-representation.c llvm-representation.h

Chris Lattner lattner at cs.uiuc.edu
Sun Dec 4 20:49:33 PST 2005



Changes in directory llvm-gcc/gcc:

llvm-expand.c updated: 1.119 -> 1.120
llvm-representation.c updated: 1.21 -> 1.22
llvm-representation.h updated: 1.20 -> 1.21
---
Log message:

Implement support for attribute "used", implementing PR660: http://llvm.cs.uiuc.edu/PR660  and
implementing test/Regression/CFrontend/2005-12-04-AttributeUsed.c.



---
Diffs of the changes:  (+66 -1)

 llvm-expand.c         |    9 ++++++++
 llvm-representation.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++-
 llvm-representation.h |    2 +
 3 files changed, 66 insertions(+), 1 deletion(-)


Index: llvm-gcc/gcc/llvm-expand.c
diff -u llvm-gcc/gcc/llvm-expand.c:1.119 llvm-gcc/gcc/llvm-expand.c:1.120
--- llvm-gcc/gcc/llvm-expand.c:1.119	Sun Dec  4 21:24:21 2005
+++ llvm-gcc/gcc/llvm-expand.c	Sun Dec  4 22:49:21 2005
@@ -7271,6 +7271,10 @@
     return Fn;
   }
 
+  /* If this was marked 'used', add it to the 'used' list.  */
+  if (lookup_attribute ("used", DECL_ATTRIBUTES (subr)))
+    Fn->AttributeUsed = 1;
+  
   /* If there is already a body for this function, it's a wierd error.  The only
    * case we allow is if the old function was linkonce.
    */
@@ -7776,6 +7780,11 @@
       G->Init = V2C(llvm_constant_get_null(BaseTy));
     }
   }
+    
+  /* If this was marked 'used', add it to the 'used' list.  */
+  if (lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
+    G->AttributeUsed = 1;
+    
 
   TREE_ASM_WRITTEN(decl) = 1;
   if (EMIT_CODE_INCREMENTALLY) llvm_global_print(G, llvm_out_file);


Index: llvm-gcc/gcc/llvm-representation.c
diff -u llvm-gcc/gcc/llvm-representation.c:1.21 llvm-gcc/gcc/llvm-representation.c:1.22
--- llvm-gcc/gcc/llvm-representation.c:1.21	Tue Nov 29 12:25:04 2005
+++ llvm-gcc/gcc/llvm-representation.c	Sun Dec  4 22:49:21 2005
@@ -24,6 +24,7 @@
 #include "hashtab.h"
 #include <assert.h>
 #include <string.h>
+#include <ctype.h>
 
 /* The one true program we are compiling */
 llvm_program TheProgram;
@@ -1055,6 +1056,8 @@
 
 /* Print the specified program to the output file */
 void llvm_program_print(FILE *F) {
+  unsigned NumAttributeUsed;
+  
   llvm_type_print_all_named(F);
 
   /* Output global ctors and dtors if there are any */
@@ -1081,7 +1084,58 @@
       fprintf(F, "\n    ]\n\n");
     }
   }
-
+  
+  /* Output the llvm.used array if there are any attribute(used) globals */
+  NumAttributeUsed = 0;
+  
+  {  /* Count globals that are attribute used */
+  llvm_global *I;
+  for (I = llvm_ilist_begin(TheProgram.Globals);
+       I != llvm_ilist_end(TheProgram.Globals);
+       I = I->Next)
+    if (I->AttributeUsed) ++NumAttributeUsed;
+  }
+  {  /* Count functions that are attribute used */
+    llvm_function *I;
+    for (I = llvm_ilist_begin(TheProgram.Functions);
+         I != llvm_ilist_end(TheProgram.Functions);
+         I = I->Next)
+      if (I->AttributeUsed) ++NumAttributeUsed;
+  }
+
+  if (NumAttributeUsed) {
+    llvm_global *G;
+    llvm_function *Fn;
+    fprintf(F, "; Attribute used list\n");
+    fprintf(F,"%%llvm.used = appending global [%d x sbyte*]"
+            " [\n", NumAttributeUsed);
+    NumAttributeUsed = 0;
+    for (G = llvm_ilist_begin(TheProgram.Globals);
+         G != llvm_ilist_end(TheProgram.Globals);
+         G = G->Next) {
+      if (G->AttributeUsed) {
+        if (NumAttributeUsed++)
+          fprintf(F, ",\n");
+        fprintf(F, "\tsbyte* cast (");
+        llvm_value_print_operand(G2V(G), 1, F);
+        fprintf(F, " to sbyte*)");
+      }
+    }
+    for (Fn = llvm_ilist_begin(TheProgram.Functions);
+         Fn != llvm_ilist_end(TheProgram.Functions);
+         Fn = Fn->Next) {
+      if (Fn->AttributeUsed) {
+        if (NumAttributeUsed++)
+          fprintf(F, ",\n");
+        fprintf(F, "\tsbyte* cast (");
+        llvm_value_print_operand(G2V(Fn), 1, F);
+          fprintf(F, " to sbyte*)");
+      }
+    }
+    fprintf(F, "\n    ]\n\n");
+  }
+  
+  
   /* Output the rest of the global variables... */
   llvm_ilist_foreach1(llvm_global, TheProgram.Globals, llvm_global_print, F);
 


Index: llvm-gcc/gcc/llvm-representation.h
diff -u llvm-gcc/gcc/llvm-representation.h:1.20 llvm-gcc/gcc/llvm-representation.h:1.21
--- llvm-gcc/gcc/llvm-representation.h:1.20	Tue Nov 29 12:25:04 2005
+++ llvm-gcc/gcc/llvm-representation.h	Sun Dec  4 22:49:21 2005
@@ -287,6 +287,7 @@
 
   ENUM_BITFIELD (llvm_linkage) Linkage : 4;
   int MarkedNameUsed : 1;
+  int AttributeUsed : 1;       /* Function is attribute(used) */
   char *PrettyFunctionName;
 } llvm_function;
 
@@ -307,6 +308,7 @@
   llvm_ilist_node(struct llvm_global, Globals); /* Part of Global list */
   llvm_constant *Init;                  /* Initializer or null for external */
   int isConstant : 1;                   /* Is the global immutable? */
+  int AttributeUsed : 1;                /* Global is attribute(used) */
 
   ENUM_BITFIELD (llvm_linkage) Linkage : 4;
   int  MarkedNameUsed : 1;






More information about the llvm-commits mailing list