[llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y

Chris Lattner lattner at cs.uiuc.edu
Fri Nov 11 16:11:21 PST 2005



Changes in directory llvm/lib/AsmParser:

llvmAsmParser.y updated: 1.237 -> 1.238
---
Log message:

Parse section info


---
Diffs of the changes:  (+41 -9)

 llvmAsmParser.y |   50 +++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 41 insertions(+), 9 deletions(-)


Index: llvm/lib/AsmParser/llvmAsmParser.y
diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.237 llvm/lib/AsmParser/llvmAsmParser.y:1.238
--- llvm/lib/AsmParser/llvmAsmParser.y:1.237	Wed Nov  9 19:42:43 2005
+++ llvm/lib/AsmParser/llvmAsmParser.y	Fri Nov 11 18:11:10 2005
@@ -517,7 +517,8 @@
 /// this is a declaration, otherwise it is a definition.
 static void ParseGlobalVariable(char *NameStr,GlobalValue::LinkageTypes Linkage,
                                 bool isConstantGlobal, const Type *Ty,
-                                Constant *Initializer, unsigned Align) {
+                                Constant *Initializer, char *Section,
+                                unsigned Align) {
   if (Align != 0 && !isPowerOf2_32(Align))
     ThrowException("Global alignment must be a power of two!");
   
@@ -551,6 +552,10 @@
     GV->setLinkage(Linkage);
     GV->setConstant(isConstantGlobal);
     GV->setAlignment(Align);
+    if (Section) {
+      free(Section);
+      GV->setSection(Section);
+    }
     InsertValue(GV, CurModule.Values);
     return;
   }
@@ -578,6 +583,10 @@
           EGV->setConstant(true);
         EGV->setLinkage(Linkage);
         EGV->setAlignment(Align);
+        if (Section) {
+          free(Section);
+          EGV->setSection(Section);
+        }
         return;
       }
 
@@ -591,6 +600,10 @@
     new GlobalVariable(Ty, isConstantGlobal, Linkage, Initializer, Name,
                        CurModule.CurrentModule);
   GV->setAlignment(Align);
+  if (Section) {
+    free(Section);
+    GV->setSection(Section);
+  }
   InsertValue(GV, CurModule.Values);
 }
 
@@ -956,9 +969,10 @@
 %token <StrVal> VAR_ID LABELSTR STRINGCONSTANT
 %type  <StrVal> Name OptName OptAssign
 %type  <UIntVal> OptAlign OptCAlign
+%type <StrVal> OptSection OptCSection SectionString
 
 %token IMPLEMENTATION ZEROINITIALIZER TRUETOK FALSETOK BEGINTOK ENDTOK
-%token DECLARE GLOBAL CONSTANT VOLATILE
+%token DECLARE GLOBAL CONSTANT SECTION VOLATILE
 %token TO DOTDOTDOT NULL_TOK UNDEF CONST INTERNAL LINKONCE WEAK  APPENDING
 %token OPAQUE NOT EXTERNAL TARGET TRIPLE ENDIAN POINTERSIZE LITTLE BIG ALIGN
 %token DEPLIBS CALL TAIL
@@ -1049,6 +1063,19 @@
 OptCAlign : /*empty*/            { $$ = 0; } |
             ',' ALIGN EUINT64VAL { $$ = $3; };
 
+SectionString : SECTION STRINGCONSTANT {
+  for (unsigned i = 0, e = strlen($2); i != e; ++i)
+    if ($2[i] == '"' || $2[i] == '\\')
+      ThrowException("Invalid character in section name!");
+  $$ = $2;
+};
+
+OptSection : /*empty*/ { $$ = 0; } |
+             SectionString { $$ = $1; };
+OptCSection : /*empty*/ { $$ = 0; } |
+             ',' SectionString { $$ = $2; };
+
+
 //===----------------------------------------------------------------------===//
 // Types includes all predefined types... except void, because it can only be
 // used in specific contexts (function returning void for example).  To have
@@ -1557,12 +1584,12 @@
   }
   | ConstPool FunctionProto {       // Function prototypes can be in const pool
   }
-  | ConstPool OptAssign OptLinkage GlobalType ConstVal OptCAlign {
+  | ConstPool OptAssign OptLinkage GlobalType ConstVal OptCSection OptCAlign {
     if ($5 == 0) ThrowException("Global value initializer is not a constant!");
-    ParseGlobalVariable($2, $3, $4, $5->getType(), $5, $6);
+    ParseGlobalVariable($2, $3, $4, $5->getType(), $5, $6, $7);
   }
-  | ConstPool OptAssign EXTERNAL GlobalType Types OptCAlign {
-    ParseGlobalVariable($2, GlobalValue::ExternalLinkage, $4, *$5, 0, $6);
+  | ConstPool OptAssign EXTERNAL GlobalType Types OptCSection OptCAlign {
+    ParseGlobalVariable($2, GlobalValue::ExternalLinkage, $4, *$5, 0, $6, $7);
     delete $5;
   }
   | ConstPool TARGET TargetDefinition { 
@@ -1647,14 +1674,15 @@
     $$ = 0;
   };
 
-FunctionHeaderH : OptCallingConv TypesV Name '(' ArgList ')' OptAlign {
+FunctionHeaderH : OptCallingConv TypesV Name '(' ArgList ')' 
+                  OptSection OptAlign {
   UnEscapeLexed($3);
   std::string FunctionName($3);
   free($3);  // Free strdup'd memory!
   
   if (!(*$2)->isFirstClassType() && *$2 != Type::VoidTy)
     ThrowException("LLVM functions cannot return aggregate types!");
-  if ($7 != 0 && !isPowerOf2_32($7))
+  if ($8 != 0 && !isPowerOf2_32($8))
     ThrowException("Function alignment must be a power of two!");
 
   std::vector<const Type*> ParamTypeList;
@@ -1707,7 +1735,11 @@
 
   CurFun.FunctionStart(Fn);
   Fn->setCallingConv($1);
-  Fn->setAlignment($7);
+  Fn->setAlignment($8);
+  if ($7) {
+    Fn->setSection($7);
+    free($7);
+  }
 
   // Add all of the arguments we parsed to the function...
   if ($5) {                     // Is null if empty...






More information about the llvm-commits mailing list