Now that PR5280 is fixed, I'm turning my attention to the two other bugs
preventing me from compiling Wine, specifically PR5253 and PR5254. I've
decided to take on PR5254 first, because it seems easier.

Anyway, this patch should start us on the way to fixing PR5254, by
allowing us to use the force_align_arg_pointer attribute. It adds the
attribute as an x86-specific one (the GCC info page lists it as such),
using Anton's target-specific attribute support. If we want to support
other architectures, though, I can easily fix that.

Right now, the attribute is a no-op (NOTE: this is the same behavior as
llvm-gcc); this really needs support from LLVM itself. (On second
thought, maybe I should give PR5253 a crack...)

Chip

Index: test/Sema/x86-attr-force-align-arg-pointer.c
===================================================================
--- test/Sema/x86-attr-force-align-arg-pointer.c        (revision 0)
+++ test/Sema/x86-attr-force-align-arg-pointer.c        (revision 0)
@@ -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)();
+
Index: include/clang/AST/Attr.h
===================================================================
--- include/clang/AST/Attr.h    (revision 95514)
+++ include/clang/AST/Attr.h    (working copy)
@@ -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
Index: lib/Sema/TargetAttributesSema.cpp
===================================================================
--- lib/Sema/TargetAttributesSema.cpp   (revision 95514)
+++ lib/Sema/TargetAttributesSema.cpp   (working copy)
@@ -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);
   }
 }
 
Index: lib/AST/AttrImpl.cpp
===================================================================
--- lib/AST/AttrImpl.cpp        (revision 95514)
+++ lib/AST/AttrImpl.cpp        (working copy)
@@ -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);
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to