]> granicus.if.org Git - clang/commitdiff
Add fastcall/stdcall attribute support
authorNate Begeman <natebegeman@mac.com>
Fri, 7 Mar 2008 20:04:22 +0000 (20:04 +0000)
committerNate Begeman <natebegeman@mac.com>
Fri, 7 Mar 2008 20:04:22 +0000 (20:04 +0000)
Generate CallingConv::Fast when fastcall attribute is present

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48017 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CodeGenFunction.cpp
Parse/AttributeList.cpp
Sema/Sema.h
Sema/SemaDecl.cpp
include/clang/AST/Attr.h
include/clang/Parse/AttributeList.h

index f48d093b25e54f90645c073ceb0a00a9af9ca899..7d70e6c83105ee3970588543713155c25037b58b 100644 (file)
@@ -15,6 +15,7 @@
 #include "CodeGenModule.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/AST/AST.h"
+#include "llvm/CallingConv.h"
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Function.h"
@@ -76,6 +77,9 @@ void CodeGenFunction::GenerateCode(const FunctionDecl *FD) {
   else if (FD->getStorageClass() == FunctionDecl::Static)
     CurFn->setLinkage(llvm::Function::InternalLinkage);
 
+  if (FD->getAttr<FastCallAttr>())
+    CurFn->setCallingConv(llvm::CallingConv::Fast);
+
   if (const VisibilityAttr *attr = FD->getAttr<VisibilityAttr>())
     CurFn->setVisibility(attr->getVisibility());
   // FIXME: else handle -fvisibility
index 05c6f7755c64860d055455ab24f2909894b548d4..0ff9447d2e6be8998db38b0089bbc594bbc88614 100644 (file)
@@ -65,11 +65,13 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
     if (!memcmp(Str, "aligned", 7)) return AT_aligned;
     if (!memcmp(Str, "nothrow", 7)) return AT_nothrow;
     if (!memcmp(Str, "nonnull", 7)) return AT_nonnull;
+    if (!memcmp(Str, "stdcall", 7)) return AT_stdcall;
     break;
   case 8:
     if (!memcmp(Str, "annotate", 8)) return AT_annotate;
     if (!memcmp(Str, "noreturn", 8)) return AT_noreturn;
     if (!memcmp(Str, "noinline", 8)) return AT_noinline;
+    if (!memcmp(Str, "fastcall", 8)) return AT_fastcall;
     break;
   case 9:
     if (!memcmp(Str, "dllimport", 9)) return AT_dllimport;
index a3934c76dd648795de0b0ac1e3dbc51798af76f2..2fe54de5d02cba88501c492c90291257f3d808e2 100644 (file)
@@ -280,6 +280,8 @@ private:
   void HandleVisibilityAttribute(Decl *d, AttributeList *rawAttr);
   void HandleNothrowAttribute(Decl *d, AttributeList *rawAttr);
   void HandleFormatAttribute(Decl *d, AttributeList *rawAttr);
+  void HandleStdCallAttribute(Decl *d, AttributeList *rawAttr);
+  void HandleFastCallAttribute(Decl *d, AttributeList *rawAttr);
   
   void WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method,
                            bool &IncompleteImpl);
@@ -501,7 +503,7 @@ public:
                                        SourceLocation *CommaLocs,
                                        SourceLocation BuiltinLoc, 
                                        SourceLocation RParenLoc);
-  
+
   // __builtin_va_arg(expr, type)
   virtual ExprResult ActOnVAArg(SourceLocation BuiltinLoc,
                                 ExprTy *expr, TypeTy *type,
index 60fe7ab043aa8a9d2d2bf3b408e8ff03e4a10ae9..7307fc4762f6699d23fb5c6ff851fbaa3adcfdc6 100644 (file)
@@ -1811,6 +1811,12 @@ void Sema::HandleDeclAttribute(Decl *New, AttributeList *Attr) {
   case AttributeList::AT_nothrow:
     HandleNothrowAttribute(New, Attr);
     break;
+  case AttributeList::AT_stdcall:
+    HandleStdCallAttribute(New, Attr);
+    break;
+  case AttributeList::AT_fastcall:
+    HandleFastCallAttribute(New, Attr);
+    break;
   case AttributeList::AT_aligned:
     HandleAlignedAttribute(New, Attr);
     break;
@@ -2073,6 +2079,28 @@ void Sema::HandleDLLExportAttribute(Decl *d, AttributeList *rawAttr) {
   d->addAttr(new DLLExportAttr());
 }
 
+void Sema::HandleStdCallAttribute(Decl *d, AttributeList *rawAttr) {
+  // check the attribute arguments.
+  if (rawAttr->getNumArgs() != 0) {
+    Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
+         std::string("0"));
+    return;
+  }
+
+  d->addAttr(new StdCallAttr());
+}
+
+void Sema::HandleFastCallAttribute(Decl *d, AttributeList *rawAttr) {
+  // check the attribute arguments.
+  if (rawAttr->getNumArgs() != 0) {
+    Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
+         std::string("0"));
+    return;
+  }
+
+  d->addAttr(new FastCallAttr());
+}
+
 void Sema::HandleNothrowAttribute(Decl *d, AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 0) {
index 160c4ac6e84c0f5faa8eda8ee716e392915f7b16..72bc8a9ffaaf8f59fefd875555e554019b9f929f 100644 (file)
@@ -34,7 +34,9 @@ public:
     DLLExport,
     NoThrow,
     Format,
-    Visibility
+    Visibility,
+    FastCall,
+    StdCall
   };
     
 private:
@@ -196,6 +198,26 @@ public:
   static bool classof(const DLLExportAttr *A) { return true; }
 };
 
+class FastCallAttr : public Attr {
+public:
+  FastCallAttr() : Attr(FastCall) {}
+
+  // Implement isa/cast/dyncast/etc.
+
+  static bool classof(const Attr *A) { return A->getKind() == FastCall; }
+  static bool classof(const FastCallAttr *A) { return true; }
+};
+
+class StdCallAttr : public Attr {
+public:
+  StdCallAttr() : Attr(StdCall) {}
+
+  // Implement isa/cast/dyncast/etc.
+
+  static bool classof(const Attr *A) { return A->getKind() == StdCall; }
+  static bool classof(const StdCallAttr *A) { return true; }
+};
+
 }  // end namespace clang
 
 #endif
index c8906d7d82f104c686fc62d860e13533a06cdd0e..a8057d96d83e64255265767dbbce3a83c7e1e765 100644 (file)
@@ -60,6 +60,8 @@ public:
     AT_dllimport,
     AT_dllexport,
     AT_visibility,
+    AT_fastcall,
+    AT_stdcall,
     AT_nothrow,
     AT_noinline,
     AT_warn_unused_result