]> granicus.if.org Git - clang/commitdiff
Add documentation for force_align_arg_pointer function attribute
authorErich Keane <erich.keane@intel.com>
Thu, 31 Aug 2017 21:08:24 +0000 (21:08 +0000)
committerErich Keane <erich.keane@intel.com>
Thu, 31 Aug 2017 21:08:24 +0000 (21:08 +0000)
Patch By: anatol.pomozov (anatol.pomozov@gmail.com)

Differential Revision: https://reviews.llvm.org/D37312

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

include/clang/Basic/Attr.td
include/clang/Basic/AttrDocs.td

index 7cf307efc96ace9303410d5300c45e5f2a98fe13..8b7eb930044b9da68f1ef670ad7b1eb5678d21bd 100644 (file)
@@ -2043,11 +2043,11 @@ def AnyX86NoCallerSavedRegisters : InheritableAttr,
 }
 
 def X86ForceAlignArgPointer : InheritableAttr, TargetSpecificAttr<TargetAnyX86> {
-  let Spellings = [GNU<"force_align_arg_pointer">];
+  let Spellings = [GCC<"force_align_arg_pointer">];
   // Technically, this appertains to a FunctionDecl, but the target-specific
   // code silently allows anything function-like (such as typedefs or function
   // pointers), but does not apply the attribute to them.
-  let Documentation = [Undocumented];
+  let Documentation = [X86ForceAlignArgPointerDocs];
 }
 
 def NoSanitize : InheritableAttr {
index 96f7c450579b11cd03195beec404a623bcb7234c..027c597c6e7de9f602b381ceebd346a526c081f6 100644 (file)
@@ -2803,6 +2803,31 @@ For example:
   }];
 }
 
+def X86ForceAlignArgPointerDocs : Documentation {
+  let Category = DocCatFunction;
+  let Content = [{
+Use this attribute to force stack alignment.
+
+Legacy x86 code uses 4-byte stack alignment. Newer aligned SSE instructions
+(like 'movaps') that work with the stack require operands to be 16-byte aligned.
+This attribute realigns the stack in the function prologue to make sure the
+stack can be used with SSE instructions.
+
+Note that the x86_64 ABI forces 16-byte stack alignment at the call site.
+Because of this, 'force_align_arg_pointer' is not needed on x86_64, except in
+rare cases where the caller does not align the stack properly (e.g. flow
+jumps from i386 arch code).
+
+  .. code-block:: c
+
+    __attribute__ ((force_align_arg_pointer))
+    void f () {
+      ...
+    }
+
+  }];
+}
+
 def SwiftCallDocs : Documentation {
   let Category = DocCatVariable;
   let Content = [{