On Thu, May 14, 2015 at 6:34 PM, Peter Collingbourne <[email protected]> wrote: > On Thu, May 14, 2015 at 04:44:45PM -0400, Aaron Ballman wrote: >> I was unclear, I apologize. I was thinking along the lines of: >> >> >> def NoSanitizeAttrs : InheritableAttr { >> let Spellings = [GNU<"no_sanitize_thread">, GNU<"no_sanitize_memory">, >> etc]; >> let ASTNode = 0; // No AST representations; creates a NoSanitizeAttr >> object instead >> let Subjects = SubjectList<[Function], ErrorDiag>; >> let Documentation = [Undocumented]; >> } >> >> Then in SemaDeclAttr.cpp, the handler for all these attributes can be >> implemented as instead attaching a no_sanitize attribute with the >> proper mask. The downside to this is that it could lose source >> fidelity when pretty printing (it would be equivalent, but not >> identical attributes in that case). The upside is that we're not >> carrying around AST nodes for these things, and we can remove some of >> the clutter in Attr.td. > > But we can't document the attributes properly that way, right? We probably > want > to keep the attribute documentation as these attributes are GCC-compatible.
We can keep the attributes documented. I put Undocumented because I forgot that we had a better way to handle it. :-) The Documentation tablegen type has a Deprecated field. So the NoSanitizeFooDocs for each of the deprecated ones would have its Deprecated field filled out, pointing to the NoSanitizeDocs replacement. Then the Documentation for the conglomerate definition would be: let Documentation = [NoSanitizeAddressDocs, NoSanitizeThreadDocs, NoSanitizeMemoryDocs]; which should cover the documentation needs. ~Aaron > > Thanks, > -- > Peter _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
