| //==- AnnexKDetection.cpp - Annex K availability detection -------*- C++ -*-==// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file contains the implementation of utilities for detecting C11 Annex K | |
| // (Bounds-checking interfaces) availability. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "clang/Analysis/AnnexKDetection.h" | |
| #include "clang/Basic/LangOptions.h" | |
| #include "clang/Lex/Preprocessor.h" | |
| namespace clang::analysis { | |
| [[nodiscard]] bool isAnnexKAvailable(Preprocessor *PP, const LangOptions &LO) { | |
| if (!LO.C11) | |
| return false; | |
| assert(PP && "No Preprocessor registered."); | |
| if (!PP->isMacroDefined("__STDC_LIB_EXT1__") || | |
| !PP->isMacroDefined("__STDC_WANT_LIB_EXT1__")) | |
| return false; | |
| const auto *MI = | |
| PP->getMacroInfo(PP->getIdentifierInfo("__STDC_WANT_LIB_EXT1__")); | |
| if (!MI || MI->tokens_empty()) | |
| return false; | |
| const Token &T = MI->tokens().back(); | |
| if (!T.isLiteral() || !T.getLiteralData()) | |
| return false; | |
| return StringRef(T.getLiteralData(), T.getLength()) == "1"; | |
| } | |
| } // namespace clang::analysis |