aaron.ballman added inline comments.

================
Comment at: clang/include/clang/AST/Randstruct.h:31-35
+using llvm::SmallVectorImpl;
+
+bool randomizeStructureLayout(const ASTContext &Context, llvm::StringRef Name,
+                              llvm::ArrayRef<Decl *> Fields,
+                              SmallVectorImpl<Decl *> &FinalOrdering);
----------------
Might as well be consistent with the other type names.


================
Comment at: clang/include/clang/Driver/Options.td:2122-2133
+def frandomize_layout_seed_EQ
+    : Joined<["-"], "frandomize-layout-seed=">,
+      MetaVarName<"<seed>">,
+      Group<f_clang_Group>,
+      Flags<[CC1Option]>,
+      HelpText<"The seed used by the randomize structure layout feature">;
+def frandomize_layout_seed_file_EQ
----------------
You should condense these a bit to keep the style the same as the surrounding 
code.


================
Comment at: clang/lib/AST/Randstruct.cpp:71-75
+  std::unique_ptr<Bucket> CurrentBucket = nullptr;
+
+  // The current bucket containing the run of adjacent bitfields to ensure they
+  // remain adjacent.
+  std::unique_ptr<BitfieldRunBucket> CurrentBitfieldRun = nullptr;
----------------
Default ctor already does the right thing, so no need to do the initialization.


================
Comment at: clang/lib/Sema/SemaDeclAttr.cpp:8550-8556
+  case ParsedAttr::AT_RandomizeLayout:
+    handleSimpleAttribute<RandomizeLayoutAttr>(S, D, AL);
+    break;
+  case ParsedAttr::AT_NoRandomizeLayout:
+    // Drop the "randomize_layout" attribute if it's on the decl.
+    D->dropAttr<RandomizeLayoutAttr>();
+    break;
----------------
void wrote:
> aaron.ballman wrote:
> > void wrote:
> > > aaron.ballman wrote:
> > > > I don't think this is sufficient. Consider redeclaration merging cases:
> > > > ```
> > > > struct [[gnu::randomize_layout]] S;
> > > > struct [[gnu::no_randomize_layout]] S {};
> > > > 
> > > > struct [[gnu::no_randomize_layout]] T;
> > > > struct [[gnu::randomize_layout]] T {};
> > > > ```
> > > > I think if the user accidentally does something like this, it should be 
> > > > diagnosed. I would have assumed this would warrant an error diagnostic 
> > > > because the user is obviously confused as to what they want, but it 
> > > > seems GCC ignores the subsequent diagnostic with a warning: 
> > > > https://godbolt.org/z/1q8dazYPW.
> > > > 
> > > > There's also the "confused attribute list" case which GCC just... 
> > > > does... things... with: https://godbolt.org/z/rnfsn7hG1. I think we 
> > > > want to behave more consistently with how we treat these cases.
> > > > 
> > > > Either way, we shouldn't be silent.
> > > The GCC feature is done via a plugin in Linux. So godbolt probably won't 
> > > work in this case. I'll check to see how GCC responds to these attribute 
> > > situations.
> > Thoughts on this?
> Okay, finally tested it with the GCC plugin. It doesn't produce a diagnostic. 
> I'm not sure if that's the correct behavior, but at least it matches. How is 
> such a thing handled with similar attributes?
> Okay, finally tested it with the GCC plugin. It doesn't produce a diagnostic. 
> I'm not sure if that's the correct behavior, but at least it matches. How is 
> such a thing handled with similar attributes?

As you might be unsurprised to learn: inconsistently. :-D However, we typically 
try to make attributes mutually exclusive (e.g., `hot` and `cold`, `global` and 
`device`, etc).

Unfortunately, I gave you some advice earlier to combine into one semantic 
attribute and that may have been less-than-awesome advice. Attr.td supports the 
ability to trivially define to attributes as mutually exclusive (e.g., `def : 
MutualExclusions<[Hot, Cold]>;` but this works on the *attribute* level and not 
the *spelling* level.

It's probably easier for you to split the definition back into two attributes 
in Attr.td and just use the `MutualExclusions` support we already have. Sorry 
for that churn! If you wanted to (and I certainly don't insist), another option 
would be to modify ClangAttrEmitter.cpp and Attr.td to support mutual exclusion 
syntax on the spelling level, so you could do something like:
```
def : MutualExclusions<[
  RandomizeLayout<GCC<"randomize_layout">>,
  RandomizeLayout<GCC<"no_randomize_layout">>
]>;
```
where you specify the attribute and the spelling, then you could leave 
`RandomizeLayout` as a single semantic spelling. But again, I don't insist.


================
Comment at: clang/unittests/AST/RandstructTest.cpp:154-158
+#ifdef _WIN32
+  const field_names Expected = {"lettuce", "bacon", "mayonnaise", "tomato"};
+#else
+  const field_names Expected = {"mayonnaise", "bacon", "tomato", "lettuce"};
+#endif
----------------
Any idea what's gone wrong here? (Do we have a bug to file because these come 
out reversed? If so, can you add a FIXME comment here that we expect this test 
to change someday?)


================
Comment at: clang/unittests/AST/RandstructTest.cpp:208-213
+// FIXME: Clang trips an assertion in the DiagnosticsEngine when the warning is
+// emitted while running under the test suite:
+// clang/lib/Frontend/TextDiagnosticPrinter.cpp:150: virtual void
+// 
clang::TextDiagnosticPrinter::HandleDiagnostic(clang::DiagnosticsEngine::Level,
+// const clang::Diagnostic&): Assertion `TextDiag && "UnExpected diagnostic
+// outside source file processing"' failed.
----------------
Is the assertion unrelated to the changes in your patch and you just happen to 
hit it with this test? (I get worried when tests trigger assertions.)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D121556/new/

https://reviews.llvm.org/D121556

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

Reply via email to