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