#ifndef LLVM_CLANG_AST_ATTR_H
#define LLVM_CLANG_AST_ATTR_H
-#include "clang/AST/ASTContextAllocate.h" // For Attrs.inc
+#include "clang/AST/ASTFwd.h"
#include "clang/AST/AttrIterator.h"
#include "clang/AST/Decl.h"
-#include "clang/AST/Expr.h"
#include "clang/AST/OpenMPClause.h"
#include "clang/AST/Type.h"
#include "clang/Basic/AttrKinds.h"
llvm_unreachable("Unhandled LoopHint option.");
}
- void 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);
- }
+ void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const;
// Return a string containing the loop hint argument including the
// enclosing parentheses.
- std::string 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();
- }
+ std::string getValueString(const PrintingPolicy &Policy) const;
// Return a string suitable for identifying this attribute in diagnostics.
- std::string 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);
- }
+ std::string getDiagnosticName(const PrintingPolicy &Policy) const;
}];
let Documentation = [LoopHintDocs, UnrollHintDocs];
];
let AdditionalMembers = [{
void 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(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;
- }
- }
+ const;
}];
}
[ "DT_Host", "DT_NoHost", "DT_Any" ]>
];
let AdditionalMembers = [{
- void 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());
- }
+ void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const;
static llvm::Optional<MapTypeTy>
- isDeclareTargetDeclaration(const ValueDecl *VD) {
- if (!VD->hasAttrs())
- return llvm::None;
- if (const auto *Attr = VD->getAttr<OMPDeclareTargetDeclAttr>())
- return Attr->getMapType();
-
- return llvm::None;
- }
- static llvm::Optional<DevTypeTy> getDeviceType(const ValueDecl *VD) {
- if (!VD->hasAttrs())
- return llvm::None;
- if (const auto *Attr = VD->getAttr<OMPDeclareTargetDeclAttr>())
- return Attr->getDevType();
-
- return llvm::None;
- }
+ isDeclareTargetDeclaration(const ValueDecl *VD);
+ static llvm::Optional<DevTypeTy> getDeviceType(const ValueDecl *VD);
}];
}
let AdditionalMembers = [{
OMPTraitInfo &getTraitInfo() { return traitInfos; }
void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy)
- const {
- if (const Expr *E = getVariantFuncRef()) {
- OS << "(";
- E->printPretty(OS, nullptr, Policy);
- OS << ")";
- }
- OS << " match(";
- traitInfos.print(OS, Policy);
- OS << ")";
- }
+ const;
}];
}
#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(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;
+}
+
+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.print(OS, Policy);
+ OS << ")";
+}
+
#include "clang/AST/AttrImpl.inc"
#include "clang/AST/OpenMPClause.h"
#include "clang/AST/ASTContext.h"
+#include "clang/AST/Attr.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclOpenMP.h"
#include "clang/Basic/LLVM.h"
#include "CGLoopInfo.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Attr.h"
+#include "clang/AST/Expr.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/Constants.h"