[cfe-commits] r54339 - in /cfe/trunk: Driver/PrintParserCallbacks.cpp include/clang/AST/Attr.h include/clang/Parse/Action.h lib/Parse/MinimalAction.cpp lib/Parse/ParseDecl.cpp lib/Parse/ParseObjc.cpp lib/Parse/Parser.cpp lib/Sema/Sema.h lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclCXX.cpp

Daniel Dunbar daniel at zuster.org
Mon Aug 4 18:35:18 PDT 2008


Author: ddunbar
Date: Mon Aug  4 20:35:17 2008
New Revision: 54339

URL: http://llvm.org/viewvc/llvm-project?rev=54339&view=rev
Log:
Add more Parser/Sema support for GCC asm-label extension.
 - ActOnDeclarator now takes an additional parameter which is the
   AsmLabel if used. Its unfortunate that this bubbles up this high,
   but we cannot just lump it in as an attribute without mistakenly
   *accepting* it as an attribute.
 - The actual asm-label itself is, however, encoded as an AsmLabelAttr
   on the FunctionDecl.
 - Slightly improved parser error recovery on malformed asm-labels.
 - CodeGen support still missing...

Modified:
    cfe/trunk/Driver/PrintParserCallbacks.cpp
    cfe/trunk/include/clang/AST/Attr.h
    cfe/trunk/include/clang/Parse/Action.h
    cfe/trunk/lib/Parse/MinimalAction.cpp
    cfe/trunk/lib/Parse/ParseDecl.cpp
    cfe/trunk/lib/Parse/ParseObjc.cpp
    cfe/trunk/lib/Parse/Parser.cpp
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp

Modified: cfe/trunk/Driver/PrintParserCallbacks.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/PrintParserCallbacks.cpp?rev=54339&r1=54338&r2=54339&view=diff

==============================================================================
--- cfe/trunk/Driver/PrintParserCallbacks.cpp (original)
+++ cfe/trunk/Driver/PrintParserCallbacks.cpp Mon Aug  4 20:35:17 2008
@@ -30,7 +30,7 @@
     /// and 'Init' specifies the initializer if any.  This is for things like:
     /// "int X = 4" or "typedef int foo".
     virtual DeclTy *ActOnDeclarator(Scope *S, Declarator &D,
-                                    DeclTy *LastInGroup) {
+                                    DeclTy *LastInGroup, ExprTy *AsmLabel) {
       llvm::cout << __FUNCTION__ << " ";
       if (IdentifierInfo *II = D.getIdentifier()) {
         llvm::cout << "'" << II->getName() << "'";
@@ -40,7 +40,7 @@
       llvm::cout << "\n";
       
       // Pass up to EmptyActions so that the symbol table is maintained right.
-      return MinimalAction::ActOnDeclarator(S, D, LastInGroup);
+      return MinimalAction::ActOnDeclarator(S, D, LastInGroup, AsmLabel);
     }
     /// ActOnPopScope - This callback is called immediately before the specified
     /// scope is popped and deleted.

Modified: cfe/trunk/include/clang/AST/Attr.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Attr.h?rev=54339&r1=54338&r2=54339&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/Attr.h (original)
+++ cfe/trunk/include/clang/AST/Attr.h Mon Aug  4 20:35:17 2008
@@ -28,6 +28,7 @@
     Alias,
     Aligned,
     Annotate,
+    AsmLabel, // Represent GCC asm label extension.
     Constructor,
     Deprecated,
     Destructor,
@@ -115,6 +116,20 @@
   static bool classof(const AnnotateAttr *A) { return true; }
 };
 
