HLJ2009 created this revision. HLJ2009 added a reviewer: aaron.ballman. Herald added a subscriber: cfe-commits.
I tested the alias attribute on my own Apple laptop (Target: x86_64-apple-darwin17.5.0). First, I use __has_attribute to test that the alias is usable or not. The test code is as follows: #include <stdio.h> void print() { #if __has_attribute(alias) printf("has attribute"); #else printf("has not attribute"); #endif } int main() { print(); return 0; } Compiled using clang, the output result is has attribute, but when i use the following code to verify #include <stdio.h> int oldname = 1; extern int newname __attribute__((alias("oldname"))); // declaration void foo(void) { printf("newname = %d\n", newname); // prints 1 } int main() { foo(); return 0; } It told me alias.c:3:35: error: aliases are not supported on darwin.so we should exclude the platform. Repository: rC Clang https://reviews.llvm.org/D46805 Files: include/clang/Basic/Attr.td utils/TableGen/ClangAttrEmitter.cpp Index: utils/TableGen/ClangAttrEmitter.cpp =================================================================== --- utils/TableGen/ClangAttrEmitter.cpp +++ utils/TableGen/ClangAttrEmitter.cpp @@ -2784,6 +2784,11 @@ GenerateTargetSpecificAttrCheck(R, Test, FnName, "OSes", "T.getOS()", "llvm::Triple::"); + // If the Negated is 1 in specific, it indicates that the attribute + // is not supported on this platform + if(R->getValueAsBit("Negated")) + Test = "!(" + Test + ")"; + // If one or more CXX ABIs are specified, check those as well. GenerateTargetSpecificAttrCheck(R, Test, FnName, "CXXABIs", "Target.getCXXABI().getKind()", Index: include/clang/Basic/Attr.td =================================================================== --- include/clang/Basic/Attr.td +++ include/clang/Basic/Attr.td @@ -296,6 +296,9 @@ // Specifies Object Formats for which the target applies, based off the // ObjectFormatType enumeration in Triple.h list<string> ObjectFormats; + // It indicates that a certain attribute is not supported on a specific + // platform, turn on support for this attribute by default + bit Negated = 0; } class TargetArch<list<string> arches> : TargetSpec { @@ -318,6 +321,13 @@ let ObjectFormats = ["ELF"]; } +// We do not support the alias attribute on Apple platforms, +// so I define a platform other than the Apple platform. +def TargetDarwinNegative : TargetArch<["x86", "x86_64"]> { + let OSes = ["MacOSX"]; + let Negated = 1; +} + // Attribute subject match rules that are used for #pragma clang attribute. // // A instance of AttrSubjectMatcherRule represents an individual match rule. @@ -553,7 +563,8 @@ let Documentation = [Undocumented]; } -def Alias : Attr { +// We do not support alias attribute on Apple platform, so we exclude the platform. +def Alias : Attr, TargetSpecificAttr<TargetDarwinNegative> { let Spellings = [GCC<"alias">]; let Args = [StringArgument<"Aliasee">]; let Subjects = SubjectList<[Function, GlobalVar], ErrorDiag>;
Index: utils/TableGen/ClangAttrEmitter.cpp =================================================================== --- utils/TableGen/ClangAttrEmitter.cpp +++ utils/TableGen/ClangAttrEmitter.cpp @@ -2784,6 +2784,11 @@ GenerateTargetSpecificAttrCheck(R, Test, FnName, "OSes", "T.getOS()", "llvm::Triple::"); + // If the Negated is 1 in specific, it indicates that the attribute + // is not supported on this platform + if(R->getValueAsBit("Negated")) + Test = "!(" + Test + ")"; + // If one or more CXX ABIs are specified, check those as well. GenerateTargetSpecificAttrCheck(R, Test, FnName, "CXXABIs", "Target.getCXXABI().getKind()", Index: include/clang/Basic/Attr.td =================================================================== --- include/clang/Basic/Attr.td +++ include/clang/Basic/Attr.td @@ -296,6 +296,9 @@ // Specifies Object Formats for which the target applies, based off the // ObjectFormatType enumeration in Triple.h list<string> ObjectFormats; + // It indicates that a certain attribute is not supported on a specific + // platform, turn on support for this attribute by default + bit Negated = 0; } class TargetArch<list<string> arches> : TargetSpec { @@ -318,6 +321,13 @@ let ObjectFormats = ["ELF"]; } +// We do not support the alias attribute on Apple platforms, +// so I define a platform other than the Apple platform. +def TargetDarwinNegative : TargetArch<["x86", "x86_64"]> { + let OSes = ["MacOSX"]; + let Negated = 1; +} + // Attribute subject match rules that are used for #pragma clang attribute. // // A instance of AttrSubjectMatcherRule represents an individual match rule. @@ -553,7 +563,8 @@ let Documentation = [Undocumented]; } -def Alias : Attr { +// We do not support alias attribute on Apple platform, so we exclude the platform. +def Alias : Attr, TargetSpecificAttr<TargetDarwinNegative> { let Spellings = [GCC<"alias">]; let Args = [StringArgument<"Aliasee">]; let Subjects = SubjectList<[Function, GlobalVar], ErrorDiag>;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits