Mercurial > hg > CbC > CbC_llvm
diff clang/lib/AST/AttrImpl.cpp @ 173:0572611fdcc8 llvm10 llvm12
reorgnization done
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 11:55:54 +0900 |
parents | 1d019706d866 |
children | 2e18cbf3894f |
line wrap: on
line diff
--- a/clang/lib/AST/AttrImpl.cpp Mon May 25 11:50:15 2020 +0900 +++ b/clang/lib/AST/AttrImpl.cpp Mon May 25 11:55:54 2020 +0900 @@ -16,4 +16,155 @@ #include "clang/AST/Type.h" using namespace clang; +void LoopHintAttr::printPrettyPragma(raw_ostream &OS, + const PrintingPolicy &Policy) const { + unsigned SpellingIndex = getAttributeSpellingListIndex(); + // For "#pragma unroll" and "#pragma nounroll" the string "unroll" or + // "nounroll" is already emitted as the pragma name. + if (SpellingIndex == Pragma_nounroll || + SpellingIndex == Pragma_nounroll_and_jam) + return; + else if (SpellingIndex == Pragma_unroll || + SpellingIndex == Pragma_unroll_and_jam) { + OS << ' ' << getValueString(Policy); + return; + } + + assert(SpellingIndex == Pragma_clang_loop && "Unexpected spelling"); + OS << ' ' << getOptionName(option) << getValueString(Policy); +} + +// Return a string containing the loop hint argument including the +// enclosing parentheses. +std::string LoopHintAttr::getValueString(const PrintingPolicy &Policy) const { + std::string ValueName; + llvm::raw_string_ostream OS(ValueName); + OS << "("; + if (state == Numeric) + value->printPretty(OS, nullptr, Policy); + else if (state == Enable) + OS << "enable"; + else if (state == Full) + OS << "full"; + else if (state == AssumeSafety) + OS << "assume_safety"; + else + OS << "disable"; + OS << ")"; + return OS.str(); +} + +// Return a string suitable for identifying this attribute in diagnostics. +std::string +LoopHintAttr::getDiagnosticName(const PrintingPolicy &Policy) const { + unsigned SpellingIndex = getAttributeSpellingListIndex(); + if (SpellingIndex == Pragma_nounroll) + return "#pragma nounroll"; + else if (SpellingIndex == Pragma_unroll) + return "#pragma unroll" + + (option == UnrollCount ? getValueString(Policy) : ""); + else if (SpellingIndex == Pragma_nounroll_and_jam) + return "#pragma nounroll_and_jam"; + else if (SpellingIndex == Pragma_unroll_and_jam) + return "#pragma unroll_and_jam" + + (option == UnrollAndJamCount ? getValueString(Policy) : ""); + + assert(SpellingIndex == Pragma_clang_loop && "Unexpected spelling"); + return getOptionName(option) + getValueString(Policy); +} + +void OMPDeclareSimdDeclAttr::printPrettyPragma( + raw_ostream &OS, const PrintingPolicy &Policy) const { + if (getBranchState() != BS_Undefined) + OS << ' ' << ConvertBranchStateTyToStr(getBranchState()); + if (auto *E = getSimdlen()) { + OS << " simdlen("; + E->printPretty(OS, nullptr, Policy); + OS << ")"; + } + if (uniforms_size() > 0) { + OS << " uniform"; + StringRef Sep = "("; + for (auto *E : uniforms()) { + OS << Sep; + E->printPretty(OS, nullptr, Policy); + Sep = ", "; + } + OS << ")"; + } + alignments_iterator NI = alignments_begin(); + for (auto *E : aligneds()) { + OS << " aligned("; + E->printPretty(OS, nullptr, Policy); + if (*NI) { + OS << ": "; + (*NI)->printPretty(OS, nullptr, Policy); + } + OS << ")"; + ++NI; + } + steps_iterator I = steps_begin(); + modifiers_iterator MI = modifiers_begin(); + for (auto *E : linears()) { + OS << " linear("; + if (*MI != OMPC_LINEAR_unknown) + OS << getOpenMPSimpleClauseTypeName(llvm::omp::Clause::OMPC_linear, *MI) + << "("; + E->printPretty(OS, nullptr, Policy); + if (*MI != OMPC_LINEAR_unknown) + OS << ")"; + if (*I) { + OS << ": "; + (*I)->printPretty(OS, nullptr, Policy); + } + OS << ")"; + ++I; + ++MI; + } +} + +void OMPDeclareTargetDeclAttr::printPrettyPragma( + raw_ostream &OS, const PrintingPolicy &Policy) const { + // Use fake syntax because it is for testing and debugging purpose only. + if (getDevType() != DT_Any) + OS << " device_type(" << ConvertDevTypeTyToStr(getDevType()) << ")"; + if (getMapType() != MT_To) + OS << ' ' << ConvertMapTypeTyToStr(getMapType()); +} + +llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> +OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(const ValueDecl *VD) { + if (!VD->hasAttrs()) + return llvm::None; + if (const auto *Attr = VD->getAttr<OMPDeclareTargetDeclAttr>()) + return Attr->getMapType(); + + return llvm::None; +} + +llvm::Optional<OMPDeclareTargetDeclAttr::DevTypeTy> +OMPDeclareTargetDeclAttr::getDeviceType(const ValueDecl *VD) { + if (!VD->hasAttrs()) + return llvm::None; + if (const auto *Attr = VD->getAttr<OMPDeclareTargetDeclAttr>()) + return Attr->getDevType(); + + return llvm::None; +} + +namespace clang { +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const OMPTraitInfo &TI); +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const OMPTraitInfo *TI); +} + +void OMPDeclareVariantAttr::printPrettyPragma( + raw_ostream &OS, const PrintingPolicy &Policy) const { + if (const Expr *E = getVariantFuncRef()) { + OS << "("; + E->printPretty(OS, nullptr, Policy); + OS << ")"; + } + OS << " match(" << traitInfos << ")"; +} + #include "clang/AST/AttrImpl.inc"