r320734 - [Preprocessor] Implement __is_target_{arch|vendor|os|environment} function-like
Alex L via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 14 11:23:37 PST 2017
Sorry, I forgot to add the tests in SVN. I committed them in 320735
On 14 December 2017 at 11:22, Alex Lorenz via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: arphaman
> Date: Thu Dec 14 11:22:02 2017
> New Revision: 320734
>
> URL: http://llvm.org/viewvc/llvm-project?rev=320734&view=rev
> Log:
> [Preprocessor] Implement __is_target_{arch|vendor|os|environment}
> function-like
> builtin macros
>
> This patch implements the __is_target_arch, __is_target_vendor,
> __is_target_os,
> and __is_target_environment Clang preprocessor extensions that were
> proposed by
> @compnerd in Bob's cfe-dev post:
> http://lists.llvm.org/pipermail/cfe-dev/2017-November/056166.html.
>
> These macros can be used to examine the components of the target triple at
> compile time. A has_builtin(is_target_???) preprocessor check can be used
> to
> check for their availability.
>
> __is_target_arch allows you to check if an arch is specified without
> worring
> about a specific subarch, e.g.
>
> __is_target_arch(arm) returns 1 for the target arch "armv7"
> __is_target_arch(armv7) returns 1 for the target arch "armv7"
> __is_target_arch(armv6) returns 0 for the target arch "armv7"
>
> __is_target_vendor and __is_target_environment match the specific vendor
> or environment. __is_target_os matches the specific OS, but
> __is_target_os(darwin) will match any Darwin-based OS. "Unknown" can be
> used
> to test if the triple's component is specified.
>
> rdar://35753116
>
> Differential Revision: https://reviews.llvm.org/D41087
>
> Modified:
> cfe/trunk/docs/ReleaseNotes.rst
> cfe/trunk/include/clang/Lex/Preprocessor.h
> cfe/trunk/lib/Lex/PPMacroExpansion.cpp
>
> Modified: cfe/trunk/docs/ReleaseNotes.rst
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/
> ReleaseNotes.rst?rev=320734&r1=320733&r2=320734&view=diff
> ============================================================
> ==================
> --- cfe/trunk/docs/ReleaseNotes.rst (original)
> +++ cfe/trunk/docs/ReleaseNotes.rst Thu Dec 14 11:22:02 2017
> @@ -110,6 +110,10 @@ Non-comprehensive list of changes in thi
> If a gcc installation is found, it still prefers ``.ctors`` if the found
> gcc is older than 4.7.0.
>
> +- The new builtin preprocessor macros ``__is_target_arch``,
> + ``__is_target_vendor``, ``__is_target_os``, and
> ``__is_target_environment``
> + can be used to to examine the individual components of the target
> triple.
> +
> New Compiler Flags
> ------------------
>
>
> Modified: cfe/trunk/include/clang/Lex/Preprocessor.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Lex/Preprocessor.h?rev=320734&r1=320733&r2=320734&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Lex/Preprocessor.h (original)
> +++ cfe/trunk/include/clang/Lex/Preprocessor.h Thu Dec 14 11:22:02 2017
> @@ -175,6 +175,10 @@ class Preprocessor {
> IdentifierInfo *Ident__has_cpp_attribute; // __has_cpp_attribute
> IdentifierInfo *Ident__has_c_attribute; // __has_c_attribute
> IdentifierInfo *Ident__has_declspec; //
> __has_declspec_attribute
> + IdentifierInfo *Ident__is_target_arch; // __is_target_arch
> + IdentifierInfo *Ident__is_target_vendor; // __is_target_vendor
> + IdentifierInfo *Ident__is_target_os; // __is_target_os
> + IdentifierInfo *Ident__is_target_environment; //
> __is_target_environment
>
> SourceLocation DATELoc, TIMELoc;
>
>
> Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/
> PPMacroExpansion.cpp?rev=320734&r1=320733&r2=320734&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original)
> +++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Thu Dec 14 11:22:02 2017
> @@ -375,6 +375,11 @@ void Preprocessor::RegisterBuiltinMacros
> Ident__has_include_next = RegisterBuiltinMacro(*this,
> "__has_include_next");
> Ident__has_warning = RegisterBuiltinMacro(*this, "__has_warning");
> Ident__is_identifier = RegisterBuiltinMacro(*this,
> "__is_identifier");
> + Ident__is_target_arch = RegisterBuiltinMacro(*this,
> "__is_target_arch");
> + Ident__is_target_vendor = RegisterBuiltinMacro(*this,
> "__is_target_vendor");
> + Ident__is_target_os = RegisterBuiltinMacro(*this, "__is_target_os");
> + Ident__is_target_environment =
> + RegisterBuiltinMacro(*this, "__is_target_environment");
>
> // Modules.
> Ident__building_module = RegisterBuiltinMacro(*this,
> "__building_module");
> @@ -1593,6 +1598,57 @@ static IdentifierInfo *ExpectFeatureIden
> return nullptr;
> }
>
> +/// Implements the __is_target_arch builtin macro.
> +static bool isTargetArch(const TargetInfo &TI, const IdentifierInfo *II) {
> + std::string ArchName = II->getName().lower() + "--";
> + llvm::Triple Arch(ArchName);
> + const llvm::Triple &TT = TI.getTriple();
> + if (TT.isThumb()) {
> + // arm matches thumb or thumbv7. armv7 matches thumbv7.
> + if ((Arch.getSubArch() == llvm::Triple::NoSubArch ||
> + Arch.getSubArch() == TT.getSubArch()) &&
> + ((TT.getArch() == llvm::Triple::thumb &&
> + Arch.getArch() == llvm::Triple::arm) ||
> + (TT.getArch() == llvm::Triple::thumbeb &&
> + Arch.getArch() == llvm::Triple::armeb)))
> + return true;
> + }
> + // Check the parsed arch when it has no sub arch to allow Clang to
> + // match thumb to thumbv7 but to prohibit matching thumbv6 to thumbv7.
> + return (Arch.getSubArch() == llvm::Triple::NoSubArch &&
> + Arch.getArch() == TT.getArch()) ||
> + Arch.getArchName() == TT.getArchName();
> +}
> +
> +/// Implements the __is_target_vendor builtin macro.
> +static bool isTargetVendor(const TargetInfo &TI, const IdentifierInfo
> *II) {
> + StringRef VendorName = TI.getTriple().getVendorName();
> + if (VendorName.empty())
> + VendorName = "unknown";
> + return VendorName.equals_lower(II->getName());
> +}
> +
> +/// Implements the __is_target_os builtin macro.
> +static bool isTargetOS(const TargetInfo &TI, const IdentifierInfo *II) {
> + std::string OSName =
> + (llvm::Twine("unknown-unknown-") + II->getName().lower()).str();
> + llvm::Triple OS(OSName);
> + if (OS.getOS() == llvm::Triple::Darwin) {
> + // Darwin matches macos, ios, etc.
> + return TI.getTriple().isOSDarwin();
> + }
> + return TI.getTriple().getOS() == OS.getOS();
> +}
> +
> +/// Implements the __is_target_environment builtin macro.
> +static bool isTargetEnvironment(const TargetInfo &TI,
> + const IdentifierInfo *II) {
> + StringRef EnvName = TI.getTriple().getEnvironmentName();
> + if (EnvName.empty())
> + EnvName = "unknown";
> + return EnvName.equals_lower(II->getName());
> +}
> +
> /// ExpandBuiltinMacro - If an identifier token is read that is to be
> expanded
> /// as a builtin macro, handle it and return the next token as 'Tok'.
> void Preprocessor::ExpandBuiltinMacro(Token &Tok) {
> @@ -1755,6 +1811,10 @@ void Preprocessor::ExpandBuiltinMacro(To
> .Case("__make_integer_seq", LangOpts.CPlusPlus)
> .Case("__type_pack_element", LangOpts.CPlusPlus)
> .Case("__builtin_available", true)
> + .Case("__is_target_arch", true)
> + .Case("__is_target_vendor", true)
> + .Case("__is_target_os", true)
> + .Case("__is_target_environment", true)
> .Default(false);
> }
> });
> @@ -1906,6 +1966,34 @@ void Preprocessor::ExpandBuiltinMacro(To
> Diag(LParenLoc, diag::note_matching) << tok::l_paren;
> }
> return;
> + } else if (II == Ident__is_target_arch) {
> + EvaluateFeatureLikeBuiltinMacro(
> + OS, Tok, II, *this, [this](Token &Tok, bool &HasLexedNextToken)
> -> int {
> + IdentifierInfo *II = ExpectFeatureIdentifierInfo(
> + Tok, *this, diag::err_feature_check_malformed);
> + return II && isTargetArch(getTargetInfo(), II);
> + });
> + } else if (II == Ident__is_target_vendor) {
> + EvaluateFeatureLikeBuiltinMacro(
> + OS, Tok, II, *this, [this](Token &Tok, bool &HasLexedNextToken)
> -> int {
> + IdentifierInfo *II = ExpectFeatureIdentifierInfo(
> + Tok, *this, diag::err_feature_check_malformed);
> + return II && isTargetVendor(getTargetInfo(), II);
> + });
> + } else if (II == Ident__is_target_os) {
> + EvaluateFeatureLikeBuiltinMacro(
> + OS, Tok, II, *this, [this](Token &Tok, bool &HasLexedNextToken)
> -> int {
> + IdentifierInfo *II = ExpectFeatureIdentifierInfo(
> + Tok, *this, diag::err_feature_check_malformed);
> + return II && isTargetOS(getTargetInfo(), II);
> + });
> + } else if (II == Ident__is_target_environment) {
> + EvaluateFeatureLikeBuiltinMacro(
> + OS, Tok, II, *this, [this](Token &Tok, bool &HasLexedNextToken)
> -> int {
> + IdentifierInfo *II = ExpectFeatureIdentifierInfo(
> + Tok, *this, diag::err_feature_check_malformed);
> + return II && isTargetEnvironment(getTargetInfo(), II);
> + });
> } else {
> llvm_unreachable("Unknown identifier!");
> }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171214/fe28a38d/attachment-0001.html>
More information about the cfe-commits
mailing list