+class AsmLabelAttr : public Attr {
+  std::string Label;
+public:
+  AsmLabelAttr(const std::string &L) : Attr(AsmLabel), Label(L) {}
+  
+  const std::string& getLabel() const { return Label; }
+  
+  // Implement isa/cast/dyncast/etc.
+  static bool classof(const Attr *A) {
+    return A->getKind() == AsmLabel;
+  }
+  static bool classof(const AsmLabelAttr *A) { return true; }
+};
+
 class AliasAttr : public Attr {
   std::string Aliasee;
 public:

Modified: cfe/trunk/include/clang/Parse/Action.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=54339&r1=54338&r2=54339&view=diff

==============================================================================
--- cfe/trunk/include/clang/Parse/Action.h (original)
+++ cfe/trunk/include/clang/Parse/Action.h Mon Aug  4 20:35:17 2008
@@ -105,7 +105,12 @@
   /// LastInGroup is non-null for cases where one declspec has multiple
   /// declarators on it.  For example in 'int A, B', ActOnDeclarator will be
   /// called with LastInGroup=A when invoked for B.
-  virtual DeclTy *ActOnDeclarator(Scope *S, Declarator &D,DeclTy *LastInGroup) {
+  ///
+  /// AsmLabel is non-null only for top-level function declarations
+  /// which use the GCC asm-label extension (the expression must be a
+  /// constant string).
+  virtual DeclTy *ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup,
+                                  ExprTy *AsmLabel) {
     return 0;
   }
 
@@ -139,7 +144,7 @@
   virtual DeclTy *ActOnStartOfFunctionDef(Scope *FnBodyScope, Declarator &D) {
     // Default to ActOnDeclarator.
     return ActOnStartOfFunctionDef(FnBodyScope,
-                                   ActOnDeclarator(FnBodyScope, D, 0));
+                                   ActOnDeclarator(FnBodyScope, D, 0, 0));
   }
 
   /// ActOnStartOfFunctionDef - This is called at the start of a function
@@ -834,7 +839,8 @@
   /// ActOnDeclarator - If this is a typedef declarator, we modify the
   /// IdentifierInfo::FETokenInfo field to keep track of this fact, until S is
   /// popped.
-  virtual DeclTy *ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup);
+  virtual DeclTy *ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup,
+                                  ExprTy *AsmLabel);
   
   /// ActOnPopScope - When a scope is popped, if any typedefs are now 
   /// out-of-scope, they are removed from the IdentifierInfo::FETokenInfo field.

Modified: cfe/trunk/lib/Parse/MinimalAction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/MinimalAction.cpp?rev=54339&r1=54338&r2=54339&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/MinimalAction.cpp (original)
+++ cfe/trunk/lib/Parse/MinimalAction.cpp Mon Aug  4 20:35:17 2008
@@ -63,7 +63,8 @@
 /// IdentifierInfo::FETokenInfo field to keep track of this fact, until S is
 /// popped.
 Action::DeclTy *
-MinimalAction::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup) {
+MinimalAction::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup,
+                               ExprTy *AsmLabel) {
   IdentifierInfo *II = D.getIdentifier();
   
   // If there is no identifier associated with this declarator, bail out.

Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=54339&r1=54338&r2=54339&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDecl.cpp Mon Aug  4 20:35:17 2008
@@ -256,8 +256,14 @@
   // rest of the init-declarator-list.
   while (1) {
     // If a simple-asm-expr is present, parse it.
-    if (Tok.is(tok::kw_asm))
-      ParseSimpleAsm();
+    ExprResult AsmLabel;
+    if (Tok.is(tok::kw_asm)) {
+      AsmLabel = ParseSimpleAsm();
+      if (AsmLabel.isInvalid) {
+        SkipUntil(tok::semi);
+        return 0;
+      }
+    }
     
     // If attributes are present, parse them.
     if (Tok.is(tok::kw___attribute))
@@ -265,13 +271,13 @@
 
     // Inform the current actions module that we just parsed this declarator.
     // FIXME: pass asm & attributes.
-    LastDeclInGroup = Actions.ActOnDeclarator(CurScope, D, LastDeclInGroup);
+    LastDeclInGroup = Actions.ActOnDeclarator(CurScope, D, LastDeclInGroup,
+                                              AsmLabel.Val);
         
     // Parse declarator '=' initializer.
-    ExprResult Init;
     if (Tok.is(tok::equal)) {
       ConsumeToken();
-      Init = ParseInitializer();
+      ExprResult Init = ParseInitializer();
       if (Init.isInvalid) {
         SkipUntil(tok::semi);
         return 0;

Modified: cfe/trunk/lib/Parse/ParseObjc.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=54339&r1=54338&r2=54339&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseObjc.cpp (original)
+++ cfe/trunk/lib/Parse/ParseObjc.cpp Mon Aug  4 20:35:17 2008
@@ -1222,7 +1222,7 @@
           ParseDeclarator(DeclaratorInfo);
           if (DeclaratorInfo.getIdentifier()) {
             DeclTy *aBlockVarDecl = Actions.ActOnDeclarator(CurScope, 
-                                                          DeclaratorInfo, 0);
+                                                            DeclaratorInfo, 0, 0);
             StmtResult stmtResult =
               Actions.ActOnDeclStmt(aBlockVarDecl, 
                                     DS.getSourceRange().getBegin(),

Modified: cfe/trunk/lib/Parse/Parser.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=54339&r1=54338&r2=54339&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/Parser.cpp (original)
+++ cfe/trunk/lib/Parse/Parser.cpp Mon Aug  4 20:35:17 2008
@@ -670,7 +670,11 @@
 
   ExprResult Result = ParseAsmStringLiteral();
 
-  MatchRHSPunctuation(tok::r_paren, Loc);
+  if (Result.isInvalid) {
+    SkipUntil(tok::r_paren);
+  } else {
+    MatchRHSPunctuation(tok::r_paren, Loc);
+  }
 
   return Result;
 }

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=54339&r1=54338&r2=54339&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Mon Aug  4 20:35:17 2008
@@ -211,7 +211,8 @@
   // Symbol table / Decl tracking callbacks: SemaDecl.cpp.
   //
   virtual TypeTy *isTypeName(const IdentifierInfo &II, Scope *S);
-  virtual DeclTy *ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup);
+  virtual DeclTy *ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup,
+                                  ExprTy *AsmLabel);
   virtual DeclTy *ActOnParamDeclarator(Scope *S, Declarator &D);
   virtual void ActOnParamDefaultArgument(DeclTy *param, 
                                          SourceLocation EqualLoc,

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=54339&r1=54338&r2=54339&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Aug  4 20:35:17 2008
@@ -609,7 +609,7 @@
 }
 
 Sema::DeclTy *
-Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {
+Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl, ExprTy *AsmLabel) {
   ScopedDecl *LastDeclarator = dyn_cast_or_null<ScopedDecl>((Decl *)lastDecl);
   IdentifierInfo *II = D.getIdentifier();
   
@@ -700,6 +700,14 @@
     // Handle attributes.
     ProcessDeclAttributes(NewFD, D);
 
+    // Handle GNU asm-label extension (encoded as an attribute).
+    if (Expr *E = (Expr*) AsmLabel) {
+      // The parser guarantees this is a string.
+      StringLiteral *SE = cast<StringLiteral>(E);  
+      NewFD->addAttr(new AsmLabelAttr(std::string(SE->getStrData(),
+                                                  SE->getByteLength())));
+    }
+
     // Copy the parameter declarations from the declarator D to
     // the function declaration NewFD, if they are available.
     if (D.getNumTypeObjects() > 0 &&
@@ -1569,7 +1577,7 @@
   }
 
   return ActOnStartOfFunctionDef(FnBodyScope,
-                                 ActOnDeclarator(GlobalScope, D, 0));
+                                 ActOnDeclarator(GlobalScope, D, 0, 0));
 }
 
 Sema::DeclTy *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, DeclTy *D) {
@@ -1661,7 +1669,7 @@
   CurContext = Context.getTranslationUnitDecl();
  
   FunctionDecl *FD = 
-    dyn_cast<FunctionDecl>(static_cast<Decl*>(ActOnDeclarator(TUScope, D, 0)));
+    dyn_cast<FunctionDecl>(static_cast<Decl*>(ActOnDeclarator(TUScope, D, 0, 0)));
   FD->setImplicit();
 
   CurContext = PrevDC;

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=54339&r1=54338&r2=54339&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Aug  4 20:35:17 2008
@@ -371,7 +371,7 @@
   if (isInstField)
     Member = static_cast<Decl*>(ActOnField(S, Loc, D, BitWidth));
   else
-    Member = static_cast<Decl*>(ActOnDeclarator(S, D, LastInGroup));
+    Member = static_cast<Decl*>(ActOnDeclarator(S, D, LastInGroup, 0));
 
   if (!Member) return LastInGroup;
 





More information about the cfe-commits mailing list