[PATCH] D29599: Clang Changes for alloc_align

Erich Keane via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 29 15:47:44 PDT 2017


erichkeane marked 2 inline comments as done.
erichkeane added inline comments.


================
Comment at: include/clang/Basic/AttrDocs.td:252
+declaration to specify that the return value of the function (which must be a
+pointer type) has an alignment specified by the indicated parameter. The
+alignment parameter is one-based. In the case of member functions, the
----------------
rjmccall wrote:
> "that the return value of the function ... is at least as aligned as the
> value of the indicated parameter.  The parameter is given by its index
> in the list of formal parameters; the first parameter has index 1 unless
> the function is a C++ non-static member function, in which case the
> first parameter has index 2 to account for the implicit ``this`` parameter."
> 
> What's the behavior of this attribute if the given attribute is not a power of 2?
> Does it silently have no effect, or is it U.B.?
Thanks for the wording, I like this.

It isn't checked for that, so I'll say UB.  A little bit of a caveat emptor here.


================
Comment at: include/clang/Basic/AttrDocs.td:270
+condition that the code already ensures is true. It does not cause the compiler
+to enforce the provided alignment assumption.
+  }];
----------------
rjmccall wrote:
> "Note that this attribute merely informs the compiler that a function always
> returns a sufficiently aligned pointer.  It does not cause the compiler to emit
> code to enforce that alignment.  The behavior is undefined if the returned
> pointer is not sufficiently aligned."
Thanks again!


================
Comment at: lib/CodeGen/CGCall.cpp:4352
+    } else if (const auto *AA = TargetDecl->getAttr<AllocAlignAttr>()) {
+      llvm::Value *ParamVal = IRCallArgs[AA->getParamIndex() - 1];
+      EmitAlignmentAssumption(Ret.getScalarVal(), ParamVal);
----------------
rjmccall wrote:
> IRCallArgs is not one-to-one with the list of formal parameters.  You need to be taking the value out of CallArgList.  Three test cases come to mind:
> 
> 1. There's an earlier struct argument which expands to no IR arguments.
> 2. There's an earlier struct argument which expands to multiple IR arguments.
> 3. The alignment argument itself expands to multiple IR arguments.  For example, __int128_t on x86-64.
Awesome, thanks for the info!  I'll change that.


https://reviews.llvm.org/D29599





More information about the cfe-commits mailing list