[cfe-commits] r95820 - in /cfe/trunk: include/clang/AST/Attr.h lib/AST/AttrImpl.cpp lib/Sema/TargetAttributesSema.cpp test/Sema/x86-attr-force-align-arg-pointer.c

Charles Davis cdavis at mines.edu
Wed Feb 10 15:06:53 PST 2010


Author: cdavis
Date: Wed Feb 10 17:06:52 2010
New Revision: 95820

URL: http://llvm.org/viewvc/llvm-project?rev=95820&view=rev
Log:
Add support for the force_align_arg_pointer attribute. This is an x86-specific
attribute, so it uses Anton's new target-specific attribute support. It's
supposed to ensure that the stack is 16-byte aligned, but since necessary
support is lacking from LLVM, this is a no-op for now.

Added:
    cfe/trunk/test/Sema/x86-attr-force-align-arg-pointer.c
Modified:
    cfe/trunk/include/clang/AST/Attr.h
    cfe/trunk/lib/AST/AttrImpl.cpp
    cfe/trunk/lib/Sema/TargetAttributesSema.cpp

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

==============================================================================
--- cfe/trunk/include/clang/AST/Attr.h (original)
+++ cfe/trunk/include/clang/AST/Attr.h Wed Feb 10 17:06:52 2010
@@ -96,7 +96,8 @@
     FIRST_TARGET_ATTRIBUTE,
     DLLExport,
     DLLImport,
-    MSP430Interrupt
+    MSP430Interrupt,
+    X86ForceAlignArgPointer
   };
 
 private:
@@ -570,6 +571,8 @@
   static bool classof(const MSP430InterruptAttr *A) { return true; }
 };
 
+DEF_SIMPLE_ATTR(X86ForceAlignArgPointer);
+
 #undef DEF_SIMPLE_ATTR
 
 }  // end namespace clang

Modified: cfe/trunk/lib/AST/AttrImpl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/AttrImpl.cpp?rev=95820&r1=95819&r2=95820&view=diff

==============================================================================
--- cfe/trunk/lib/AST/AttrImpl.cpp (original)
+++ cfe/trunk/lib/AST/AttrImpl.cpp Wed Feb 10 17:06:52 2010
@@ -55,6 +55,7 @@
 DEF_SIMPLE_ATTR_CLONE(Override)
 DEF_SIMPLE_ATTR_CLONE(DLLImport)
 DEF_SIMPLE_ATTR_CLONE(DLLExport)
+DEF_SIMPLE_ATTR_CLONE(X86ForceAlignArgPointer)
 
 Attr* PragmaPackAttr::clone(ASTContext &C) const {
   return ::new (C) PragmaPackAttr(Alignment);

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

==============================================================================
--- cfe/trunk/lib/Sema/TargetAttributesSema.cpp (original)
+++ cfe/trunk/lib/Sema/TargetAttributesSema.cpp Wed Feb 10 17:06:52 2010
@@ -70,6 +70,46 @@
   };
 }
 
+static void HandleX86ForceAlignArgPointerAttr(Decl *D,
+                                              const AttributeList& Attr,
+                                              Sema &S) {
+  // Check the attribute arguments.
+  if (Attr.getNumArgs() != 0) {
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+    return;
+  }
+
+  // If we try to apply it to a function pointer, don't warn, but don't
+  // do anything, either. It doesn't matter anyway, because there's nothing
+  // special about calling a force_align_arg_pointer function.
+  ValueDecl* VD = dyn_cast<ValueDecl>(D);
+  if(VD->getType()->isFunctionPointerType())
+    return;
+  // Attribute can only be applied to function types.
+  if(!isa<FunctionDecl>(D)) {
+    S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
+      << Attr.getName() << /* function */0;
+    return;
+  }
+
+  D->addAttr(::new (S.Context) X86ForceAlignArgPointerAttr());
+}
+
+namespace {
+  class X86AttributesSema : public TargetAttributesSema {
+  public:
+    X86AttributesSema() { }
+    bool ProcessDeclAttribute(Scope *scope, Decl *D,
+                              const AttributeList &Attr, Sema &S) const {
+      if (Attr.getName()->getName() == "force_align_arg_pointer") {
+        HandleX86ForceAlignArgPointerAttr(D, Attr, S);
+        return true;
+      }
+      return false;
+    }
+  };
+}
+
 const TargetAttributesSema &Sema::getTargetAttributesSema() const {
   if (TheTargetAttributesSema)
     return *TheTargetAttributesSema;
@@ -81,6 +121,8 @@
 
   case llvm::Triple::msp430:
     return *(TheTargetAttributesSema = new MSP430AttributesSema);
+  case llvm::Triple::x86:
+    return *(TheTargetAttributesSema = new X86AttributesSema);
   }
 }
 

Added: cfe/trunk/test/Sema/x86-attr-force-align-arg-pointer.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/x86-attr-force-align-arg-pointer.c?rev=95820&view=auto

==============================================================================
--- cfe/trunk/test/Sema/x86-attr-force-align-arg-pointer.c (added)
+++ cfe/trunk/test/Sema/x86-attr-force-align-arg-pointer.c Wed Feb 10 17:06:52 2010
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -triple i386-apple-darwin10 -fsyntax-only -verify %s
+
+int a __attribute__((force_align_arg_pointer)); // expected-warning{{attribute only applies to function types}}
+
+// It doesn't matter where the attribute is located.
+void b(void) __attribute__((force_align_arg_pointer));
+void __attribute__((force_align_arg_pointer)) c(void);
+
+// Functions only have to be declared force_align_arg_pointer once.
+void b(void) {}
+
+// It doesn't matter which declaration has the attribute.
+void d(void);
+void __attribute__((force_align_arg_pointer)) d(void) {}
+
+// Attribute is ignored on function pointer types.
+void (__attribute__((force_align_arg_pointer)) *p)();
+





More information about the cfe-commits mailing list