aaron.ballman added inline comments.

================
Comment at: include/clang/Basic/Attr.td:1494
+def NoStackProtector : InheritableAttr {
+  let Spellings = [GCC<"no_stack_protector">];
+  let Subjects = SubjectList<[Function]>;
----------------
rnk wrote:
> aaron.ballman wrote:
> > manojgupta wrote:
> > > aaron.ballman wrote:
> > > > This is not a GCC attribute, so this should use the Clang spelling.
> > > > 
> > > > However, why spell the attribute this way rather than use the GCC 
> > > > spelling (`optimize("no-stack-protector")`?
> > > Thanks, I have changed it to use Clang spelling.
> > > 
> > > Regarding __attribute__((optimize("..."))), it is a generic facility in 
> > > GCC that works for many optimizer flags.
> > > Clang currently does not support this syntax currently instead preferring 
> > > its own version for some options e.g. -O0. 
> > > e.g.  
> > > ```
> > > __attribute__((optimize("O0")))  // clang version is 
> > > __attribute__((optnone)) 
> > > ```
> > > If we want to support the GCC syntax, future expectation would be support 
> > > more flags under this syntax. Is that the path we want to take (I do not 
> > > know the history related to previous syntax decisions but better GCC 
> > > compatibility will be a nice thing to have) 
> > The history of `optnone` predates my involvement with Clang and I've not 
> > been able to find the original review thread (I did find the one where I 
> > gave my LGTM on the original patch, but that was a resubmission after the 
> > original design was signed off).
> > 
> > I'm not keen on attributes that have the same semantics but differ in 
> > spelling from attributes supported by GCC unless there's a good reason to 
> > deviate. Given that we've already deviated, I'd like to understand why 
> > better -- I don't want to push you to implement something we've already 
> > decided was a poor design, but I also don't want to accept code if we can 
> > instead use syntax that is compatible with GCC.
> I do not think we want to pursue supporting generic optimization flags with 
> `__attribute__((optimize("...")))`.
> 
> Part of the reason we only support `optnone` is that LLVM's pass pipeline is 
> global to the entire module. It's not trivial to enable optimizations for a 
> single function, but it is much easier to have optimization passes skip 
> functions marked `optnone`.
Thank you, @rnk, that makes sense to me and seems like a solid reason for this 
approach.


================
Comment at: include/clang/Basic/AttrDocs.td:2746
+  let Content = [{
+Clang supports the ``__attribute__((no_stack_protector))`` attribute to disable
+stack protector on the specified functions. This attribute is useful for
----------------
to disable -> which disables the


================
Comment at: include/clang/Basic/AttrDocs.td:2747
+Clang supports the ``__attribute__((no_stack_protector))`` attribute to disable
+stack protector on the specified functions. This attribute is useful for
+selectively disabling stack protector on some functions when building with
----------------
functions -> function


================
Comment at: include/clang/Basic/AttrDocs.td:2748
+stack protector on the specified functions. This attribute is useful for
+selectively disabling stack protector on some functions when building with
+-fstack-protector compiler options.
----------------
disabling stack -> disabling the stack


================
Comment at: include/clang/Basic/AttrDocs.td:2749
+selectively disabling stack protector on some functions when building with
+-fstack-protector compiler options.
+
----------------
options -> option

Backticks around the compiler flag.


================
Comment at: include/clang/Basic/AttrDocs.td:2751
+
+For example, it disables stack protector for the function foo but function bar
+will still be built with stack protector with -fstack-protector option.
----------------
disables stack -> disables the stack

Please put backticks around `foo` and `bar` so they highlight as code.


================
Comment at: include/clang/Basic/AttrDocs.td:2752
+For example, it disables stack protector for the function foo but function bar
+will still be built with stack protector with -fstack-protector option.
+
----------------
with stack -> with the stack
with -fstack-protector -> with the -fstack-protector

Backticks around the compiler flag.


================
Comment at: include/clang/Basic/AttrDocs.td:2757
+    int __attribute__((no_stack_protector))
+    foo (int); // stack protection will be disabled for foo.
+
----------------
C requires parameters to be named; alternatively, you can use the C++ spelling 
of the attribute.


================
Comment at: include/clang/Basic/AttrDocs.td:2759
+
+    int bar(int a); // bar can be built with stack protector.
+
----------------
with stack -> with the stack


================
Comment at: test/Sema/no_stack_protector.c:4
+void __attribute__((no_stack_protector)) foo() {}
+int __attribute__((no_stack_protector)) var; // expected-warning 
{{'no_stack_protector' attribute only applies to functions}}
----------------
Can you also add a test to ensure the attribute accepts no arguments?


Repository:
  rC Clang

https://reviews.llvm.org/D46300



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to