clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
48561 lines
1.8 MiB
48561 lines
1.8 MiB
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|
|
|* *|
|
|
|* Attribute classes' member function definitions *|
|
|
|* *|
|
|
|* Automatically generated file, do not edit! *|
|
|
|* From: Attr.td *|
|
|
|* *|
|
|
\*===----------------------------------------------------------------------===*/
|
|
|
|
static inline void DelimitAttributeArgument(raw_ostream& OS, bool& IsFirst) {
|
|
if (IsFirst) {
|
|
IsFirst = false;
|
|
OS << "(";
|
|
} else
|
|
OS << ", ";
|
|
}
|
|
|
|
// AArch64SVEPcsAttr implementation
|
|
|
|
AArch64SVEPcsAttr *AArch64SVEPcsAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AArch64SVEPcsAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AArch64SVEPcsAttr *AArch64SVEPcsAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AArch64SVEPcsAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AArch64SVEPcsAttr *AArch64SVEPcsAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_aarch64_sve_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_aarch64_sve_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_aarch64_sve_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_aarch64_sve_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_aarch64_sve_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_aarch64_sve_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AArch64SVEPcsAttr *AArch64SVEPcsAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_aarch64_sve_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_aarch64_sve_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_aarch64_sve_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_aarch64_sve_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_aarch64_sve_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_aarch64_sve_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AArch64SVEPcsAttr::AArch64SVEPcsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AArch64SVEPcs, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AArch64SVEPcsAttr *AArch64SVEPcsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AArch64SVEPcsAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AArch64SVEPcsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((aarch64_sve_pcs";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::aarch64_sve_pcs";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::aarch64_sve_pcs";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AArch64SVEPcsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "aarch64_sve_pcs";
|
|
case 1:
|
|
return "aarch64_sve_pcs";
|
|
case 2:
|
|
return "aarch64_sve_pcs";
|
|
}
|
|
}
|
|
|
|
|
|
// AArch64VectorPcsAttr implementation
|
|
|
|
AArch64VectorPcsAttr *AArch64VectorPcsAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AArch64VectorPcsAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AArch64VectorPcsAttr *AArch64VectorPcsAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AArch64VectorPcsAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AArch64VectorPcsAttr *AArch64VectorPcsAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_aarch64_vector_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_aarch64_vector_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_aarch64_vector_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_aarch64_vector_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_aarch64_vector_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_aarch64_vector_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AArch64VectorPcsAttr *AArch64VectorPcsAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_aarch64_vector_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_aarch64_vector_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_aarch64_vector_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_aarch64_vector_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_aarch64_vector_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_aarch64_vector_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AArch64VectorPcsAttr::AArch64VectorPcsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AArch64VectorPcs, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AArch64VectorPcsAttr *AArch64VectorPcsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AArch64VectorPcsAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AArch64VectorPcsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((aarch64_vector_pcs";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::aarch64_vector_pcs";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::aarch64_vector_pcs";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AArch64VectorPcsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "aarch64_vector_pcs";
|
|
case 1:
|
|
return "aarch64_vector_pcs";
|
|
case 2:
|
|
return "aarch64_vector_pcs";
|
|
}
|
|
}
|
|
|
|
|
|
// AMDGPUFlatWorkGroupSizeAttr implementation
|
|
|
|
AMDGPUFlatWorkGroupSizeAttr *AMDGPUFlatWorkGroupSizeAttr::CreateImplicit(ASTContext &Ctx, Expr * Min, Expr * Max, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AMDGPUFlatWorkGroupSizeAttr(Ctx, CommonInfo, Min, Max);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AMDGPUFlatWorkGroupSizeAttr *AMDGPUFlatWorkGroupSizeAttr::Create(ASTContext &Ctx, Expr * Min, Expr * Max, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AMDGPUFlatWorkGroupSizeAttr(Ctx, CommonInfo, Min, Max);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AMDGPUFlatWorkGroupSizeAttr *AMDGPUFlatWorkGroupSizeAttr::CreateImplicit(ASTContext &Ctx, Expr * Min, Expr * Max, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_amdgpu_flat_work_group_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_amdgpu_flat_work_group_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_amdgpu_flat_work_group_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_amdgpu_flat_work_group_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Min, Max, I);
|
|
}
|
|
|
|
AMDGPUFlatWorkGroupSizeAttr *AMDGPUFlatWorkGroupSizeAttr::Create(ASTContext &Ctx, Expr * Min, Expr * Max, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_amdgpu_flat_work_group_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_amdgpu_flat_work_group_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_amdgpu_flat_work_group_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_amdgpu_flat_work_group_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Min, Max, I);
|
|
}
|
|
|
|
AMDGPUFlatWorkGroupSizeAttr::AMDGPUFlatWorkGroupSizeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Min
|
|
, Expr * Max
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AMDGPUFlatWorkGroupSize, /*IsLateParsed=*/false, false)
|
|
, min(Min)
|
|
, max(Max)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AMDGPUFlatWorkGroupSizeAttr *AMDGPUFlatWorkGroupSizeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AMDGPUFlatWorkGroupSizeAttr(C, *this, min, max);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AMDGPUFlatWorkGroupSizeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((amdgpu_flat_work_group_size";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMin()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMax()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::amdgpu_flat_work_group_size";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMin()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMax()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AMDGPUFlatWorkGroupSizeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "amdgpu_flat_work_group_size";
|
|
case 1:
|
|
return "amdgpu_flat_work_group_size";
|
|
}
|
|
}
|
|
|
|
|
|
// AMDGPUKernelCallAttr implementation
|
|
|
|
AMDGPUKernelCallAttr *AMDGPUKernelCallAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AMDGPUKernelCallAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AMDGPUKernelCallAttr *AMDGPUKernelCallAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AMDGPUKernelCallAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AMDGPUKernelCallAttr *AMDGPUKernelCallAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_amdgpu_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_amdgpu_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_amdgpu_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_amdgpu_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_amdgpu_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_amdgpu_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AMDGPUKernelCallAttr *AMDGPUKernelCallAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_amdgpu_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_amdgpu_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_amdgpu_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_amdgpu_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_amdgpu_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_amdgpu_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AMDGPUKernelCallAttr::AMDGPUKernelCallAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AMDGPUKernelCall, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AMDGPUKernelCallAttr *AMDGPUKernelCallAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AMDGPUKernelCallAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AMDGPUKernelCallAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((amdgpu_kernel";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::amdgpu_kernel";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::amdgpu_kernel";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AMDGPUKernelCallAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "amdgpu_kernel";
|
|
case 1:
|
|
return "amdgpu_kernel";
|
|
case 2:
|
|
return "amdgpu_kernel";
|
|
}
|
|
}
|
|
|
|
|
|
// AMDGPUMaxNumWorkGroupsAttr implementation
|
|
|
|
AMDGPUMaxNumWorkGroupsAttr *AMDGPUMaxNumWorkGroupsAttr::CreateImplicit(ASTContext &Ctx, Expr * MaxNumWorkGroupsX, Expr * MaxNumWorkGroupsY, Expr * MaxNumWorkGroupsZ, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AMDGPUMaxNumWorkGroupsAttr(Ctx, CommonInfo, MaxNumWorkGroupsX, MaxNumWorkGroupsY, MaxNumWorkGroupsZ);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AMDGPUMaxNumWorkGroupsAttr *AMDGPUMaxNumWorkGroupsAttr::Create(ASTContext &Ctx, Expr * MaxNumWorkGroupsX, Expr * MaxNumWorkGroupsY, Expr * MaxNumWorkGroupsZ, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AMDGPUMaxNumWorkGroupsAttr(Ctx, CommonInfo, MaxNumWorkGroupsX, MaxNumWorkGroupsY, MaxNumWorkGroupsZ);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AMDGPUMaxNumWorkGroupsAttr *AMDGPUMaxNumWorkGroupsAttr::CreateImplicit(ASTContext &Ctx, Expr * MaxNumWorkGroupsX, Expr * MaxNumWorkGroupsY, Expr * MaxNumWorkGroupsZ, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_amdgpu_max_num_work_groups:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_amdgpu_max_num_work_groups, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_amdgpu_max_num_work_groups:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_amdgpu_max_num_work_groups, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, MaxNumWorkGroupsX, MaxNumWorkGroupsY, MaxNumWorkGroupsZ, I);
|
|
}
|
|
|
|
AMDGPUMaxNumWorkGroupsAttr *AMDGPUMaxNumWorkGroupsAttr::Create(ASTContext &Ctx, Expr * MaxNumWorkGroupsX, Expr * MaxNumWorkGroupsY, Expr * MaxNumWorkGroupsZ, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_amdgpu_max_num_work_groups:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_amdgpu_max_num_work_groups, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_amdgpu_max_num_work_groups:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_amdgpu_max_num_work_groups, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, MaxNumWorkGroupsX, MaxNumWorkGroupsY, MaxNumWorkGroupsZ, I);
|
|
}
|
|
|
|
AMDGPUMaxNumWorkGroupsAttr::AMDGPUMaxNumWorkGroupsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * MaxNumWorkGroupsX
|
|
, Expr * MaxNumWorkGroupsY
|
|
, Expr * MaxNumWorkGroupsZ
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AMDGPUMaxNumWorkGroups, /*IsLateParsed=*/false, false)
|
|
, maxNumWorkGroupsX(MaxNumWorkGroupsX)
|
|
, maxNumWorkGroupsY(MaxNumWorkGroupsY)
|
|
, maxNumWorkGroupsZ(MaxNumWorkGroupsZ)
|
|
{
|
|
}
|
|
|
|
AMDGPUMaxNumWorkGroupsAttr::AMDGPUMaxNumWorkGroupsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * MaxNumWorkGroupsX
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AMDGPUMaxNumWorkGroups, /*IsLateParsed=*/false, false)
|
|
, maxNumWorkGroupsX(MaxNumWorkGroupsX)
|
|
, maxNumWorkGroupsY()
|
|
, maxNumWorkGroupsZ()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AMDGPUMaxNumWorkGroupsAttr *AMDGPUMaxNumWorkGroupsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AMDGPUMaxNumWorkGroupsAttr(C, *this, maxNumWorkGroupsX, maxNumWorkGroupsY, maxNumWorkGroupsZ);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AMDGPUMaxNumWorkGroupsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((amdgpu_max_num_work_groups";
|
|
if (!getMaxNumWorkGroupsZ())
|
|
++TrailingOmittedArgs;
|
|
if (!getMaxNumWorkGroupsY())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMaxNumWorkGroupsX()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!(!getMaxNumWorkGroupsY())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMaxNumWorkGroupsY()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!(!getMaxNumWorkGroupsZ())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMaxNumWorkGroupsZ()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::amdgpu_max_num_work_groups";
|
|
if (!getMaxNumWorkGroupsZ())
|
|
++TrailingOmittedArgs;
|
|
if (!getMaxNumWorkGroupsY())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMaxNumWorkGroupsX()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!(!getMaxNumWorkGroupsY())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMaxNumWorkGroupsY()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!(!getMaxNumWorkGroupsZ())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMaxNumWorkGroupsZ()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AMDGPUMaxNumWorkGroupsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "amdgpu_max_num_work_groups";
|
|
case 1:
|
|
return "amdgpu_max_num_work_groups";
|
|
}
|
|
}
|
|
|
|
|
|
// AMDGPUNumSGPRAttr implementation
|
|
|
|
AMDGPUNumSGPRAttr *AMDGPUNumSGPRAttr::CreateImplicit(ASTContext &Ctx, unsigned NumSGPR, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AMDGPUNumSGPRAttr(Ctx, CommonInfo, NumSGPR);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AMDGPUNumSGPRAttr *AMDGPUNumSGPRAttr::Create(ASTContext &Ctx, unsigned NumSGPR, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AMDGPUNumSGPRAttr(Ctx, CommonInfo, NumSGPR);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AMDGPUNumSGPRAttr *AMDGPUNumSGPRAttr::CreateImplicit(ASTContext &Ctx, unsigned NumSGPR, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_amdgpu_num_sgpr:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_amdgpu_num_sgpr, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_amdgpu_num_sgpr:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_amdgpu_num_sgpr, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, NumSGPR, I);
|
|
}
|
|
|
|
AMDGPUNumSGPRAttr *AMDGPUNumSGPRAttr::Create(ASTContext &Ctx, unsigned NumSGPR, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_amdgpu_num_sgpr:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_amdgpu_num_sgpr, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_amdgpu_num_sgpr:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_amdgpu_num_sgpr, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, NumSGPR, I);
|
|
}
|
|
|
|
AMDGPUNumSGPRAttr::AMDGPUNumSGPRAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned NumSGPR
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AMDGPUNumSGPR, /*IsLateParsed=*/false, false)
|
|
, numSGPR(NumSGPR)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
AMDGPUNumSGPRAttr *AMDGPUNumSGPRAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AMDGPUNumSGPRAttr(C, *this, numSGPR);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AMDGPUNumSGPRAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((amdgpu_num_sgpr";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNumSGPR() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::amdgpu_num_sgpr";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNumSGPR() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AMDGPUNumSGPRAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "amdgpu_num_sgpr";
|
|
case 1:
|
|
return "amdgpu_num_sgpr";
|
|
}
|
|
}
|
|
|
|
|
|
// AMDGPUNumVGPRAttr implementation
|
|
|
|
AMDGPUNumVGPRAttr *AMDGPUNumVGPRAttr::CreateImplicit(ASTContext &Ctx, unsigned NumVGPR, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AMDGPUNumVGPRAttr(Ctx, CommonInfo, NumVGPR);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AMDGPUNumVGPRAttr *AMDGPUNumVGPRAttr::Create(ASTContext &Ctx, unsigned NumVGPR, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AMDGPUNumVGPRAttr(Ctx, CommonInfo, NumVGPR);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AMDGPUNumVGPRAttr *AMDGPUNumVGPRAttr::CreateImplicit(ASTContext &Ctx, unsigned NumVGPR, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_amdgpu_num_vgpr:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_amdgpu_num_vgpr, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_amdgpu_num_vgpr:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_amdgpu_num_vgpr, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, NumVGPR, I);
|
|
}
|
|
|
|
AMDGPUNumVGPRAttr *AMDGPUNumVGPRAttr::Create(ASTContext &Ctx, unsigned NumVGPR, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_amdgpu_num_vgpr:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_amdgpu_num_vgpr, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_amdgpu_num_vgpr:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_amdgpu_num_vgpr, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, NumVGPR, I);
|
|
}
|
|
|
|
AMDGPUNumVGPRAttr::AMDGPUNumVGPRAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned NumVGPR
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AMDGPUNumVGPR, /*IsLateParsed=*/false, false)
|
|
, numVGPR(NumVGPR)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
AMDGPUNumVGPRAttr *AMDGPUNumVGPRAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AMDGPUNumVGPRAttr(C, *this, numVGPR);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AMDGPUNumVGPRAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((amdgpu_num_vgpr";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNumVGPR() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::amdgpu_num_vgpr";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNumVGPR() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AMDGPUNumVGPRAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "amdgpu_num_vgpr";
|
|
case 1:
|
|
return "amdgpu_num_vgpr";
|
|
}
|
|
}
|
|
|
|
|
|
// AMDGPUWavesPerEUAttr implementation
|
|
|
|
AMDGPUWavesPerEUAttr *AMDGPUWavesPerEUAttr::CreateImplicit(ASTContext &Ctx, Expr * Min, Expr * Max, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AMDGPUWavesPerEUAttr(Ctx, CommonInfo, Min, Max);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AMDGPUWavesPerEUAttr *AMDGPUWavesPerEUAttr::Create(ASTContext &Ctx, Expr * Min, Expr * Max, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AMDGPUWavesPerEUAttr(Ctx, CommonInfo, Min, Max);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AMDGPUWavesPerEUAttr *AMDGPUWavesPerEUAttr::CreateImplicit(ASTContext &Ctx, Expr * Min, Expr * Max, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_amdgpu_waves_per_eu:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_amdgpu_waves_per_eu, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_amdgpu_waves_per_eu:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_amdgpu_waves_per_eu, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Min, Max, I);
|
|
}
|
|
|
|
AMDGPUWavesPerEUAttr *AMDGPUWavesPerEUAttr::Create(ASTContext &Ctx, Expr * Min, Expr * Max, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_amdgpu_waves_per_eu:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_amdgpu_waves_per_eu, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_amdgpu_waves_per_eu:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_amdgpu_waves_per_eu, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Min, Max, I);
|
|
}
|
|
|
|
AMDGPUWavesPerEUAttr::AMDGPUWavesPerEUAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Min
|
|
, Expr * Max
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AMDGPUWavesPerEU, /*IsLateParsed=*/false, false)
|
|
, min(Min)
|
|
, max(Max)
|
|
{
|
|
}
|
|
|
|
AMDGPUWavesPerEUAttr::AMDGPUWavesPerEUAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Min
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AMDGPUWavesPerEU, /*IsLateParsed=*/false, false)
|
|
, min(Min)
|
|
, max()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AMDGPUWavesPerEUAttr *AMDGPUWavesPerEUAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AMDGPUWavesPerEUAttr(C, *this, min, max);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AMDGPUWavesPerEUAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((amdgpu_waves_per_eu";
|
|
if (!getMax())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMin()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!(!getMax())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMax()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::amdgpu_waves_per_eu";
|
|
if (!getMax())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMin()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!(!getMax())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMax()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AMDGPUWavesPerEUAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "amdgpu_waves_per_eu";
|
|
case 1:
|
|
return "amdgpu_waves_per_eu";
|
|
}
|
|
}
|
|
|
|
|
|
// ARMInterruptAttr implementation
|
|
|
|
ARMInterruptAttr *ARMInterruptAttr::CreateImplicit(ASTContext &Ctx, ARMInterruptAttr::InterruptType Interrupt, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ARMInterruptAttr(Ctx, CommonInfo, Interrupt);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ARMInterruptAttr *ARMInterruptAttr::Create(ASTContext &Ctx, ARMInterruptAttr::InterruptType Interrupt, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ARMInterruptAttr(Ctx, CommonInfo, Interrupt);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ARMInterruptAttr *ARMInterruptAttr::CreateImplicit(ASTContext &Ctx, ARMInterruptAttr::InterruptType Interrupt, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Interrupt, I);
|
|
}
|
|
|
|
ARMInterruptAttr *ARMInterruptAttr::Create(ASTContext &Ctx, ARMInterruptAttr::InterruptType Interrupt, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Interrupt, I);
|
|
}
|
|
|
|
ARMInterruptAttr::ARMInterruptAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, ARMInterruptAttr::InterruptType Interrupt
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ARMInterrupt, /*IsLateParsed=*/false, false)
|
|
, interrupt(Interrupt)
|
|
{
|
|
}
|
|
|
|
ARMInterruptAttr::ARMInterruptAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ARMInterrupt, /*IsLateParsed=*/false, false)
|
|
, interrupt(ARMInterruptAttr::InterruptType(0))
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool ARMInterruptAttr::ConvertStrToInterruptType(StringRef Val, ARMInterruptAttr::InterruptType &Out) {
|
|
std::optional<ARMInterruptAttr::InterruptType> R = llvm::StringSwitch<std::optional<ARMInterruptAttr::InterruptType>>(Val)
|
|
.Case("IRQ", ARMInterruptAttr::InterruptType::IRQ)
|
|
.Case("FIQ", ARMInterruptAttr::InterruptType::FIQ)
|
|
.Case("SWI", ARMInterruptAttr::InterruptType::SWI)
|
|
.Case("ABORT", ARMInterruptAttr::InterruptType::ABORT)
|
|
.Case("UNDEF", ARMInterruptAttr::InterruptType::UNDEF)
|
|
.Case("", ARMInterruptAttr::InterruptType::Generic)
|
|
.Default(std::optional<ARMInterruptAttr::InterruptType>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *ARMInterruptAttr::ConvertInterruptTypeToStr(ARMInterruptAttr::InterruptType Val) {
|
|
switch(Val) {
|
|
case ARMInterruptAttr::InterruptType::IRQ: return "IRQ";
|
|
case ARMInterruptAttr::InterruptType::FIQ: return "FIQ";
|
|
case ARMInterruptAttr::InterruptType::SWI: return "SWI";
|
|
case ARMInterruptAttr::InterruptType::ABORT: return "ABORT";
|
|
case ARMInterruptAttr::InterruptType::UNDEF: return "UNDEF";
|
|
case ARMInterruptAttr::InterruptType::Generic: return "";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
ARMInterruptAttr *ARMInterruptAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ARMInterruptAttr(C, *this, interrupt);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ARMInterruptAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ARMInterruptAttr::ConvertInterruptTypeToStr(getInterrupt()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ARMInterruptAttr::ConvertInterruptTypeToStr(getInterrupt()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ARMInterruptAttr::ConvertInterruptTypeToStr(getInterrupt()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ARMInterruptAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "interrupt";
|
|
case 1:
|
|
return "interrupt";
|
|
case 2:
|
|
return "interrupt";
|
|
}
|
|
}
|
|
|
|
|
|
// AVRInterruptAttr implementation
|
|
|
|
AVRInterruptAttr *AVRInterruptAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AVRInterruptAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AVRInterruptAttr *AVRInterruptAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AVRInterruptAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AVRInterruptAttr *AVRInterruptAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AVRInterruptAttr *AVRInterruptAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AVRInterruptAttr::AVRInterruptAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AVRInterrupt, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AVRInterruptAttr *AVRInterruptAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AVRInterruptAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AVRInterruptAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((interrupt";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::interrupt";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::interrupt";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AVRInterruptAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "interrupt";
|
|
case 1:
|
|
return "interrupt";
|
|
case 2:
|
|
return "interrupt";
|
|
}
|
|
}
|
|
|
|
|
|
// AVRSignalAttr implementation
|
|
|
|
AVRSignalAttr *AVRSignalAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AVRSignalAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AVRSignalAttr *AVRSignalAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AVRSignalAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AVRSignalAttr *AVRSignalAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_signal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_signal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_signal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_signal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_signal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_signal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AVRSignalAttr *AVRSignalAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_signal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_signal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_signal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_signal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_signal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_signal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AVRSignalAttr::AVRSignalAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AVRSignal, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AVRSignalAttr *AVRSignalAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AVRSignalAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AVRSignalAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((signal";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::signal";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::signal";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AVRSignalAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "signal";
|
|
case 1:
|
|
return "signal";
|
|
case 2:
|
|
return "signal";
|
|
}
|
|
}
|
|
|
|
|
|
// AbiTagAttr implementation
|
|
|
|
AbiTagAttr *AbiTagAttr::CreateImplicit(ASTContext &Ctx, StringRef *Tags, unsigned TagsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AbiTagAttr(Ctx, CommonInfo, Tags, TagsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AbiTagAttr *AbiTagAttr::Create(ASTContext &Ctx, StringRef *Tags, unsigned TagsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AbiTagAttr(Ctx, CommonInfo, Tags, TagsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AbiTagAttr *AbiTagAttr::CreateImplicit(ASTContext &Ctx, StringRef *Tags, unsigned TagsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_abi_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_abi_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_abi_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_abi_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Tags, TagsSize, I);
|
|
}
|
|
|
|
AbiTagAttr *AbiTagAttr::Create(ASTContext &Ctx, StringRef *Tags, unsigned TagsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_abi_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_abi_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_abi_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_abi_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Tags, TagsSize, I);
|
|
}
|
|
|
|
AbiTagAttr::AbiTagAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, StringRef *Tags, unsigned TagsSize
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::AbiTag, /*IsLateParsed=*/false)
|
|
, tags_Size(TagsSize), tags_(new (Ctx, 16) StringRef[tags_Size])
|
|
{
|
|
for (size_t I = 0, E = tags_Size; I != E;
|
|
++I) {
|
|
StringRef Ref = Tags[I];
|
|
if (!Ref.empty()) {
|
|
char *Mem = new (Ctx, 1) char[Ref.size()];
|
|
std::memcpy(Mem, Ref.data(), Ref.size());
|
|
tags_[I] = StringRef(Mem, Ref.size());
|
|
}
|
|
}
|
|
}
|
|
|
|
AbiTagAttr::AbiTagAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::AbiTag, /*IsLateParsed=*/false)
|
|
, tags_Size(0), tags_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
AbiTagAttr *AbiTagAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AbiTagAttr(C, *this, tags_, tags_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AbiTagAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((abi_tag";
|
|
OS << "";
|
|
for (const auto &Val : tags()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::abi_tag";
|
|
OS << "";
|
|
for (const auto &Val : tags()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AbiTagAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "abi_tag";
|
|
case 1:
|
|
return "abi_tag";
|
|
}
|
|
}
|
|
|
|
|
|
// AcquireCapabilityAttr implementation
|
|
|
|
AcquireCapabilityAttr *AcquireCapabilityAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AcquireCapabilityAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AcquireCapabilityAttr *AcquireCapabilityAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AcquireCapabilityAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
return A;
|
|
}
|
|
|
|
AcquireCapabilityAttr *AcquireCapabilityAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_acquire_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_acquire_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_acquire_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_acquire_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_acquire_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_acquire_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_acquire_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_acquire_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_exclusive_lock_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_exclusive_lock_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_shared_lock_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_shared_lock_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
AcquireCapabilityAttr *AcquireCapabilityAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_acquire_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_acquire_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_acquire_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_acquire_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_acquire_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_acquire_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_acquire_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_acquire_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_exclusive_lock_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_exclusive_lock_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_shared_lock_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_shared_lock_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
AcquireCapabilityAttr::AcquireCapabilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AcquireCapability, /*IsLateParsed=*/true, true)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
AcquireCapabilityAttr::AcquireCapabilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AcquireCapability, /*IsLateParsed=*/true, true)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
AcquireCapabilityAttr::Spelling AcquireCapabilityAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_acquire_capability;
|
|
case 1: return CXX11_clang_acquire_capability;
|
|
case 2: return GNU_acquire_shared_capability;
|
|
case 3: return CXX11_clang_acquire_shared_capability;
|
|
case 4: return GNU_exclusive_lock_function;
|
|
case 5: return GNU_shared_lock_function;
|
|
}
|
|
}
|
|
|
|
|
|
AcquireCapabilityAttr *AcquireCapabilityAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AcquireCapabilityAttr(C, *this, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AcquireCapabilityAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((acquire_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::acquire_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((acquire_shared_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::acquire_shared_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "__attribute__((exclusive_lock_function";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "__attribute__((shared_lock_function";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AcquireCapabilityAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "acquire_capability";
|
|
case 1:
|
|
return "acquire_capability";
|
|
case 2:
|
|
return "acquire_shared_capability";
|
|
case 3:
|
|
return "acquire_shared_capability";
|
|
case 4:
|
|
return "exclusive_lock_function";
|
|
case 5:
|
|
return "shared_lock_function";
|
|
}
|
|
}
|
|
|
|
|
|
// AcquireHandleAttr implementation
|
|
|
|
AcquireHandleAttr *AcquireHandleAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef HandleType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AcquireHandleAttr(Ctx, CommonInfo, HandleType);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AcquireHandleAttr *AcquireHandleAttr::Create(ASTContext &Ctx, llvm::StringRef HandleType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AcquireHandleAttr(Ctx, CommonInfo, HandleType);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AcquireHandleAttr *AcquireHandleAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef HandleType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_acquire_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_acquire_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_acquire_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_acquire_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_acquire_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_acquire_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, HandleType, I);
|
|
}
|
|
|
|
AcquireHandleAttr *AcquireHandleAttr::Create(ASTContext &Ctx, llvm::StringRef HandleType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_acquire_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_acquire_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_acquire_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_acquire_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_acquire_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_acquire_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, HandleType, I);
|
|
}
|
|
|
|
AcquireHandleAttr::AcquireHandleAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef HandleType
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AcquireHandle, /*IsLateParsed=*/false, false)
|
|
, handleTypeLength(HandleType.size()),handleType(new (Ctx, 1) char[handleTypeLength])
|
|
{
|
|
if (!HandleType.empty())
|
|
std::memcpy(handleType, HandleType.data(), handleTypeLength);
|
|
}
|
|
|
|
|
|
|
|
AcquireHandleAttr *AcquireHandleAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AcquireHandleAttr(C, *this, getHandleType());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AcquireHandleAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((acquire_handle";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getHandleType() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::acquire_handle";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getHandleType() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::acquire_handle";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getHandleType() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AcquireHandleAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "acquire_handle";
|
|
case 1:
|
|
return "acquire_handle";
|
|
case 2:
|
|
return "acquire_handle";
|
|
}
|
|
}
|
|
|
|
|
|
// AcquiredAfterAttr implementation
|
|
|
|
AcquiredAfterAttr *AcquiredAfterAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AcquiredAfterAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AcquiredAfterAttr *AcquiredAfterAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AcquiredAfterAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AcquiredAfterAttr *AcquiredAfterAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
AcquiredAfterAttr *AcquiredAfterAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
AcquiredAfterAttr::AcquiredAfterAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AcquiredAfter, /*IsLateParsed=*/true, true)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
AcquiredAfterAttr::AcquiredAfterAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AcquiredAfter, /*IsLateParsed=*/true, true)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
AcquiredAfterAttr *AcquiredAfterAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AcquiredAfterAttr(C, *this, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AcquiredAfterAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((acquired_after";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AcquiredAfterAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "acquired_after";
|
|
}
|
|
}
|
|
|
|
|
|
// AcquiredBeforeAttr implementation
|
|
|
|
AcquiredBeforeAttr *AcquiredBeforeAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AcquiredBeforeAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AcquiredBeforeAttr *AcquiredBeforeAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AcquiredBeforeAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AcquiredBeforeAttr *AcquiredBeforeAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
AcquiredBeforeAttr *AcquiredBeforeAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
AcquiredBeforeAttr::AcquiredBeforeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AcquiredBefore, /*IsLateParsed=*/true, true)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
AcquiredBeforeAttr::AcquiredBeforeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AcquiredBefore, /*IsLateParsed=*/true, true)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
AcquiredBeforeAttr *AcquiredBeforeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AcquiredBeforeAttr(C, *this, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AcquiredBeforeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((acquired_before";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AcquiredBeforeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "acquired_before";
|
|
}
|
|
}
|
|
|
|
|
|
// AddressSpaceAttr implementation
|
|
|
|
AddressSpaceAttr *AddressSpaceAttr::CreateImplicit(ASTContext &Ctx, int AddressSpace, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AddressSpaceAttr(Ctx, CommonInfo, AddressSpace);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AddressSpaceAttr *AddressSpaceAttr::Create(ASTContext &Ctx, int AddressSpace, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AddressSpaceAttr(Ctx, CommonInfo, AddressSpace);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AddressSpaceAttr *AddressSpaceAttr::CreateImplicit(ASTContext &Ctx, int AddressSpace, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_address_space:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_address_space, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_address_space:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_address_space, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_address_space:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_address_space, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, AddressSpace, I);
|
|
}
|
|
|
|
AddressSpaceAttr *AddressSpaceAttr::Create(ASTContext &Ctx, int AddressSpace, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_address_space:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_address_space, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_address_space:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_address_space, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_address_space:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_address_space, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, AddressSpace, I);
|
|
}
|
|
|
|
AddressSpaceAttr::AddressSpaceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, int AddressSpace
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::AddressSpace, /*IsLateParsed=*/false)
|
|
, addressSpace(AddressSpace)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
AddressSpaceAttr *AddressSpaceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AddressSpaceAttr(C, *this, addressSpace);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AddressSpaceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((address_space";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getAddressSpace() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::address_space";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getAddressSpace() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::address_space";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getAddressSpace() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AddressSpaceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "address_space";
|
|
case 1:
|
|
return "address_space";
|
|
case 2:
|
|
return "address_space";
|
|
}
|
|
}
|
|
|
|
|
|
// AliasAttr implementation
|
|
|
|
AliasAttr *AliasAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Aliasee, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AliasAttr(Ctx, CommonInfo, Aliasee);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AliasAttr *AliasAttr::Create(ASTContext &Ctx, llvm::StringRef Aliasee, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AliasAttr(Ctx, CommonInfo, Aliasee);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AliasAttr *AliasAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Aliasee, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Aliasee, I);
|
|
}
|
|
|
|
AliasAttr *AliasAttr::Create(ASTContext &Ctx, llvm::StringRef Aliasee, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Aliasee, I);
|
|
}
|
|
|
|
AliasAttr::AliasAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Aliasee
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::Alias, /*IsLateParsed=*/false)
|
|
, aliaseeLength(Aliasee.size()),aliasee(new (Ctx, 1) char[aliaseeLength])
|
|
{
|
|
if (!Aliasee.empty())
|
|
std::memcpy(aliasee, Aliasee.data(), aliaseeLength);
|
|
}
|
|
|
|
|
|
|
|
AliasAttr *AliasAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AliasAttr(C, *this, getAliasee());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AliasAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((alias";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAliasee() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::alias";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAliasee() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::alias";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAliasee() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AliasAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "alias";
|
|
case 1:
|
|
return "alias";
|
|
case 2:
|
|
return "alias";
|
|
}
|
|
}
|
|
|
|
|
|
// AlignMac68kAttr implementation
|
|
|
|
AlignMac68kAttr *AlignMac68kAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AlignMac68kAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AlignMac68kAttr *AlignMac68kAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AlignMac68kAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AlignMac68kAttr *AlignMac68kAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AlignMac68kAttr *AlignMac68kAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AlignMac68kAttr::AlignMac68kAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AlignMac68k, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AlignMac68kAttr *AlignMac68kAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AlignMac68kAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AlignMac68kAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *AlignMac68kAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// AlignNaturalAttr implementation
|
|
|
|
AlignNaturalAttr *AlignNaturalAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AlignNaturalAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AlignNaturalAttr *AlignNaturalAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AlignNaturalAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AlignNaturalAttr *AlignNaturalAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AlignNaturalAttr *AlignNaturalAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AlignNaturalAttr::AlignNaturalAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AlignNatural, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AlignNaturalAttr *AlignNaturalAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AlignNaturalAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AlignNaturalAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *AlignNaturalAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// AlignValueAttr implementation
|
|
|
|
AlignValueAttr *AlignValueAttr::CreateImplicit(ASTContext &Ctx, Expr * Alignment, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AlignValueAttr(Ctx, CommonInfo, Alignment);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AlignValueAttr *AlignValueAttr::Create(ASTContext &Ctx, Expr * Alignment, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AlignValueAttr(Ctx, CommonInfo, Alignment);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AlignValueAttr *AlignValueAttr::CreateImplicit(ASTContext &Ctx, Expr * Alignment, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Alignment, I);
|
|
}
|
|
|
|
AlignValueAttr *AlignValueAttr::Create(ASTContext &Ctx, Expr * Alignment, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Alignment, I);
|
|
}
|
|
|
|
AlignValueAttr::AlignValueAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Alignment
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::AlignValue, /*IsLateParsed=*/false)
|
|
, alignment(Alignment)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
AlignValueAttr *AlignValueAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AlignValueAttr(C, *this, alignment);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AlignValueAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((align_value";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getAlignment()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AlignValueAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "align_value";
|
|
}
|
|
}
|
|
|
|
|
|
// AlignedAttr implementation
|
|
|
|
AlignedAttr *AlignedAttr::CreateImplicit(ASTContext &Ctx, bool IsAlignmentExpr, void *Alignment, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AlignedAttr(Ctx, CommonInfo, IsAlignmentExpr, Alignment);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AlignedAttr *AlignedAttr::Create(ASTContext &Ctx, bool IsAlignmentExpr, void *Alignment, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AlignedAttr(Ctx, CommonInfo, IsAlignmentExpr, Alignment);
|
|
return A;
|
|
}
|
|
|
|
AlignedAttr *AlignedAttr::CreateImplicit(ASTContext &Ctx, bool IsAlignmentExpr, void *Alignment, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_aligned:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_aligned, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_aligned:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_aligned, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_aligned:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_aligned, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_alignas:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_alignas, true /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_Alignas:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_Alignas, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, IsAlignmentExpr, Alignment, I);
|
|
}
|
|
|
|
AlignedAttr *AlignedAttr::Create(ASTContext &Ctx, bool IsAlignmentExpr, void *Alignment, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_aligned:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_aligned, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_aligned:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_aligned, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_aligned:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_aligned, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_alignas:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_alignas, true /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_Alignas:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_Alignas, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, IsAlignmentExpr, Alignment, I);
|
|
}
|
|
|
|
AlignedAttr::AlignedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, bool IsAlignmentExpr, void *Alignment
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Aligned, /*IsLateParsed=*/false, false)
|
|
, isalignmentExpr(IsAlignmentExpr)
|
|
{
|
|
if (isalignmentExpr)
|
|
alignmentExpr = reinterpret_cast<Expr *>(Alignment);
|
|
else
|
|
alignmentType = reinterpret_cast<TypeSourceInfo *>(Alignment);
|
|
}
|
|
|
|
AlignedAttr::AlignedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Aligned, /*IsLateParsed=*/false, false)
|
|
, isalignmentExpr(false)
|
|
{
|
|
}
|
|
|
|
AlignedAttr::Spelling AlignedAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_aligned;
|
|
case 1: return CXX11_gnu_aligned;
|
|
case 2: return C23_gnu_aligned;
|
|
case 3: return Declspec_align;
|
|
case 4: return Keyword_alignas;
|
|
case 5: return Keyword_Alignas;
|
|
}
|
|
}
|
|
bool AlignedAttr::isAlignmentDependent() const {
|
|
if (isalignmentExpr)
|
|
return alignmentExpr && (alignmentExpr->isValueDependent() || alignmentExpr->isTypeDependent());
|
|
else
|
|
return alignmentType->getType()->isDependentType();
|
|
}
|
|
bool AlignedAttr::isAlignmentErrorDependent() const {
|
|
if (isalignmentExpr)
|
|
return alignmentExpr && alignmentExpr->containsErrors();
|
|
return alignmentType->getType()->containsErrors();
|
|
}
|
|
|
|
|
|
AlignedAttr *AlignedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AlignedAttr(C, *this, isalignmentExpr, isalignmentExpr ? static_cast<void*>(alignmentExpr) : alignmentType);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AlignedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((aligned";
|
|
if (!((isalignmentExpr && alignmentExpr) || (!isalignmentExpr && alignmentType)))
|
|
++TrailingOmittedArgs;
|
|
if (!(!((isalignmentExpr && alignmentExpr) || (!isalignmentExpr && alignmentType)))) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
if (isalignmentExpr && alignmentExpr) alignmentExpr->printPretty(OS, nullptr, Policy);
|
|
if (!isalignmentExpr && alignmentType) alignmentType->getType().print(OS, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::aligned";
|
|
if (!((isalignmentExpr && alignmentExpr) || (!isalignmentExpr && alignmentType)))
|
|
++TrailingOmittedArgs;
|
|
if (!(!((isalignmentExpr && alignmentExpr) || (!isalignmentExpr && alignmentType)))) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
if (isalignmentExpr && alignmentExpr) alignmentExpr->printPretty(OS, nullptr, Policy);
|
|
if (!isalignmentExpr && alignmentType) alignmentType->getType().print(OS, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::aligned";
|
|
if (!((isalignmentExpr && alignmentExpr) || (!isalignmentExpr && alignmentType)))
|
|
++TrailingOmittedArgs;
|
|
if (!(!((isalignmentExpr && alignmentExpr) || (!isalignmentExpr && alignmentType)))) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
if (isalignmentExpr && alignmentExpr) alignmentExpr->printPretty(OS, nullptr, Policy);
|
|
if (!isalignmentExpr && alignmentType) alignmentType->getType().print(OS, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__declspec(align";
|
|
if (!((isalignmentExpr && alignmentExpr) || (!isalignmentExpr && alignmentType)))
|
|
++TrailingOmittedArgs;
|
|
if (!(!((isalignmentExpr && alignmentExpr) || (!isalignmentExpr && alignmentType)))) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
if (isalignmentExpr && alignmentExpr) alignmentExpr->printPretty(OS, nullptr, Policy);
|
|
if (!isalignmentExpr && alignmentType) alignmentType->getType().print(OS, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "alignas";
|
|
if (!((isalignmentExpr && alignmentExpr) || (!isalignmentExpr && alignmentType)))
|
|
++TrailingOmittedArgs;
|
|
if (!(!((isalignmentExpr && alignmentExpr) || (!isalignmentExpr && alignmentType)))) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
if (isalignmentExpr && alignmentExpr) alignmentExpr->printPretty(OS, nullptr, Policy);
|
|
if (!isalignmentExpr && alignmentType) alignmentType->getType().print(OS, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "_Alignas";
|
|
if (!((isalignmentExpr && alignmentExpr) || (!isalignmentExpr && alignmentType)))
|
|
++TrailingOmittedArgs;
|
|
if (!(!((isalignmentExpr && alignmentExpr) || (!isalignmentExpr && alignmentType)))) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
if (isalignmentExpr && alignmentExpr) alignmentExpr->printPretty(OS, nullptr, Policy);
|
|
if (!isalignmentExpr && alignmentType) alignmentType->getType().print(OS, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AlignedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "aligned";
|
|
case 1:
|
|
return "aligned";
|
|
case 2:
|
|
return "aligned";
|
|
case 3:
|
|
return "align";
|
|
case 4:
|
|
return "alignas";
|
|
case 5:
|
|
return "_Alignas";
|
|
}
|
|
}
|
|
|
|
|
|
// AllocAlignAttr implementation
|
|
|
|
AllocAlignAttr *AllocAlignAttr::CreateImplicit(ASTContext &Ctx, ParamIdx ParamIndex, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AllocAlignAttr(Ctx, CommonInfo, ParamIndex);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AllocAlignAttr *AllocAlignAttr::Create(ASTContext &Ctx, ParamIdx ParamIndex, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AllocAlignAttr(Ctx, CommonInfo, ParamIndex);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AllocAlignAttr *AllocAlignAttr::CreateImplicit(ASTContext &Ctx, ParamIdx ParamIndex, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_alloc_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_alloc_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_alloc_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_alloc_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_alloc_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_alloc_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, ParamIndex, I);
|
|
}
|
|
|
|
AllocAlignAttr *AllocAlignAttr::Create(ASTContext &Ctx, ParamIdx ParamIndex, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_alloc_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_alloc_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_alloc_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_alloc_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_alloc_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_alloc_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, ParamIndex, I);
|
|
}
|
|
|
|
AllocAlignAttr::AllocAlignAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, ParamIdx ParamIndex
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AllocAlign, /*IsLateParsed=*/false, false)
|
|
, paramIndex(ParamIndex)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
AllocAlignAttr *AllocAlignAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AllocAlignAttr(C, *this, paramIndex);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AllocAlignAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((alloc_align";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getParamIndex().getSourceIndex() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::alloc_align";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getParamIndex().getSourceIndex() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::alloc_align";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getParamIndex().getSourceIndex() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AllocAlignAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "alloc_align";
|
|
case 1:
|
|
return "alloc_align";
|
|
case 2:
|
|
return "alloc_align";
|
|
}
|
|
}
|
|
|
|
|
|
// AllocSizeAttr implementation
|
|
|
|
AllocSizeAttr *AllocSizeAttr::CreateImplicit(ASTContext &Ctx, ParamIdx ElemSizeParam, ParamIdx NumElemsParam, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AllocSizeAttr(Ctx, CommonInfo, ElemSizeParam, NumElemsParam);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AllocSizeAttr *AllocSizeAttr::Create(ASTContext &Ctx, ParamIdx ElemSizeParam, ParamIdx NumElemsParam, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AllocSizeAttr(Ctx, CommonInfo, ElemSizeParam, NumElemsParam);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AllocSizeAttr *AllocSizeAttr::CreateImplicit(ASTContext &Ctx, ParamIdx ElemSizeParam, ParamIdx NumElemsParam, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_alloc_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_alloc_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_alloc_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_alloc_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_alloc_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_alloc_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, ElemSizeParam, NumElemsParam, I);
|
|
}
|
|
|
|
AllocSizeAttr *AllocSizeAttr::Create(ASTContext &Ctx, ParamIdx ElemSizeParam, ParamIdx NumElemsParam, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_alloc_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_alloc_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_alloc_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_alloc_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_alloc_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_alloc_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, ElemSizeParam, NumElemsParam, I);
|
|
}
|
|
|
|
AllocSizeAttr::AllocSizeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, ParamIdx ElemSizeParam
|
|
, ParamIdx NumElemsParam
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AllocSize, /*IsLateParsed=*/false, false)
|
|
, elemSizeParam(ElemSizeParam)
|
|
, numElemsParam(NumElemsParam)
|
|
{
|
|
}
|
|
|
|
AllocSizeAttr::AllocSizeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, ParamIdx ElemSizeParam
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AllocSize, /*IsLateParsed=*/false, false)
|
|
, elemSizeParam(ElemSizeParam)
|
|
, numElemsParam()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AllocSizeAttr *AllocSizeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AllocSizeAttr(C, *this, elemSizeParam, numElemsParam);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AllocSizeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((alloc_size";
|
|
if (!getNumElemsParam().isValid())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getElemSizeParam().getSourceIndex() << "";
|
|
if (!(!getNumElemsParam().isValid())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNumElemsParam().getSourceIndex() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::alloc_size";
|
|
if (!getNumElemsParam().isValid())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getElemSizeParam().getSourceIndex() << "";
|
|
if (!(!getNumElemsParam().isValid())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNumElemsParam().getSourceIndex() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::alloc_size";
|
|
if (!getNumElemsParam().isValid())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getElemSizeParam().getSourceIndex() << "";
|
|
if (!(!getNumElemsParam().isValid())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNumElemsParam().getSourceIndex() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AllocSizeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "alloc_size";
|
|
case 1:
|
|
return "alloc_size";
|
|
case 2:
|
|
return "alloc_size";
|
|
}
|
|
}
|
|
|
|
|
|
// AllocatingAttr implementation
|
|
|
|
AllocatingAttr *AllocatingAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AllocatingAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AllocatingAttr *AllocatingAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AllocatingAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AllocatingAttr *AllocatingAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_allocating:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_allocating, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_allocating:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_allocating, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_allocating:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_allocating, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AllocatingAttr *AllocatingAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_allocating:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_allocating, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_allocating:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_allocating, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_allocating:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_allocating, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AllocatingAttr::AllocatingAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::Allocating, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
AllocatingAttr *AllocatingAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AllocatingAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AllocatingAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((allocating";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::allocating";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::allocating";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AllocatingAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "allocating";
|
|
case 1:
|
|
return "allocating";
|
|
case 2:
|
|
return "allocating";
|
|
}
|
|
}
|
|
|
|
|
|
// AlwaysDestroyAttr implementation
|
|
|
|
AlwaysDestroyAttr *AlwaysDestroyAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AlwaysDestroyAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AlwaysDestroyAttr *AlwaysDestroyAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AlwaysDestroyAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AlwaysDestroyAttr *AlwaysDestroyAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_always_destroy:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_always_destroy, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_always_destroy:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_always_destroy, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AlwaysDestroyAttr *AlwaysDestroyAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_always_destroy:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_always_destroy, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_always_destroy:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_always_destroy, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AlwaysDestroyAttr::AlwaysDestroyAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AlwaysDestroy, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AlwaysDestroyAttr *AlwaysDestroyAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AlwaysDestroyAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AlwaysDestroyAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((always_destroy";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::always_destroy";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AlwaysDestroyAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "always_destroy";
|
|
case 1:
|
|
return "always_destroy";
|
|
}
|
|
}
|
|
|
|
|
|
// AlwaysInlineAttr implementation
|
|
|
|
AlwaysInlineAttr *AlwaysInlineAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AlwaysInlineAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AlwaysInlineAttr *AlwaysInlineAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AlwaysInlineAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
AlwaysInlineAttr *AlwaysInlineAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_always_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_always_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_always_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_always_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_always_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_always_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_always_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_always_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_always_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_always_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_forceinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_forceinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AlwaysInlineAttr *AlwaysInlineAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_always_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_always_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_always_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_always_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_always_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_always_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_always_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_always_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_always_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_always_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_forceinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_forceinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AlwaysInlineAttr::AlwaysInlineAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: DeclOrStmtAttr(Ctx, CommonInfo, attr::AlwaysInline, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AlwaysInlineAttr::Spelling AlwaysInlineAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_always_inline;
|
|
case 1: return CXX11_gnu_always_inline;
|
|
case 2: return C23_gnu_always_inline;
|
|
case 3: return CXX11_clang_always_inline;
|
|
case 4: return C23_clang_always_inline;
|
|
case 5: return Keyword_forceinline;
|
|
}
|
|
}
|
|
AlwaysInlineAttr *AlwaysInlineAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AlwaysInlineAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AlwaysInlineAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((always_inline";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::always_inline";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::always_inline";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::always_inline";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[clang::always_inline";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "__forceinline";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AlwaysInlineAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "always_inline";
|
|
case 1:
|
|
return "always_inline";
|
|
case 2:
|
|
return "always_inline";
|
|
case 3:
|
|
return "always_inline";
|
|
case 4:
|
|
return "always_inline";
|
|
case 5:
|
|
return "__forceinline";
|
|
}
|
|
}
|
|
|
|
|
|
// AnalyzerNoReturnAttr implementation
|
|
|
|
AnalyzerNoReturnAttr *AnalyzerNoReturnAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnalyzerNoReturnAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AnalyzerNoReturnAttr *AnalyzerNoReturnAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnalyzerNoReturnAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AnalyzerNoReturnAttr *AnalyzerNoReturnAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AnalyzerNoReturnAttr *AnalyzerNoReturnAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AnalyzerNoReturnAttr::AnalyzerNoReturnAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AnalyzerNoReturn, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AnalyzerNoReturnAttr *AnalyzerNoReturnAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AnalyzerNoReturnAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AnalyzerNoReturnAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((analyzer_noreturn";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AnalyzerNoReturnAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "analyzer_noreturn";
|
|
}
|
|
}
|
|
|
|
|
|
// AnnotateAttr implementation
|
|
|
|
AnnotateAttr *AnnotateAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Annotation, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnnotateAttr(Ctx, CommonInfo, Annotation, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AnnotateAttr *AnnotateAttr::Create(ASTContext &Ctx, llvm::StringRef Annotation, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnnotateAttr(Ctx, CommonInfo, Annotation, Args, ArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AnnotateAttr *AnnotateAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Annotation, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_annotate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_annotate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_annotate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_annotate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_annotate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_annotate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Annotation, Args, ArgsSize, I);
|
|
}
|
|
|
|
AnnotateAttr *AnnotateAttr::Create(ASTContext &Ctx, llvm::StringRef Annotation, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_annotate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_annotate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_annotate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_annotate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_annotate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_annotate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Annotation, Args, ArgsSize, I);
|
|
}
|
|
|
|
AnnotateAttr *AnnotateAttr::CreateImplicitWithDelayedArgs(ASTContext &Ctx, Expr * *DelayedArgs, unsigned DelayedArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnnotateAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
A->setDelayedArgs(Ctx, DelayedArgs, DelayedArgsSize);
|
|
return A;
|
|
}
|
|
|
|
AnnotateAttr *AnnotateAttr::CreateWithDelayedArgs(ASTContext &Ctx, Expr * *DelayedArgs, unsigned DelayedArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnnotateAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
A->setDelayedArgs(Ctx, DelayedArgs, DelayedArgsSize);
|
|
return A;
|
|
}
|
|
|
|
AnnotateAttr *AnnotateAttr::CreateImplicitWithDelayedArgs(ASTContext &Ctx, Expr * *DelayedArgs, unsigned DelayedArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_annotate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_annotate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_annotate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_annotate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_annotate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_annotate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicitWithDelayedArgs(Ctx, DelayedArgs, DelayedArgsSize, I);
|
|
}
|
|
|
|
AnnotateAttr *AnnotateAttr::CreateWithDelayedArgs(ASTContext &Ctx, Expr * *DelayedArgs, unsigned DelayedArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_annotate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_annotate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_annotate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_annotate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_annotate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_annotate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateWithDelayedArgs(Ctx, DelayedArgs, DelayedArgsSize, I);
|
|
}
|
|
|
|
AnnotateAttr::AnnotateAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Annotation
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableParamAttr(Ctx, CommonInfo, attr::Annotate, /*IsLateParsed=*/false, false)
|
|
, annotationLength(Annotation.size()),annotation(new (Ctx, 1) char[annotationLength])
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
, delayedArgs_Size(0), delayedArgs_(nullptr)
|
|
{
|
|
if (!Annotation.empty())
|
|
std::memcpy(annotation, Annotation.data(), annotationLength);
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
AnnotateAttr::AnnotateAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Annotation
|
|
)
|
|
: InheritableParamAttr(Ctx, CommonInfo, attr::Annotate, /*IsLateParsed=*/false, false)
|
|
, annotationLength(Annotation.size()),annotation(new (Ctx, 1) char[annotationLength])
|
|
, args_Size(0), args_(nullptr)
|
|
, delayedArgs_Size(0), delayedArgs_(nullptr)
|
|
{
|
|
if (!Annotation.empty())
|
|
std::memcpy(annotation, Annotation.data(), annotationLength);
|
|
}
|
|
|
|
AnnotateAttr::AnnotateAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableParamAttr(Ctx, CommonInfo, attr::Annotate, /*IsLateParsed=*/false, false)
|
|
, annotationLength(0),annotation(nullptr)
|
|
, args_Size(0), args_(nullptr)
|
|
, delayedArgs_Size(0), delayedArgs_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AnnotateAttr *AnnotateAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AnnotateAttr(C, *this, getAnnotation(), args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
A->setDelayedArgs(C, delayedArgs_, delayedArgs_Size);
|
|
return A;
|
|
}
|
|
|
|
void AnnotateAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((annotate";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAnnotation() << "\"";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::annotate";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAnnotation() << "\"";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::annotate";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAnnotation() << "\"";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AnnotateAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "annotate";
|
|
case 1:
|
|
return "annotate";
|
|
case 2:
|
|
return "annotate";
|
|
}
|
|
}
|
|
|
|
|
|
// AnnotateTypeAttr implementation
|
|
|
|
AnnotateTypeAttr *AnnotateTypeAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Annotation, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnnotateTypeAttr(Ctx, CommonInfo, Annotation, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AnnotateTypeAttr *AnnotateTypeAttr::Create(ASTContext &Ctx, llvm::StringRef Annotation, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnnotateTypeAttr(Ctx, CommonInfo, Annotation, Args, ArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AnnotateTypeAttr *AnnotateTypeAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Annotation, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_clang_annotate_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_annotate_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_annotate_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_annotate_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Annotation, Args, ArgsSize, I);
|
|
}
|
|
|
|
AnnotateTypeAttr *AnnotateTypeAttr::Create(ASTContext &Ctx, llvm::StringRef Annotation, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_clang_annotate_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_annotate_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_annotate_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_annotate_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Annotation, Args, ArgsSize, I);
|
|
}
|
|
|
|
AnnotateTypeAttr *AnnotateTypeAttr::CreateImplicitWithDelayedArgs(ASTContext &Ctx, Expr * *DelayedArgs, unsigned DelayedArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnnotateTypeAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
A->setDelayedArgs(Ctx, DelayedArgs, DelayedArgsSize);
|
|
return A;
|
|
}
|
|
|
|
AnnotateTypeAttr *AnnotateTypeAttr::CreateWithDelayedArgs(ASTContext &Ctx, Expr * *DelayedArgs, unsigned DelayedArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnnotateTypeAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
A->setDelayedArgs(Ctx, DelayedArgs, DelayedArgsSize);
|
|
return A;
|
|
}
|
|
|
|
AnnotateTypeAttr *AnnotateTypeAttr::CreateImplicitWithDelayedArgs(ASTContext &Ctx, Expr * *DelayedArgs, unsigned DelayedArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_clang_annotate_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_annotate_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_annotate_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_annotate_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicitWithDelayedArgs(Ctx, DelayedArgs, DelayedArgsSize, I);
|
|
}
|
|
|
|
AnnotateTypeAttr *AnnotateTypeAttr::CreateWithDelayedArgs(ASTContext &Ctx, Expr * *DelayedArgs, unsigned DelayedArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_clang_annotate_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_annotate_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_annotate_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_annotate_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateWithDelayedArgs(Ctx, DelayedArgs, DelayedArgsSize, I);
|
|
}
|
|
|
|
AnnotateTypeAttr::AnnotateTypeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Annotation
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::AnnotateType, /*IsLateParsed=*/false)
|
|
, annotationLength(Annotation.size()),annotation(new (Ctx, 1) char[annotationLength])
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
, delayedArgs_Size(0), delayedArgs_(nullptr)
|
|
{
|
|
if (!Annotation.empty())
|
|
std::memcpy(annotation, Annotation.data(), annotationLength);
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
AnnotateTypeAttr::AnnotateTypeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Annotation
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::AnnotateType, /*IsLateParsed=*/false)
|
|
, annotationLength(Annotation.size()),annotation(new (Ctx, 1) char[annotationLength])
|
|
, args_Size(0), args_(nullptr)
|
|
, delayedArgs_Size(0), delayedArgs_(nullptr)
|
|
{
|
|
if (!Annotation.empty())
|
|
std::memcpy(annotation, Annotation.data(), annotationLength);
|
|
}
|
|
|
|
AnnotateTypeAttr::AnnotateTypeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::AnnotateType, /*IsLateParsed=*/false)
|
|
, annotationLength(0),annotation(nullptr)
|
|
, args_Size(0), args_(nullptr)
|
|
, delayedArgs_Size(0), delayedArgs_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AnnotateTypeAttr *AnnotateTypeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AnnotateTypeAttr(C, *this, getAnnotation(), args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
A->setDelayedArgs(C, delayedArgs_, delayedArgs_Size);
|
|
return A;
|
|
}
|
|
|
|
void AnnotateTypeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[clang::annotate_type";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAnnotation() << "\"";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::annotate_type";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAnnotation() << "\"";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AnnotateTypeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "annotate_type";
|
|
case 1:
|
|
return "annotate_type";
|
|
}
|
|
}
|
|
|
|
|
|
// AnyX86InterruptAttr implementation
|
|
|
|
AnyX86InterruptAttr *AnyX86InterruptAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnyX86InterruptAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AnyX86InterruptAttr *AnyX86InterruptAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnyX86InterruptAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AnyX86InterruptAttr *AnyX86InterruptAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AnyX86InterruptAttr *AnyX86InterruptAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AnyX86InterruptAttr::AnyX86InterruptAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AnyX86Interrupt, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AnyX86InterruptAttr *AnyX86InterruptAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AnyX86InterruptAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AnyX86InterruptAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((interrupt";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::interrupt";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::interrupt";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AnyX86InterruptAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "interrupt";
|
|
case 1:
|
|
return "interrupt";
|
|
case 2:
|
|
return "interrupt";
|
|
}
|
|
}
|
|
|
|
|
|
// AnyX86NoCallerSavedRegistersAttr implementation
|
|
|
|
AnyX86NoCallerSavedRegistersAttr *AnyX86NoCallerSavedRegistersAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnyX86NoCallerSavedRegistersAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AnyX86NoCallerSavedRegistersAttr *AnyX86NoCallerSavedRegistersAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnyX86NoCallerSavedRegistersAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AnyX86NoCallerSavedRegistersAttr *AnyX86NoCallerSavedRegistersAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_caller_saved_registers:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_caller_saved_registers, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_no_caller_saved_registers:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_no_caller_saved_registers, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_no_caller_saved_registers:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_no_caller_saved_registers, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AnyX86NoCallerSavedRegistersAttr *AnyX86NoCallerSavedRegistersAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_caller_saved_registers:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_caller_saved_registers, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_no_caller_saved_registers:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_no_caller_saved_registers, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_no_caller_saved_registers:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_no_caller_saved_registers, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AnyX86NoCallerSavedRegistersAttr::AnyX86NoCallerSavedRegistersAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AnyX86NoCallerSavedRegisters, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AnyX86NoCallerSavedRegistersAttr *AnyX86NoCallerSavedRegistersAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AnyX86NoCallerSavedRegistersAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AnyX86NoCallerSavedRegistersAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((no_caller_saved_registers";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::no_caller_saved_registers";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::no_caller_saved_registers";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AnyX86NoCallerSavedRegistersAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "no_caller_saved_registers";
|
|
case 1:
|
|
return "no_caller_saved_registers";
|
|
case 2:
|
|
return "no_caller_saved_registers";
|
|
}
|
|
}
|
|
|
|
|
|
// AnyX86NoCfCheckAttr implementation
|
|
|
|
AnyX86NoCfCheckAttr *AnyX86NoCfCheckAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnyX86NoCfCheckAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AnyX86NoCfCheckAttr *AnyX86NoCfCheckAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AnyX86NoCfCheckAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AnyX86NoCfCheckAttr *AnyX86NoCfCheckAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nocf_check:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nocf_check, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nocf_check:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nocf_check, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nocf_check:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nocf_check, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AnyX86NoCfCheckAttr *AnyX86NoCfCheckAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nocf_check:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nocf_check, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nocf_check:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nocf_check, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nocf_check:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nocf_check, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AnyX86NoCfCheckAttr::AnyX86NoCfCheckAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AnyX86NoCfCheck, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AnyX86NoCfCheckAttr *AnyX86NoCfCheckAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AnyX86NoCfCheckAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AnyX86NoCfCheckAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((nocf_check";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::nocf_check";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::nocf_check";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AnyX86NoCfCheckAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nocf_check";
|
|
case 1:
|
|
return "nocf_check";
|
|
case 2:
|
|
return "nocf_check";
|
|
}
|
|
}
|
|
|
|
|
|
// ArcWeakrefUnavailableAttr implementation
|
|
|
|
ArcWeakrefUnavailableAttr *ArcWeakrefUnavailableAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArcWeakrefUnavailableAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArcWeakrefUnavailableAttr *ArcWeakrefUnavailableAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArcWeakrefUnavailableAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArcWeakrefUnavailableAttr *ArcWeakrefUnavailableAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_arc_weak_reference_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_arc_weak_reference_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_arc_weak_reference_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_arc_weak_reference_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_arc_weak_reference_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_arc_weak_reference_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ArcWeakrefUnavailableAttr *ArcWeakrefUnavailableAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_arc_weak_reference_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_arc_weak_reference_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_arc_weak_reference_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_arc_weak_reference_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_arc_weak_reference_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_arc_weak_reference_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ArcWeakrefUnavailableAttr::ArcWeakrefUnavailableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ArcWeakrefUnavailable, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ArcWeakrefUnavailableAttr *ArcWeakrefUnavailableAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArcWeakrefUnavailableAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArcWeakrefUnavailableAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_arc_weak_reference_unavailable";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_arc_weak_reference_unavailable";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_arc_weak_reference_unavailable";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArcWeakrefUnavailableAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_arc_weak_reference_unavailable";
|
|
case 1:
|
|
return "objc_arc_weak_reference_unavailable";
|
|
case 2:
|
|
return "objc_arc_weak_reference_unavailable";
|
|
}
|
|
}
|
|
|
|
|
|
// ArgumentWithTypeTagAttr implementation
|
|
|
|
ArgumentWithTypeTagAttr *ArgumentWithTypeTagAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * ArgumentKind, ParamIdx ArgumentIdx, ParamIdx TypeTagIdx, bool IsPointer, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArgumentWithTypeTagAttr(Ctx, CommonInfo, ArgumentKind, ArgumentIdx, TypeTagIdx, IsPointer);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArgumentWithTypeTagAttr *ArgumentWithTypeTagAttr::Create(ASTContext &Ctx, IdentifierInfo * ArgumentKind, ParamIdx ArgumentIdx, ParamIdx TypeTagIdx, bool IsPointer, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArgumentWithTypeTagAttr(Ctx, CommonInfo, ArgumentKind, ArgumentIdx, TypeTagIdx, IsPointer);
|
|
return A;
|
|
}
|
|
|
|
ArgumentWithTypeTagAttr *ArgumentWithTypeTagAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * ArgumentKind, ParamIdx ArgumentIdx, ParamIdx TypeTagIdx, bool IsPointer, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_argument_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_argument_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_argument_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_argument_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_argument_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_argument_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_pointer_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pointer_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_pointer_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_pointer_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_pointer_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_pointer_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, ArgumentKind, ArgumentIdx, TypeTagIdx, IsPointer, I);
|
|
}
|
|
|
|
ArgumentWithTypeTagAttr *ArgumentWithTypeTagAttr::Create(ASTContext &Ctx, IdentifierInfo * ArgumentKind, ParamIdx ArgumentIdx, ParamIdx TypeTagIdx, bool IsPointer, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_argument_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_argument_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_argument_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_argument_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_argument_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_argument_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_pointer_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pointer_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_pointer_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_pointer_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_pointer_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_pointer_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, ArgumentKind, ArgumentIdx, TypeTagIdx, IsPointer, I);
|
|
}
|
|
|
|
ArgumentWithTypeTagAttr *ArgumentWithTypeTagAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * ArgumentKind, ParamIdx ArgumentIdx, ParamIdx TypeTagIdx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArgumentWithTypeTagAttr(Ctx, CommonInfo, ArgumentKind, ArgumentIdx, TypeTagIdx);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArgumentWithTypeTagAttr *ArgumentWithTypeTagAttr::Create(ASTContext &Ctx, IdentifierInfo * ArgumentKind, ParamIdx ArgumentIdx, ParamIdx TypeTagIdx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArgumentWithTypeTagAttr(Ctx, CommonInfo, ArgumentKind, ArgumentIdx, TypeTagIdx);
|
|
return A;
|
|
}
|
|
|
|
ArgumentWithTypeTagAttr *ArgumentWithTypeTagAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * ArgumentKind, ParamIdx ArgumentIdx, ParamIdx TypeTagIdx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_argument_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_argument_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_argument_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_argument_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_argument_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_argument_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_pointer_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pointer_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_pointer_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_pointer_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_pointer_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_pointer_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, ArgumentKind, ArgumentIdx, TypeTagIdx, I);
|
|
}
|
|
|
|
ArgumentWithTypeTagAttr *ArgumentWithTypeTagAttr::Create(ASTContext &Ctx, IdentifierInfo * ArgumentKind, ParamIdx ArgumentIdx, ParamIdx TypeTagIdx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_argument_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_argument_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_argument_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_argument_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_argument_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_argument_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_pointer_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pointer_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_pointer_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_pointer_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_pointer_with_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_pointer_with_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, ArgumentKind, ArgumentIdx, TypeTagIdx, I);
|
|
}
|
|
|
|
ArgumentWithTypeTagAttr::ArgumentWithTypeTagAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * ArgumentKind
|
|
, ParamIdx ArgumentIdx
|
|
, ParamIdx TypeTagIdx
|
|
, bool IsPointer
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ArgumentWithTypeTag, /*IsLateParsed=*/false, false)
|
|
, argumentKind(ArgumentKind)
|
|
, argumentIdx(ArgumentIdx)
|
|
, typeTagIdx(TypeTagIdx)
|
|
, isPointer(IsPointer)
|
|
{
|
|
}
|
|
|
|
ArgumentWithTypeTagAttr::ArgumentWithTypeTagAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * ArgumentKind
|
|
, ParamIdx ArgumentIdx
|
|
, ParamIdx TypeTagIdx
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ArgumentWithTypeTag, /*IsLateParsed=*/false, false)
|
|
, argumentKind(ArgumentKind)
|
|
, argumentIdx(ArgumentIdx)
|
|
, typeTagIdx(TypeTagIdx)
|
|
, isPointer()
|
|
{
|
|
}
|
|
|
|
ArgumentWithTypeTagAttr::Spelling ArgumentWithTypeTagAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_argument_with_type_tag;
|
|
case 1: return CXX11_clang_argument_with_type_tag;
|
|
case 2: return C23_clang_argument_with_type_tag;
|
|
case 3: return GNU_pointer_with_type_tag;
|
|
case 4: return CXX11_clang_pointer_with_type_tag;
|
|
case 5: return C23_clang_pointer_with_type_tag;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ArgumentWithTypeTagAttr *ArgumentWithTypeTagAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArgumentWithTypeTagAttr(C, *this, argumentKind, argumentIdx, typeTagIdx, isPointer);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArgumentWithTypeTagAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((argument_with_type_tag";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getArgumentKind() ? getArgumentKind()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getArgumentIdx().getSourceIndex() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getTypeTagIdx().getSourceIndex() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::argument_with_type_tag";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getArgumentKind() ? getArgumentKind()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getArgumentIdx().getSourceIndex() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getTypeTagIdx().getSourceIndex() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::argument_with_type_tag";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getArgumentKind() ? getArgumentKind()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getArgumentIdx().getSourceIndex() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getTypeTagIdx().getSourceIndex() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__attribute__((pointer_with_type_tag";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getArgumentKind() ? getArgumentKind()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getArgumentIdx().getSourceIndex() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getTypeTagIdx().getSourceIndex() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[clang::pointer_with_type_tag";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getArgumentKind() ? getArgumentKind()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getArgumentIdx().getSourceIndex() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getTypeTagIdx().getSourceIndex() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[clang::pointer_with_type_tag";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getArgumentKind() ? getArgumentKind()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getArgumentIdx().getSourceIndex() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getTypeTagIdx().getSourceIndex() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArgumentWithTypeTagAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "argument_with_type_tag";
|
|
case 1:
|
|
return "argument_with_type_tag";
|
|
case 2:
|
|
return "argument_with_type_tag";
|
|
case 3:
|
|
return "pointer_with_type_tag";
|
|
case 4:
|
|
return "pointer_with_type_tag";
|
|
case 5:
|
|
return "pointer_with_type_tag";
|
|
}
|
|
}
|
|
|
|
|
|
// ArmBuiltinAliasAttr implementation
|
|
|
|
ArmBuiltinAliasAttr *ArmBuiltinAliasAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * BuiltinName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmBuiltinAliasAttr(Ctx, CommonInfo, BuiltinName);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmBuiltinAliasAttr *ArmBuiltinAliasAttr::Create(ASTContext &Ctx, IdentifierInfo * BuiltinName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmBuiltinAliasAttr(Ctx, CommonInfo, BuiltinName);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmBuiltinAliasAttr *ArmBuiltinAliasAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * BuiltinName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_clang_arm_builtin_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_clang_arm_builtin_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_clang_arm_builtin_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_clang_arm_builtin_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_clang_arm_builtin_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_clang_arm_builtin_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, BuiltinName, I);
|
|
}
|
|
|
|
ArmBuiltinAliasAttr *ArmBuiltinAliasAttr::Create(ASTContext &Ctx, IdentifierInfo * BuiltinName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_clang_arm_builtin_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_clang_arm_builtin_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_clang_arm_builtin_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_clang_arm_builtin_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_clang_arm_builtin_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_clang_arm_builtin_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, BuiltinName, I);
|
|
}
|
|
|
|
ArmBuiltinAliasAttr::ArmBuiltinAliasAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * BuiltinName
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ArmBuiltinAlias, /*IsLateParsed=*/false, false)
|
|
, builtinName(BuiltinName)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
ArmBuiltinAliasAttr *ArmBuiltinAliasAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArmBuiltinAliasAttr(C, *this, builtinName);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArmBuiltinAliasAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((__clang_arm_builtin_alias";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getBuiltinName() ? getBuiltinName()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::__clang_arm_builtin_alias";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getBuiltinName() ? getBuiltinName()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::__clang_arm_builtin_alias";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getBuiltinName() ? getBuiltinName()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArmBuiltinAliasAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__clang_arm_builtin_alias";
|
|
case 1:
|
|
return "__clang_arm_builtin_alias";
|
|
case 2:
|
|
return "__clang_arm_builtin_alias";
|
|
}
|
|
}
|
|
|
|
|
|
// ArmInAttr implementation
|
|
|
|
ArmInAttr *ArmInAttr::CreateImplicit(ASTContext &Ctx, StringRef *InArgs, unsigned InArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmInAttr(Ctx, CommonInfo, InArgs, InArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmInAttr *ArmInAttr::Create(ASTContext &Ctx, StringRef *InArgs, unsigned InArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmInAttr(Ctx, CommonInfo, InArgs, InArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmInAttr *ArmInAttr::CreateImplicit(ASTContext &Ctx, StringRef *InArgs, unsigned InArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, InArgs, InArgsSize, I);
|
|
}
|
|
|
|
ArmInAttr *ArmInAttr::Create(ASTContext &Ctx, StringRef *InArgs, unsigned InArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, InArgs, InArgsSize, I);
|
|
}
|
|
|
|
ArmInAttr::ArmInAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, StringRef *InArgs, unsigned InArgsSize
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ArmIn, /*IsLateParsed=*/false)
|
|
, inArgs_Size(InArgsSize), inArgs_(new (Ctx, 16) StringRef[inArgs_Size])
|
|
{
|
|
for (size_t I = 0, E = inArgs_Size; I != E;
|
|
++I) {
|
|
StringRef Ref = InArgs[I];
|
|
if (!Ref.empty()) {
|
|
char *Mem = new (Ctx, 1) char[Ref.size()];
|
|
std::memcpy(Mem, Ref.data(), Ref.size());
|
|
inArgs_[I] = StringRef(Mem, Ref.size());
|
|
}
|
|
}
|
|
}
|
|
|
|
ArmInAttr::ArmInAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ArmIn, /*IsLateParsed=*/false)
|
|
, inArgs_Size(0), inArgs_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
ArmInAttr *ArmInAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArmInAttr(C, *this, inArgs_, inArgs_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArmInAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__arm_in";
|
|
OS << "";
|
|
for (const auto &Val : inArgs()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArmInAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__arm_in";
|
|
}
|
|
}
|
|
|
|
|
|
// ArmInOutAttr implementation
|
|
|
|
ArmInOutAttr *ArmInOutAttr::CreateImplicit(ASTContext &Ctx, StringRef *InOutArgs, unsigned InOutArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmInOutAttr(Ctx, CommonInfo, InOutArgs, InOutArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmInOutAttr *ArmInOutAttr::Create(ASTContext &Ctx, StringRef *InOutArgs, unsigned InOutArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmInOutAttr(Ctx, CommonInfo, InOutArgs, InOutArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmInOutAttr *ArmInOutAttr::CreateImplicit(ASTContext &Ctx, StringRef *InOutArgs, unsigned InOutArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, InOutArgs, InOutArgsSize, I);
|
|
}
|
|
|
|
ArmInOutAttr *ArmInOutAttr::Create(ASTContext &Ctx, StringRef *InOutArgs, unsigned InOutArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, InOutArgs, InOutArgsSize, I);
|
|
}
|
|
|
|
ArmInOutAttr::ArmInOutAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, StringRef *InOutArgs, unsigned InOutArgsSize
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ArmInOut, /*IsLateParsed=*/false)
|
|
, inOutArgs_Size(InOutArgsSize), inOutArgs_(new (Ctx, 16) StringRef[inOutArgs_Size])
|
|
{
|
|
for (size_t I = 0, E = inOutArgs_Size; I != E;
|
|
++I) {
|
|
StringRef Ref = InOutArgs[I];
|
|
if (!Ref.empty()) {
|
|
char *Mem = new (Ctx, 1) char[Ref.size()];
|
|
std::memcpy(Mem, Ref.data(), Ref.size());
|
|
inOutArgs_[I] = StringRef(Mem, Ref.size());
|
|
}
|
|
}
|
|
}
|
|
|
|
ArmInOutAttr::ArmInOutAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ArmInOut, /*IsLateParsed=*/false)
|
|
, inOutArgs_Size(0), inOutArgs_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
ArmInOutAttr *ArmInOutAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArmInOutAttr(C, *this, inOutArgs_, inOutArgs_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArmInOutAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__arm_inout";
|
|
OS << "";
|
|
for (const auto &Val : inOutArgs()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArmInOutAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__arm_inout";
|
|
}
|
|
}
|
|
|
|
|
|
// ArmLocallyStreamingAttr implementation
|
|
|
|
ArmLocallyStreamingAttr *ArmLocallyStreamingAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmLocallyStreamingAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmLocallyStreamingAttr *ArmLocallyStreamingAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmLocallyStreamingAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmLocallyStreamingAttr *ArmLocallyStreamingAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ArmLocallyStreamingAttr *ArmLocallyStreamingAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ArmLocallyStreamingAttr::ArmLocallyStreamingAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ArmLocallyStreaming, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ArmLocallyStreamingAttr *ArmLocallyStreamingAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArmLocallyStreamingAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArmLocallyStreamingAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__arm_locally_streaming";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArmLocallyStreamingAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__arm_locally_streaming";
|
|
}
|
|
}
|
|
|
|
|
|
// ArmMveStrictPolymorphismAttr implementation
|
|
|
|
ArmMveStrictPolymorphismAttr *ArmMveStrictPolymorphismAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmMveStrictPolymorphismAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmMveStrictPolymorphismAttr *ArmMveStrictPolymorphismAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmMveStrictPolymorphismAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmMveStrictPolymorphismAttr *ArmMveStrictPolymorphismAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_clang_arm_mve_strict_polymorphism:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_clang_arm_mve_strict_polymorphism, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_clang_arm_mve_strict_polymorphism:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_clang_arm_mve_strict_polymorphism, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_clang_arm_mve_strict_polymorphism:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_clang_arm_mve_strict_polymorphism, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ArmMveStrictPolymorphismAttr *ArmMveStrictPolymorphismAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_clang_arm_mve_strict_polymorphism:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_clang_arm_mve_strict_polymorphism, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_clang_arm_mve_strict_polymorphism:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_clang_arm_mve_strict_polymorphism, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_clang_arm_mve_strict_polymorphism:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_clang_arm_mve_strict_polymorphism, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ArmMveStrictPolymorphismAttr::ArmMveStrictPolymorphismAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ArmMveStrictPolymorphism, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ArmMveStrictPolymorphismAttr *ArmMveStrictPolymorphismAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArmMveStrictPolymorphismAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArmMveStrictPolymorphismAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((__clang_arm_mve_strict_polymorphism";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::__clang_arm_mve_strict_polymorphism";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::__clang_arm_mve_strict_polymorphism";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArmMveStrictPolymorphismAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__clang_arm_mve_strict_polymorphism";
|
|
case 1:
|
|
return "__clang_arm_mve_strict_polymorphism";
|
|
case 2:
|
|
return "__clang_arm_mve_strict_polymorphism";
|
|
}
|
|
}
|
|
|
|
|
|
// ArmNewAttr implementation
|
|
|
|
ArmNewAttr *ArmNewAttr::CreateImplicit(ASTContext &Ctx, StringRef *NewArgs, unsigned NewArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmNewAttr(Ctx, CommonInfo, NewArgs, NewArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmNewAttr *ArmNewAttr::Create(ASTContext &Ctx, StringRef *NewArgs, unsigned NewArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmNewAttr(Ctx, CommonInfo, NewArgs, NewArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmNewAttr *ArmNewAttr::CreateImplicit(ASTContext &Ctx, StringRef *NewArgs, unsigned NewArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, NewArgs, NewArgsSize, I);
|
|
}
|
|
|
|
ArmNewAttr *ArmNewAttr::Create(ASTContext &Ctx, StringRef *NewArgs, unsigned NewArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, NewArgs, NewArgsSize, I);
|
|
}
|
|
|
|
ArmNewAttr::ArmNewAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, StringRef *NewArgs, unsigned NewArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ArmNew, /*IsLateParsed=*/false, false)
|
|
, newArgs_Size(NewArgsSize), newArgs_(new (Ctx, 16) StringRef[newArgs_Size])
|
|
{
|
|
for (size_t I = 0, E = newArgs_Size; I != E;
|
|
++I) {
|
|
StringRef Ref = NewArgs[I];
|
|
if (!Ref.empty()) {
|
|
char *Mem = new (Ctx, 1) char[Ref.size()];
|
|
std::memcpy(Mem, Ref.data(), Ref.size());
|
|
newArgs_[I] = StringRef(Mem, Ref.size());
|
|
}
|
|
}
|
|
}
|
|
|
|
ArmNewAttr::ArmNewAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ArmNew, /*IsLateParsed=*/false, false)
|
|
, newArgs_Size(0), newArgs_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
ArmNewAttr *ArmNewAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArmNewAttr(C, *this, newArgs_, newArgs_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArmNewAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__arm_new";
|
|
OS << "";
|
|
for (const auto &Val : newArgs()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArmNewAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__arm_new";
|
|
}
|
|
}
|
|
|
|
|
|
// ArmOutAttr implementation
|
|
|
|
ArmOutAttr *ArmOutAttr::CreateImplicit(ASTContext &Ctx, StringRef *OutArgs, unsigned OutArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmOutAttr(Ctx, CommonInfo, OutArgs, OutArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmOutAttr *ArmOutAttr::Create(ASTContext &Ctx, StringRef *OutArgs, unsigned OutArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmOutAttr(Ctx, CommonInfo, OutArgs, OutArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmOutAttr *ArmOutAttr::CreateImplicit(ASTContext &Ctx, StringRef *OutArgs, unsigned OutArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, OutArgs, OutArgsSize, I);
|
|
}
|
|
|
|
ArmOutAttr *ArmOutAttr::Create(ASTContext &Ctx, StringRef *OutArgs, unsigned OutArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, OutArgs, OutArgsSize, I);
|
|
}
|
|
|
|
ArmOutAttr::ArmOutAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, StringRef *OutArgs, unsigned OutArgsSize
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ArmOut, /*IsLateParsed=*/false)
|
|
, outArgs_Size(OutArgsSize), outArgs_(new (Ctx, 16) StringRef[outArgs_Size])
|
|
{
|
|
for (size_t I = 0, E = outArgs_Size; I != E;
|
|
++I) {
|
|
StringRef Ref = OutArgs[I];
|
|
if (!Ref.empty()) {
|
|
char *Mem = new (Ctx, 1) char[Ref.size()];
|
|
std::memcpy(Mem, Ref.data(), Ref.size());
|
|
outArgs_[I] = StringRef(Mem, Ref.size());
|
|
}
|
|
}
|
|
}
|
|
|
|
ArmOutAttr::ArmOutAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ArmOut, /*IsLateParsed=*/false)
|
|
, outArgs_Size(0), outArgs_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
ArmOutAttr *ArmOutAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArmOutAttr(C, *this, outArgs_, outArgs_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArmOutAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__arm_out";
|
|
OS << "";
|
|
for (const auto &Val : outArgs()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArmOutAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__arm_out";
|
|
}
|
|
}
|
|
|
|
|
|
// ArmPreservesAttr implementation
|
|
|
|
ArmPreservesAttr *ArmPreservesAttr::CreateImplicit(ASTContext &Ctx, StringRef *PreserveArgs, unsigned PreserveArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmPreservesAttr(Ctx, CommonInfo, PreserveArgs, PreserveArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmPreservesAttr *ArmPreservesAttr::Create(ASTContext &Ctx, StringRef *PreserveArgs, unsigned PreserveArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmPreservesAttr(Ctx, CommonInfo, PreserveArgs, PreserveArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmPreservesAttr *ArmPreservesAttr::CreateImplicit(ASTContext &Ctx, StringRef *PreserveArgs, unsigned PreserveArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, PreserveArgs, PreserveArgsSize, I);
|
|
}
|
|
|
|
ArmPreservesAttr *ArmPreservesAttr::Create(ASTContext &Ctx, StringRef *PreserveArgs, unsigned PreserveArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, PreserveArgs, PreserveArgsSize, I);
|
|
}
|
|
|
|
ArmPreservesAttr::ArmPreservesAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, StringRef *PreserveArgs, unsigned PreserveArgsSize
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ArmPreserves, /*IsLateParsed=*/false)
|
|
, preserveArgs_Size(PreserveArgsSize), preserveArgs_(new (Ctx, 16) StringRef[preserveArgs_Size])
|
|
{
|
|
for (size_t I = 0, E = preserveArgs_Size; I != E;
|
|
++I) {
|
|
StringRef Ref = PreserveArgs[I];
|
|
if (!Ref.empty()) {
|
|
char *Mem = new (Ctx, 1) char[Ref.size()];
|
|
std::memcpy(Mem, Ref.data(), Ref.size());
|
|
preserveArgs_[I] = StringRef(Mem, Ref.size());
|
|
}
|
|
}
|
|
}
|
|
|
|
ArmPreservesAttr::ArmPreservesAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ArmPreserves, /*IsLateParsed=*/false)
|
|
, preserveArgs_Size(0), preserveArgs_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
ArmPreservesAttr *ArmPreservesAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArmPreservesAttr(C, *this, preserveArgs_, preserveArgs_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArmPreservesAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__arm_preserves";
|
|
OS << "";
|
|
for (const auto &Val : preserveArgs()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArmPreservesAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__arm_preserves";
|
|
}
|
|
}
|
|
|
|
|
|
// ArmStreamingAttr implementation
|
|
|
|
ArmStreamingAttr *ArmStreamingAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmStreamingAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmStreamingAttr *ArmStreamingAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmStreamingAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmStreamingAttr *ArmStreamingAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ArmStreamingAttr *ArmStreamingAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ArmStreamingAttr::ArmStreamingAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ArmStreaming, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ArmStreamingAttr *ArmStreamingAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArmStreamingAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArmStreamingAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__arm_streaming";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArmStreamingAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__arm_streaming";
|
|
}
|
|
}
|
|
|
|
|
|
// ArmStreamingCompatibleAttr implementation
|
|
|
|
ArmStreamingCompatibleAttr *ArmStreamingCompatibleAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmStreamingCompatibleAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmStreamingCompatibleAttr *ArmStreamingCompatibleAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArmStreamingCompatibleAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArmStreamingCompatibleAttr *ArmStreamingCompatibleAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ArmStreamingCompatibleAttr *ArmStreamingCompatibleAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, true /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ArmStreamingCompatibleAttr::ArmStreamingCompatibleAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ArmStreamingCompatible, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ArmStreamingCompatibleAttr *ArmStreamingCompatibleAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArmStreamingCompatibleAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArmStreamingCompatibleAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__arm_streaming_compatible";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArmStreamingCompatibleAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__arm_streaming_compatible";
|
|
}
|
|
}
|
|
|
|
|
|
// ArtificialAttr implementation
|
|
|
|
ArtificialAttr *ArtificialAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArtificialAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArtificialAttr *ArtificialAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ArtificialAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ArtificialAttr *ArtificialAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_artificial:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_artificial, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_artificial:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_artificial, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_artificial:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_artificial, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ArtificialAttr *ArtificialAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_artificial:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_artificial, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_artificial:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_artificial, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_artificial:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_artificial, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ArtificialAttr::ArtificialAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Artificial, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ArtificialAttr *ArtificialAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ArtificialAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ArtificialAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((artificial";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::artificial";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::artificial";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ArtificialAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "artificial";
|
|
case 1:
|
|
return "artificial";
|
|
case 2:
|
|
return "artificial";
|
|
}
|
|
}
|
|
|
|
|
|
// AsmLabelAttr implementation
|
|
|
|
AsmLabelAttr *AsmLabelAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Label, bool IsLiteralLabel, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AsmLabelAttr(Ctx, CommonInfo, Label, IsLiteralLabel);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AsmLabelAttr *AsmLabelAttr::Create(ASTContext &Ctx, llvm::StringRef Label, bool IsLiteralLabel, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AsmLabelAttr(Ctx, CommonInfo, Label, IsLiteralLabel);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AsmLabelAttr *AsmLabelAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Label, bool IsLiteralLabel, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_asm:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_asm, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Label, IsLiteralLabel, I);
|
|
}
|
|
|
|
AsmLabelAttr *AsmLabelAttr::Create(ASTContext &Ctx, llvm::StringRef Label, bool IsLiteralLabel, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_asm:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_asm, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Label, IsLiteralLabel, I);
|
|
}
|
|
|
|
AsmLabelAttr *AsmLabelAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Label, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AsmLabelAttr(Ctx, CommonInfo, Label);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AsmLabelAttr *AsmLabelAttr::Create(ASTContext &Ctx, llvm::StringRef Label, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AsmLabelAttr(Ctx, CommonInfo, Label);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AsmLabelAttr *AsmLabelAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Label, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_asm:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_asm, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Label, I);
|
|
}
|
|
|
|
AsmLabelAttr *AsmLabelAttr::Create(ASTContext &Ctx, llvm::StringRef Label, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_asm:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_asm, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Label, I);
|
|
}
|
|
|
|
AsmLabelAttr::AsmLabelAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Label
|
|
, bool IsLiteralLabel
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AsmLabel, /*IsLateParsed=*/false, false)
|
|
, labelLength(Label.size()),label(new (Ctx, 1) char[labelLength])
|
|
, isLiteralLabel(IsLiteralLabel)
|
|
{
|
|
if (!Label.empty())
|
|
std::memcpy(label, Label.data(), labelLength);
|
|
}
|
|
|
|
AsmLabelAttr::AsmLabelAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Label
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AsmLabel, /*IsLateParsed=*/false, false)
|
|
, labelLength(Label.size()),label(new (Ctx, 1) char[labelLength])
|
|
, isLiteralLabel()
|
|
{
|
|
if (!Label.empty())
|
|
std::memcpy(label, Label.data(), labelLength);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AsmLabelAttr *AsmLabelAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AsmLabelAttr(C, *this, getLabel(), isLiteralLabel);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AsmLabelAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "asm";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getLabel() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__asm__";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getLabel() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AsmLabelAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "asm";
|
|
case 1:
|
|
return "__asm__";
|
|
}
|
|
}
|
|
|
|
|
|
// AssertCapabilityAttr implementation
|
|
|
|
AssertCapabilityAttr *AssertCapabilityAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AssertCapabilityAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AssertCapabilityAttr *AssertCapabilityAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AssertCapabilityAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
return A;
|
|
}
|
|
|
|
AssertCapabilityAttr *AssertCapabilityAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_assert_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_assert_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_assert_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_assert_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_assert_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_assert_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_assert_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_assert_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
AssertCapabilityAttr *AssertCapabilityAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_assert_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_assert_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_assert_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_assert_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_assert_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_assert_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_assert_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_assert_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
AssertCapabilityAttr::AssertCapabilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AssertCapability, /*IsLateParsed=*/true, true)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
AssertCapabilityAttr::AssertCapabilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AssertCapability, /*IsLateParsed=*/true, true)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
AssertCapabilityAttr::Spelling AssertCapabilityAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_assert_capability;
|
|
case 1: return CXX11_clang_assert_capability;
|
|
case 2: return GNU_assert_shared_capability;
|
|
case 3: return CXX11_clang_assert_shared_capability;
|
|
}
|
|
}
|
|
|
|
|
|
AssertCapabilityAttr *AssertCapabilityAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AssertCapabilityAttr(C, *this, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AssertCapabilityAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((assert_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::assert_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((assert_shared_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::assert_shared_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AssertCapabilityAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "assert_capability";
|
|
case 1:
|
|
return "assert_capability";
|
|
case 2:
|
|
return "assert_shared_capability";
|
|
case 3:
|
|
return "assert_shared_capability";
|
|
}
|
|
}
|
|
|
|
|
|
// AssertExclusiveLockAttr implementation
|
|
|
|
AssertExclusiveLockAttr *AssertExclusiveLockAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AssertExclusiveLockAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AssertExclusiveLockAttr *AssertExclusiveLockAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AssertExclusiveLockAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AssertExclusiveLockAttr *AssertExclusiveLockAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
AssertExclusiveLockAttr *AssertExclusiveLockAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
AssertExclusiveLockAttr::AssertExclusiveLockAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AssertExclusiveLock, /*IsLateParsed=*/true, true)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
AssertExclusiveLockAttr::AssertExclusiveLockAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AssertExclusiveLock, /*IsLateParsed=*/true, true)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
AssertExclusiveLockAttr *AssertExclusiveLockAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AssertExclusiveLockAttr(C, *this, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AssertExclusiveLockAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((assert_exclusive_lock";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AssertExclusiveLockAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "assert_exclusive_lock";
|
|
}
|
|
}
|
|
|
|
|
|
// AssertSharedLockAttr implementation
|
|
|
|
AssertSharedLockAttr *AssertSharedLockAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AssertSharedLockAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AssertSharedLockAttr *AssertSharedLockAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AssertSharedLockAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AssertSharedLockAttr *AssertSharedLockAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
AssertSharedLockAttr *AssertSharedLockAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
AssertSharedLockAttr::AssertSharedLockAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AssertSharedLock, /*IsLateParsed=*/true, true)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
AssertSharedLockAttr::AssertSharedLockAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AssertSharedLock, /*IsLateParsed=*/true, true)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
AssertSharedLockAttr *AssertSharedLockAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AssertSharedLockAttr(C, *this, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AssertSharedLockAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((assert_shared_lock";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AssertSharedLockAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "assert_shared_lock";
|
|
}
|
|
}
|
|
|
|
|
|
// AssumeAlignedAttr implementation
|
|
|
|
AssumeAlignedAttr *AssumeAlignedAttr::CreateImplicit(ASTContext &Ctx, Expr * Alignment, Expr * Offset, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AssumeAlignedAttr(Ctx, CommonInfo, Alignment, Offset);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AssumeAlignedAttr *AssumeAlignedAttr::Create(ASTContext &Ctx, Expr * Alignment, Expr * Offset, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AssumeAlignedAttr(Ctx, CommonInfo, Alignment, Offset);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AssumeAlignedAttr *AssumeAlignedAttr::CreateImplicit(ASTContext &Ctx, Expr * Alignment, Expr * Offset, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_assume_aligned:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_assume_aligned, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_assume_aligned:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_assume_aligned, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_assume_aligned:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_assume_aligned, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Alignment, Offset, I);
|
|
}
|
|
|
|
AssumeAlignedAttr *AssumeAlignedAttr::Create(ASTContext &Ctx, Expr * Alignment, Expr * Offset, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_assume_aligned:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_assume_aligned, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_assume_aligned:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_assume_aligned, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_assume_aligned:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_assume_aligned, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Alignment, Offset, I);
|
|
}
|
|
|
|
AssumeAlignedAttr::AssumeAlignedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Alignment
|
|
, Expr * Offset
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AssumeAligned, /*IsLateParsed=*/false, false)
|
|
, alignment(Alignment)
|
|
, offset(Offset)
|
|
{
|
|
}
|
|
|
|
AssumeAlignedAttr::AssumeAlignedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Alignment
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AssumeAligned, /*IsLateParsed=*/false, false)
|
|
, alignment(Alignment)
|
|
, offset()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AssumeAlignedAttr *AssumeAlignedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AssumeAlignedAttr(C, *this, alignment, offset);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AssumeAlignedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((assume_aligned";
|
|
if (!getOffset())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getAlignment()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!(!getOffset())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getOffset()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::assume_aligned";
|
|
if (!getOffset())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getAlignment()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!(!getOffset())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getOffset()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::assume_aligned";
|
|
if (!getOffset())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getAlignment()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!(!getOffset())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getOffset()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AssumeAlignedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "assume_aligned";
|
|
case 1:
|
|
return "assume_aligned";
|
|
case 2:
|
|
return "assume_aligned";
|
|
}
|
|
}
|
|
|
|
|
|
// AvailabilityAttr implementation
|
|
|
|
AvailabilityAttr *AvailabilityAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * Platform, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool Unavailable, llvm::StringRef Message, bool Strict, llvm::StringRef Replacement, int Priority, IdentifierInfo * Environment, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AvailabilityAttr(Ctx, CommonInfo, Platform, Introduced, Deprecated, Obsoleted, Unavailable, Message, Strict, Replacement, Priority, Environment);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AvailabilityAttr *AvailabilityAttr::Create(ASTContext &Ctx, IdentifierInfo * Platform, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool Unavailable, llvm::StringRef Message, bool Strict, llvm::StringRef Replacement, int Priority, IdentifierInfo * Environment, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AvailabilityAttr(Ctx, CommonInfo, Platform, Introduced, Deprecated, Obsoleted, Unavailable, Message, Strict, Replacement, Priority, Environment);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AvailabilityAttr *AvailabilityAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * Platform, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool Unavailable, llvm::StringRef Message, bool Strict, llvm::StringRef Replacement, int Priority, IdentifierInfo * Environment, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_availability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_availability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_availability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_availability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_availability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_availability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Platform, Introduced, Deprecated, Obsoleted, Unavailable, Message, Strict, Replacement, Priority, Environment, I);
|
|
}
|
|
|
|
AvailabilityAttr *AvailabilityAttr::Create(ASTContext &Ctx, IdentifierInfo * Platform, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool Unavailable, llvm::StringRef Message, bool Strict, llvm::StringRef Replacement, int Priority, IdentifierInfo * Environment, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_availability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_availability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_availability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_availability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_availability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_availability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Platform, Introduced, Deprecated, Obsoleted, Unavailable, Message, Strict, Replacement, Priority, Environment, I);
|
|
}
|
|
|
|
AvailabilityAttr::AvailabilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * Platform
|
|
, VersionTuple Introduced
|
|
, VersionTuple Deprecated
|
|
, VersionTuple Obsoleted
|
|
, bool Unavailable
|
|
, llvm::StringRef Message
|
|
, bool Strict
|
|
, llvm::StringRef Replacement
|
|
, int Priority
|
|
, IdentifierInfo * Environment
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Availability, /*IsLateParsed=*/false, true)
|
|
, platform(Platform)
|
|
, introduced(Introduced)
|
|
, deprecated(Deprecated)
|
|
, obsoleted(Obsoleted)
|
|
, unavailable(Unavailable)
|
|
, messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
|
|
, strict(Strict)
|
|
, replacementLength(Replacement.size()),replacement(new (Ctx, 1) char[replacementLength])
|
|
, priority(Priority)
|
|
, environment(Environment)
|
|
{
|
|
if (!Message.empty())
|
|
std::memcpy(message, Message.data(), messageLength);
|
|
if (!Replacement.empty())
|
|
std::memcpy(replacement, Replacement.data(), replacementLength);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AvailabilityAttr *AvailabilityAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AvailabilityAttr(C, *this, platform, getIntroduced(), getDeprecated(), getObsoleted(), unavailable, getMessage(), strict, getReplacement(), priority, environment);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AvailabilityAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((availability";
|
|
OS << "(" << getPlatform()->getName();
|
|
if (getStrict()) OS << ", strict";
|
|
if (!getIntroduced().empty()) OS << ", introduced=" << getIntroduced();
|
|
if (!getDeprecated().empty()) OS << ", deprecated=" << getDeprecated();
|
|
if (!getObsoleted().empty()) OS << ", obsoleted=" << getObsoleted();
|
|
if (getUnavailable()) OS << ", unavailable";
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::availability";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getPlatform() ? getPlatform()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "introduced=" << getIntroduced() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "deprecated=" << getDeprecated() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "obsoleted=" << getObsoleted() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getUnavailable() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getStrict() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getReplacement() << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getPriority() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getEnvironment() ? getEnvironment()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::availability";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getPlatform() ? getPlatform()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "introduced=" << getIntroduced() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "deprecated=" << getDeprecated() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "obsoleted=" << getObsoleted() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getUnavailable() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getStrict() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getReplacement() << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getPriority() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getEnvironment() ? getEnvironment()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AvailabilityAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "availability";
|
|
case 1:
|
|
return "availability";
|
|
case 2:
|
|
return "availability";
|
|
}
|
|
}
|
|
|
|
|
|
// AvailableOnlyInDefaultEvalMethodAttr implementation
|
|
|
|
AvailableOnlyInDefaultEvalMethodAttr *AvailableOnlyInDefaultEvalMethodAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AvailableOnlyInDefaultEvalMethodAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AvailableOnlyInDefaultEvalMethodAttr *AvailableOnlyInDefaultEvalMethodAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) AvailableOnlyInDefaultEvalMethodAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
AvailableOnlyInDefaultEvalMethodAttr *AvailableOnlyInDefaultEvalMethodAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_available_only_in_default_eval_method:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_available_only_in_default_eval_method, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_available_only_in_default_eval_method:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_available_only_in_default_eval_method, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_available_only_in_default_eval_method:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_available_only_in_default_eval_method, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
AvailableOnlyInDefaultEvalMethodAttr *AvailableOnlyInDefaultEvalMethodAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_available_only_in_default_eval_method:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_available_only_in_default_eval_method, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_available_only_in_default_eval_method:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_available_only_in_default_eval_method, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_available_only_in_default_eval_method:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_available_only_in_default_eval_method, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
AvailableOnlyInDefaultEvalMethodAttr::AvailableOnlyInDefaultEvalMethodAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::AvailableOnlyInDefaultEvalMethod, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
AvailableOnlyInDefaultEvalMethodAttr *AvailableOnlyInDefaultEvalMethodAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) AvailableOnlyInDefaultEvalMethodAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void AvailableOnlyInDefaultEvalMethodAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((available_only_in_default_eval_method";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::available_only_in_default_eval_method";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::available_only_in_default_eval_method";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *AvailableOnlyInDefaultEvalMethodAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "available_only_in_default_eval_method";
|
|
case 1:
|
|
return "available_only_in_default_eval_method";
|
|
case 2:
|
|
return "available_only_in_default_eval_method";
|
|
}
|
|
}
|
|
|
|
|
|
// BPFFastCallAttr implementation
|
|
|
|
BPFFastCallAttr *BPFFastCallAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BPFFastCallAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BPFFastCallAttr *BPFFastCallAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BPFFastCallAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BPFFastCallAttr *BPFFastCallAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_bpf_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_bpf_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_bpf_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_bpf_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_bpf_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_bpf_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
BPFFastCallAttr *BPFFastCallAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_bpf_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_bpf_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_bpf_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_bpf_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_bpf_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_bpf_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
BPFFastCallAttr::BPFFastCallAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::BPFFastCall, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
BPFFastCallAttr *BPFFastCallAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) BPFFastCallAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void BPFFastCallAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((bpf_fastcall";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::bpf_fastcall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::bpf_fastcall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *BPFFastCallAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "bpf_fastcall";
|
|
case 1:
|
|
return "bpf_fastcall";
|
|
case 2:
|
|
return "bpf_fastcall";
|
|
}
|
|
}
|
|
|
|
|
|
// BPFPreserveAccessIndexAttr implementation
|
|
|
|
BPFPreserveAccessIndexAttr *BPFPreserveAccessIndexAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BPFPreserveAccessIndexAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BPFPreserveAccessIndexAttr *BPFPreserveAccessIndexAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BPFPreserveAccessIndexAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BPFPreserveAccessIndexAttr *BPFPreserveAccessIndexAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preserve_access_index:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preserve_access_index, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preserve_access_index:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preserve_access_index, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_preserve_access_index:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_preserve_access_index, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
BPFPreserveAccessIndexAttr *BPFPreserveAccessIndexAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preserve_access_index:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preserve_access_index, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preserve_access_index:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preserve_access_index, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_preserve_access_index:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_preserve_access_index, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
BPFPreserveAccessIndexAttr::BPFPreserveAccessIndexAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::BPFPreserveAccessIndex, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
BPFPreserveAccessIndexAttr *BPFPreserveAccessIndexAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) BPFPreserveAccessIndexAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void BPFPreserveAccessIndexAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((preserve_access_index";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::preserve_access_index";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::preserve_access_index";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *BPFPreserveAccessIndexAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "preserve_access_index";
|
|
case 1:
|
|
return "preserve_access_index";
|
|
case 2:
|
|
return "preserve_access_index";
|
|
}
|
|
}
|
|
|
|
|
|
// BPFPreserveStaticOffsetAttr implementation
|
|
|
|
BPFPreserveStaticOffsetAttr *BPFPreserveStaticOffsetAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BPFPreserveStaticOffsetAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BPFPreserveStaticOffsetAttr *BPFPreserveStaticOffsetAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BPFPreserveStaticOffsetAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BPFPreserveStaticOffsetAttr *BPFPreserveStaticOffsetAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preserve_static_offset:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preserve_static_offset, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preserve_static_offset:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preserve_static_offset, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_preserve_static_offset:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_preserve_static_offset, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
BPFPreserveStaticOffsetAttr *BPFPreserveStaticOffsetAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preserve_static_offset:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preserve_static_offset, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preserve_static_offset:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preserve_static_offset, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_preserve_static_offset:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_preserve_static_offset, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
BPFPreserveStaticOffsetAttr::BPFPreserveStaticOffsetAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::BPFPreserveStaticOffset, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
BPFPreserveStaticOffsetAttr *BPFPreserveStaticOffsetAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) BPFPreserveStaticOffsetAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void BPFPreserveStaticOffsetAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((preserve_static_offset";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::preserve_static_offset";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::preserve_static_offset";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *BPFPreserveStaticOffsetAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "preserve_static_offset";
|
|
case 1:
|
|
return "preserve_static_offset";
|
|
case 2:
|
|
return "preserve_static_offset";
|
|
}
|
|
}
|
|
|
|
|
|
// BTFDeclTagAttr implementation
|
|
|
|
BTFDeclTagAttr *BTFDeclTagAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef BTFDeclTag, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BTFDeclTagAttr(Ctx, CommonInfo, BTFDeclTag);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BTFDeclTagAttr *BTFDeclTagAttr::Create(ASTContext &Ctx, llvm::StringRef BTFDeclTag, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BTFDeclTagAttr(Ctx, CommonInfo, BTFDeclTag);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BTFDeclTagAttr *BTFDeclTagAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef BTFDeclTag, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_btf_decl_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_btf_decl_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_btf_decl_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_btf_decl_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_btf_decl_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_btf_decl_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, BTFDeclTag, I);
|
|
}
|
|
|
|
BTFDeclTagAttr *BTFDeclTagAttr::Create(ASTContext &Ctx, llvm::StringRef BTFDeclTag, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_btf_decl_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_btf_decl_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_btf_decl_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_btf_decl_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_btf_decl_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_btf_decl_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, BTFDeclTag, I);
|
|
}
|
|
|
|
BTFDeclTagAttr::BTFDeclTagAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef BTFDeclTag
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::BTFDeclTag, /*IsLateParsed=*/false, false)
|
|
, bTFDeclTagLength(BTFDeclTag.size()),bTFDeclTag(new (Ctx, 1) char[bTFDeclTagLength])
|
|
{
|
|
if (!BTFDeclTag.empty())
|
|
std::memcpy(bTFDeclTag, BTFDeclTag.data(), bTFDeclTagLength);
|
|
}
|
|
|
|
|
|
|
|
BTFDeclTagAttr *BTFDeclTagAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) BTFDeclTagAttr(C, *this, getBTFDeclTag());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void BTFDeclTagAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((btf_decl_tag";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getBTFDeclTag() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::btf_decl_tag";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getBTFDeclTag() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::btf_decl_tag";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getBTFDeclTag() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *BTFDeclTagAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "btf_decl_tag";
|
|
case 1:
|
|
return "btf_decl_tag";
|
|
case 2:
|
|
return "btf_decl_tag";
|
|
}
|
|
}
|
|
|
|
|
|
// BTFTypeTagAttr implementation
|
|
|
|
BTFTypeTagAttr *BTFTypeTagAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef BTFTypeTag, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BTFTypeTagAttr(Ctx, CommonInfo, BTFTypeTag);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BTFTypeTagAttr *BTFTypeTagAttr::Create(ASTContext &Ctx, llvm::StringRef BTFTypeTag, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BTFTypeTagAttr(Ctx, CommonInfo, BTFTypeTag);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BTFTypeTagAttr *BTFTypeTagAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef BTFTypeTag, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_btf_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_btf_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_btf_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_btf_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_btf_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_btf_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, BTFTypeTag, I);
|
|
}
|
|
|
|
BTFTypeTagAttr *BTFTypeTagAttr::Create(ASTContext &Ctx, llvm::StringRef BTFTypeTag, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_btf_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_btf_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_btf_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_btf_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_btf_type_tag:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_btf_type_tag, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, BTFTypeTag, I);
|
|
}
|
|
|
|
BTFTypeTagAttr::BTFTypeTagAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef BTFTypeTag
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::BTFTypeTag, /*IsLateParsed=*/false)
|
|
, bTFTypeTagLength(BTFTypeTag.size()),bTFTypeTag(new (Ctx, 1) char[bTFTypeTagLength])
|
|
{
|
|
if (!BTFTypeTag.empty())
|
|
std::memcpy(bTFTypeTag, BTFTypeTag.data(), bTFTypeTagLength);
|
|
}
|
|
|
|
|
|
|
|
BTFTypeTagAttr *BTFTypeTagAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) BTFTypeTagAttr(C, *this, getBTFTypeTag());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void BTFTypeTagAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((btf_type_tag";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getBTFTypeTag() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::btf_type_tag";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getBTFTypeTag() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::btf_type_tag";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getBTFTypeTag() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *BTFTypeTagAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "btf_type_tag";
|
|
case 1:
|
|
return "btf_type_tag";
|
|
case 2:
|
|
return "btf_type_tag";
|
|
}
|
|
}
|
|
|
|
|
|
// BlockingAttr implementation
|
|
|
|
BlockingAttr *BlockingAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BlockingAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BlockingAttr *BlockingAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BlockingAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BlockingAttr *BlockingAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_blocking:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_blocking, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_blocking:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_blocking, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_blocking:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_blocking, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
BlockingAttr *BlockingAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_blocking:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_blocking, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_blocking:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_blocking, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_blocking:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_blocking, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
BlockingAttr::BlockingAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::Blocking, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
BlockingAttr *BlockingAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) BlockingAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void BlockingAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((blocking";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::blocking";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::blocking";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *BlockingAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "blocking";
|
|
case 1:
|
|
return "blocking";
|
|
case 2:
|
|
return "blocking";
|
|
}
|
|
}
|
|
|
|
|
|
// BlocksAttr implementation
|
|
|
|
BlocksAttr *BlocksAttr::CreateImplicit(ASTContext &Ctx, BlocksAttr::BlockType Type, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BlocksAttr(Ctx, CommonInfo, Type);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BlocksAttr *BlocksAttr::Create(ASTContext &Ctx, BlocksAttr::BlockType Type, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BlocksAttr(Ctx, CommonInfo, Type);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BlocksAttr *BlocksAttr::CreateImplicit(ASTContext &Ctx, BlocksAttr::BlockType Type, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_blocks:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_blocks, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_blocks:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_blocks, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_blocks:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_blocks, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Type, I);
|
|
}
|
|
|
|
BlocksAttr *BlocksAttr::Create(ASTContext &Ctx, BlocksAttr::BlockType Type, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_blocks:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_blocks, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_blocks:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_blocks, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_blocks:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_blocks, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Type, I);
|
|
}
|
|
|
|
BlocksAttr::BlocksAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, BlocksAttr::BlockType Type
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Blocks, /*IsLateParsed=*/false, false)
|
|
, type(Type)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool BlocksAttr::ConvertStrToBlockType(StringRef Val, BlocksAttr::BlockType &Out) {
|
|
std::optional<BlocksAttr::BlockType> R = llvm::StringSwitch<std::optional<BlocksAttr::BlockType>>(Val)
|
|
.Case("byref", BlocksAttr::BlockType::ByRef)
|
|
.Default(std::optional<BlocksAttr::BlockType>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *BlocksAttr::ConvertBlockTypeToStr(BlocksAttr::BlockType Val) {
|
|
switch(Val) {
|
|
case BlocksAttr::BlockType::ByRef: return "byref";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
BlocksAttr *BlocksAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) BlocksAttr(C, *this, type);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void BlocksAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((blocks";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << BlocksAttr::ConvertBlockTypeToStr(getType()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::blocks";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << BlocksAttr::ConvertBlockTypeToStr(getType()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::blocks";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << BlocksAttr::ConvertBlockTypeToStr(getType()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *BlocksAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "blocks";
|
|
case 1:
|
|
return "blocks";
|
|
case 2:
|
|
return "blocks";
|
|
}
|
|
}
|
|
|
|
|
|
// BuiltinAttr implementation
|
|
|
|
BuiltinAttr *BuiltinAttr::CreateImplicit(ASTContext &Ctx, unsigned ID, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BuiltinAttr(Ctx, CommonInfo, ID);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BuiltinAttr *BuiltinAttr::Create(ASTContext &Ctx, unsigned ID, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BuiltinAttr(Ctx, CommonInfo, ID);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BuiltinAttr *BuiltinAttr::CreateImplicit(ASTContext &Ctx, unsigned ID, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, ID, I);
|
|
}
|
|
|
|
BuiltinAttr *BuiltinAttr::Create(ASTContext &Ctx, unsigned ID, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, ID, I);
|
|
}
|
|
|
|
BuiltinAttr::BuiltinAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned ID
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Builtin, /*IsLateParsed=*/false, false)
|
|
, iD(ID)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
BuiltinAttr *BuiltinAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) BuiltinAttr(C, *this, iD);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void BuiltinAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *BuiltinAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// BuiltinAliasAttr implementation
|
|
|
|
BuiltinAliasAttr *BuiltinAliasAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * BuiltinName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BuiltinAliasAttr(Ctx, CommonInfo, BuiltinName);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
BuiltinAliasAttr *BuiltinAliasAttr::Create(ASTContext &Ctx, IdentifierInfo * BuiltinName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) BuiltinAliasAttr(Ctx, CommonInfo, BuiltinName);
|
|
return A;
|
|
}
|
|
|
|
BuiltinAliasAttr *BuiltinAliasAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * BuiltinName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_clang_builtin_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_builtin_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_builtin_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_builtin_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_clang_builtin_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_clang_builtin_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, BuiltinName, I);
|
|
}
|
|
|
|
BuiltinAliasAttr *BuiltinAliasAttr::Create(ASTContext &Ctx, IdentifierInfo * BuiltinName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_clang_builtin_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_builtin_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_builtin_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_builtin_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_clang_builtin_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_clang_builtin_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, BuiltinName, I);
|
|
}
|
|
|
|
BuiltinAliasAttr::BuiltinAliasAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * BuiltinName
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::BuiltinAlias, /*IsLateParsed=*/false)
|
|
, builtinName(BuiltinName)
|
|
{
|
|
}
|
|
|
|
BuiltinAliasAttr::Spelling BuiltinAliasAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return CXX11_clang_builtin_alias;
|
|
case 1: return C23_clang_builtin_alias;
|
|
case 2: return GNU_clang_builtin_alias;
|
|
}
|
|
}
|
|
|
|
|
|
BuiltinAliasAttr *BuiltinAliasAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) BuiltinAliasAttr(C, *this, builtinName);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void BuiltinAliasAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[clang::builtin_alias";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getBuiltinName() ? getBuiltinName()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::builtin_alias";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getBuiltinName() ? getBuiltinName()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((clang_builtin_alias";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getBuiltinName() ? getBuiltinName()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *BuiltinAliasAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "builtin_alias";
|
|
case 1:
|
|
return "builtin_alias";
|
|
case 2:
|
|
return "clang_builtin_alias";
|
|
}
|
|
}
|
|
|
|
|
|
// C11NoReturnAttr implementation
|
|
|
|
C11NoReturnAttr *C11NoReturnAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) C11NoReturnAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
C11NoReturnAttr *C11NoReturnAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) C11NoReturnAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
C11NoReturnAttr *C11NoReturnAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
C11NoReturnAttr *C11NoReturnAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
C11NoReturnAttr::C11NoReturnAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::C11NoReturn, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
C11NoReturnAttr *C11NoReturnAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) C11NoReturnAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void C11NoReturnAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "_Noreturn";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *C11NoReturnAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "_Noreturn";
|
|
}
|
|
}
|
|
|
|
|
|
// CDeclAttr implementation
|
|
|
|
CDeclAttr *CDeclAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CDeclAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CDeclAttr *CDeclAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CDeclAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CDeclAttr *CDeclAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cdecl:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cdecl, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_cdecl:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_cdecl, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_cdecl:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_cdecl, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_cdecl:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_cdecl, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CDeclAttr *CDeclAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cdecl:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cdecl, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_cdecl:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_cdecl, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_cdecl:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_cdecl, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_cdecl:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_cdecl, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CDeclAttr::CDeclAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CDecl, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CDeclAttr *CDeclAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CDeclAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CDeclAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cdecl";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::cdecl";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::cdecl";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__cdecl";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "_cdecl";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CDeclAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cdecl";
|
|
case 1:
|
|
return "cdecl";
|
|
case 2:
|
|
return "cdecl";
|
|
case 3:
|
|
return "__cdecl";
|
|
case 4:
|
|
return "_cdecl";
|
|
}
|
|
}
|
|
|
|
|
|
// CFAuditedTransferAttr implementation
|
|
|
|
CFAuditedTransferAttr *CFAuditedTransferAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFAuditedTransferAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFAuditedTransferAttr *CFAuditedTransferAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFAuditedTransferAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFAuditedTransferAttr *CFAuditedTransferAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cf_audited_transfer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cf_audited_transfer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cf_audited_transfer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cf_audited_transfer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cf_audited_transfer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cf_audited_transfer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CFAuditedTransferAttr *CFAuditedTransferAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cf_audited_transfer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cf_audited_transfer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cf_audited_transfer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cf_audited_transfer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cf_audited_transfer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cf_audited_transfer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CFAuditedTransferAttr::CFAuditedTransferAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CFAuditedTransfer, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CFAuditedTransferAttr *CFAuditedTransferAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CFAuditedTransferAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CFAuditedTransferAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cf_audited_transfer";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::cf_audited_transfer";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::cf_audited_transfer";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CFAuditedTransferAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cf_audited_transfer";
|
|
case 1:
|
|
return "cf_audited_transfer";
|
|
case 2:
|
|
return "cf_audited_transfer";
|
|
}
|
|
}
|
|
|
|
|
|
// CFConsumedAttr implementation
|
|
|
|
CFConsumedAttr *CFConsumedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFConsumedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFConsumedAttr *CFConsumedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFConsumedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFConsumedAttr *CFConsumedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cf_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cf_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cf_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cf_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cf_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cf_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CFConsumedAttr *CFConsumedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cf_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cf_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cf_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cf_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cf_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cf_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CFConsumedAttr::CFConsumedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableParamAttr(Ctx, CommonInfo, attr::CFConsumed, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CFConsumedAttr *CFConsumedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CFConsumedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CFConsumedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cf_consumed";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::cf_consumed";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::cf_consumed";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CFConsumedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cf_consumed";
|
|
case 1:
|
|
return "cf_consumed";
|
|
case 2:
|
|
return "cf_consumed";
|
|
}
|
|
}
|
|
|
|
|
|
// CFGuardAttr implementation
|
|
|
|
CFGuardAttr *CFGuardAttr::CreateImplicit(ASTContext &Ctx, CFGuardAttr::GuardArg Guard, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFGuardAttr(Ctx, CommonInfo, Guard);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFGuardAttr *CFGuardAttr::Create(ASTContext &Ctx, CFGuardAttr::GuardArg Guard, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFGuardAttr(Ctx, CommonInfo, Guard);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFGuardAttr *CFGuardAttr::CreateImplicit(ASTContext &Ctx, CFGuardAttr::GuardArg Guard, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_guard:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_guard, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_guard:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_guard, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_guard:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_guard, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_guard:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_guard, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Guard, I);
|
|
}
|
|
|
|
CFGuardAttr *CFGuardAttr::Create(ASTContext &Ctx, CFGuardAttr::GuardArg Guard, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_guard:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_guard, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_guard:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_guard, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_guard:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_guard, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_guard:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_guard, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Guard, I);
|
|
}
|
|
|
|
CFGuardAttr::CFGuardAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, CFGuardAttr::GuardArg Guard
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CFGuard, /*IsLateParsed=*/false, false)
|
|
, guard(Guard)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool CFGuardAttr::ConvertStrToGuardArg(StringRef Val, CFGuardAttr::GuardArg &Out) {
|
|
std::optional<CFGuardAttr::GuardArg> R = llvm::StringSwitch<std::optional<CFGuardAttr::GuardArg>>(Val)
|
|
.Case("nocf", CFGuardAttr::GuardArg::nocf)
|
|
.Default(std::optional<CFGuardAttr::GuardArg>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *CFGuardAttr::ConvertGuardArgToStr(CFGuardAttr::GuardArg Val) {
|
|
switch(Val) {
|
|
case CFGuardAttr::GuardArg::nocf: return "nocf";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
CFGuardAttr *CFGuardAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CFGuardAttr(C, *this, guard);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CFGuardAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(guard";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << CFGuardAttr::ConvertGuardArgToStr(getGuard()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__attribute__((guard";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << CFGuardAttr::ConvertGuardArgToStr(getGuard()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::guard";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << CFGuardAttr::ConvertGuardArgToStr(getGuard()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::guard";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << CFGuardAttr::ConvertGuardArgToStr(getGuard()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CFGuardAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "guard";
|
|
case 1:
|
|
return "guard";
|
|
case 2:
|
|
return "guard";
|
|
case 3:
|
|
return "guard";
|
|
}
|
|
}
|
|
|
|
|
|
// CFICanonicalJumpTableAttr implementation
|
|
|
|
CFICanonicalJumpTableAttr *CFICanonicalJumpTableAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFICanonicalJumpTableAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFICanonicalJumpTableAttr *CFICanonicalJumpTableAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFICanonicalJumpTableAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFICanonicalJumpTableAttr *CFICanonicalJumpTableAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cfi_canonical_jump_table:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cfi_canonical_jump_table, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cfi_canonical_jump_table:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cfi_canonical_jump_table, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cfi_canonical_jump_table:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cfi_canonical_jump_table, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CFICanonicalJumpTableAttr *CFICanonicalJumpTableAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cfi_canonical_jump_table:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cfi_canonical_jump_table, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cfi_canonical_jump_table:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cfi_canonical_jump_table, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cfi_canonical_jump_table:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cfi_canonical_jump_table, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CFICanonicalJumpTableAttr::CFICanonicalJumpTableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CFICanonicalJumpTable, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CFICanonicalJumpTableAttr *CFICanonicalJumpTableAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CFICanonicalJumpTableAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CFICanonicalJumpTableAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cfi_canonical_jump_table";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::cfi_canonical_jump_table";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::cfi_canonical_jump_table";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CFICanonicalJumpTableAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cfi_canonical_jump_table";
|
|
case 1:
|
|
return "cfi_canonical_jump_table";
|
|
case 2:
|
|
return "cfi_canonical_jump_table";
|
|
}
|
|
}
|
|
|
|
|
|
// CFReturnsNotRetainedAttr implementation
|
|
|
|
CFReturnsNotRetainedAttr *CFReturnsNotRetainedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFReturnsNotRetainedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFReturnsNotRetainedAttr *CFReturnsNotRetainedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFReturnsNotRetainedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFReturnsNotRetainedAttr *CFReturnsNotRetainedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cf_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cf_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cf_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cf_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cf_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cf_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CFReturnsNotRetainedAttr *CFReturnsNotRetainedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cf_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cf_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cf_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cf_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cf_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cf_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CFReturnsNotRetainedAttr::CFReturnsNotRetainedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CFReturnsNotRetained, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CFReturnsNotRetainedAttr *CFReturnsNotRetainedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CFReturnsNotRetainedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CFReturnsNotRetainedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cf_returns_not_retained";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::cf_returns_not_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::cf_returns_not_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CFReturnsNotRetainedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cf_returns_not_retained";
|
|
case 1:
|
|
return "cf_returns_not_retained";
|
|
case 2:
|
|
return "cf_returns_not_retained";
|
|
}
|
|
}
|
|
|
|
|
|
// CFReturnsRetainedAttr implementation
|
|
|
|
CFReturnsRetainedAttr *CFReturnsRetainedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFReturnsRetainedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFReturnsRetainedAttr *CFReturnsRetainedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFReturnsRetainedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFReturnsRetainedAttr *CFReturnsRetainedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cf_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cf_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cf_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cf_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cf_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cf_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CFReturnsRetainedAttr *CFReturnsRetainedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cf_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cf_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cf_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cf_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cf_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cf_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CFReturnsRetainedAttr::CFReturnsRetainedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CFReturnsRetained, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CFReturnsRetainedAttr *CFReturnsRetainedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CFReturnsRetainedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CFReturnsRetainedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cf_returns_retained";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::cf_returns_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::cf_returns_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CFReturnsRetainedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cf_returns_retained";
|
|
case 1:
|
|
return "cf_returns_retained";
|
|
case 2:
|
|
return "cf_returns_retained";
|
|
}
|
|
}
|
|
|
|
|
|
// CFUnknownTransferAttr implementation
|
|
|
|
CFUnknownTransferAttr *CFUnknownTransferAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFUnknownTransferAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFUnknownTransferAttr *CFUnknownTransferAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CFUnknownTransferAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CFUnknownTransferAttr *CFUnknownTransferAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cf_unknown_transfer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cf_unknown_transfer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cf_unknown_transfer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cf_unknown_transfer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cf_unknown_transfer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cf_unknown_transfer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CFUnknownTransferAttr *CFUnknownTransferAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cf_unknown_transfer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cf_unknown_transfer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cf_unknown_transfer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cf_unknown_transfer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cf_unknown_transfer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cf_unknown_transfer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CFUnknownTransferAttr::CFUnknownTransferAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CFUnknownTransfer, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CFUnknownTransferAttr *CFUnknownTransferAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CFUnknownTransferAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CFUnknownTransferAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cf_unknown_transfer";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::cf_unknown_transfer";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::cf_unknown_transfer";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CFUnknownTransferAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cf_unknown_transfer";
|
|
case 1:
|
|
return "cf_unknown_transfer";
|
|
case 2:
|
|
return "cf_unknown_transfer";
|
|
}
|
|
}
|
|
|
|
|
|
// CPUDispatchAttr implementation
|
|
|
|
CPUDispatchAttr *CPUDispatchAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * *Cpus, unsigned CpusSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CPUDispatchAttr(Ctx, CommonInfo, Cpus, CpusSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CPUDispatchAttr *CPUDispatchAttr::Create(ASTContext &Ctx, IdentifierInfo * *Cpus, unsigned CpusSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CPUDispatchAttr(Ctx, CommonInfo, Cpus, CpusSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CPUDispatchAttr *CPUDispatchAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * *Cpus, unsigned CpusSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cpu_dispatch:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cpu_dispatch, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cpu_dispatch:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cpu_dispatch, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cpu_dispatch:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cpu_dispatch, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_cpu_dispatch:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_cpu_dispatch, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Cpus, CpusSize, I);
|
|
}
|
|
|
|
CPUDispatchAttr *CPUDispatchAttr::Create(ASTContext &Ctx, IdentifierInfo * *Cpus, unsigned CpusSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cpu_dispatch:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cpu_dispatch, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cpu_dispatch:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cpu_dispatch, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cpu_dispatch:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cpu_dispatch, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_cpu_dispatch:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_cpu_dispatch, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Cpus, CpusSize, I);
|
|
}
|
|
|
|
CPUDispatchAttr::CPUDispatchAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * *Cpus, unsigned CpusSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CPUDispatch, /*IsLateParsed=*/false, false)
|
|
, cpus_Size(CpusSize), cpus_(new (Ctx, 16) IdentifierInfo *[cpus_Size])
|
|
{
|
|
std::copy(Cpus, Cpus + cpus_Size, cpus_);
|
|
}
|
|
|
|
CPUDispatchAttr::CPUDispatchAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CPUDispatch, /*IsLateParsed=*/false, false)
|
|
, cpus_Size(0), cpus_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
CPUDispatchAttr *CPUDispatchAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CPUDispatchAttr(C, *this, cpus_, cpus_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CPUDispatchAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cpu_dispatch";
|
|
OS << "";
|
|
for (const auto &Val : cpus()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::cpu_dispatch";
|
|
OS << "";
|
|
for (const auto &Val : cpus()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::cpu_dispatch";
|
|
OS << "";
|
|
for (const auto &Val : cpus()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__declspec(cpu_dispatch";
|
|
OS << "";
|
|
for (const auto &Val : cpus()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CPUDispatchAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cpu_dispatch";
|
|
case 1:
|
|
return "cpu_dispatch";
|
|
case 2:
|
|
return "cpu_dispatch";
|
|
case 3:
|
|
return "cpu_dispatch";
|
|
}
|
|
}
|
|
|
|
|
|
// CPUSpecificAttr implementation
|
|
|
|
CPUSpecificAttr *CPUSpecificAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * *Cpus, unsigned CpusSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CPUSpecificAttr(Ctx, CommonInfo, Cpus, CpusSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CPUSpecificAttr *CPUSpecificAttr::Create(ASTContext &Ctx, IdentifierInfo * *Cpus, unsigned CpusSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CPUSpecificAttr(Ctx, CommonInfo, Cpus, CpusSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CPUSpecificAttr *CPUSpecificAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * *Cpus, unsigned CpusSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cpu_specific:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cpu_specific, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cpu_specific:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cpu_specific, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cpu_specific:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cpu_specific, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_cpu_specific:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_cpu_specific, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Cpus, CpusSize, I);
|
|
}
|
|
|
|
CPUSpecificAttr *CPUSpecificAttr::Create(ASTContext &Ctx, IdentifierInfo * *Cpus, unsigned CpusSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cpu_specific:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cpu_specific, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_cpu_specific:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_cpu_specific, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_cpu_specific:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_cpu_specific, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_cpu_specific:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_cpu_specific, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Cpus, CpusSize, I);
|
|
}
|
|
|
|
CPUSpecificAttr::CPUSpecificAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * *Cpus, unsigned CpusSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CPUSpecific, /*IsLateParsed=*/false, false)
|
|
, cpus_Size(CpusSize), cpus_(new (Ctx, 16) IdentifierInfo *[cpus_Size])
|
|
{
|
|
std::copy(Cpus, Cpus + cpus_Size, cpus_);
|
|
}
|
|
|
|
CPUSpecificAttr::CPUSpecificAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CPUSpecific, /*IsLateParsed=*/false, false)
|
|
, cpus_Size(0), cpus_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
CPUSpecificAttr *CPUSpecificAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CPUSpecificAttr(C, *this, cpus_, cpus_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CPUSpecificAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cpu_specific";
|
|
OS << "";
|
|
for (const auto &Val : cpus()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::cpu_specific";
|
|
OS << "";
|
|
for (const auto &Val : cpus()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::cpu_specific";
|
|
OS << "";
|
|
for (const auto &Val : cpus()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__declspec(cpu_specific";
|
|
OS << "";
|
|
for (const auto &Val : cpus()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CPUSpecificAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cpu_specific";
|
|
case 1:
|
|
return "cpu_specific";
|
|
case 2:
|
|
return "cpu_specific";
|
|
case 3:
|
|
return "cpu_specific";
|
|
}
|
|
}
|
|
|
|
|
|
// CUDAConstantAttr implementation
|
|
|
|
CUDAConstantAttr *CUDAConstantAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDAConstantAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDAConstantAttr *CUDAConstantAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDAConstantAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDAConstantAttr *CUDAConstantAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_constant:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_constant, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_constant:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_constant, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CUDAConstantAttr *CUDAConstantAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_constant:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_constant, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_constant:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_constant, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CUDAConstantAttr::CUDAConstantAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CUDAConstant, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CUDAConstantAttr *CUDAConstantAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CUDAConstantAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CUDAConstantAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((constant";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__declspec(__constant__";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CUDAConstantAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "constant";
|
|
case 1:
|
|
return "__constant__";
|
|
}
|
|
}
|
|
|
|
|
|
// CUDADeviceAttr implementation
|
|
|
|
CUDADeviceAttr *CUDADeviceAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDADeviceAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDADeviceAttr *CUDADeviceAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDADeviceAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDADeviceAttr *CUDADeviceAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_device:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_device, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_device:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_device, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CUDADeviceAttr *CUDADeviceAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_device:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_device, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_device:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_device, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CUDADeviceAttr::CUDADeviceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CUDADevice, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CUDADeviceAttr *CUDADeviceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CUDADeviceAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CUDADeviceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((device";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__declspec(__device__";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CUDADeviceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "device";
|
|
case 1:
|
|
return "__device__";
|
|
}
|
|
}
|
|
|
|
|
|
// CUDADeviceBuiltinSurfaceTypeAttr implementation
|
|
|
|
CUDADeviceBuiltinSurfaceTypeAttr *CUDADeviceBuiltinSurfaceTypeAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDADeviceBuiltinSurfaceTypeAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDADeviceBuiltinSurfaceTypeAttr *CUDADeviceBuiltinSurfaceTypeAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDADeviceBuiltinSurfaceTypeAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDADeviceBuiltinSurfaceTypeAttr *CUDADeviceBuiltinSurfaceTypeAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_device_builtin_surface_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_device_builtin_surface_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_device_builtin_surface_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_device_builtin_surface_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CUDADeviceBuiltinSurfaceTypeAttr *CUDADeviceBuiltinSurfaceTypeAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_device_builtin_surface_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_device_builtin_surface_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_device_builtin_surface_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_device_builtin_surface_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CUDADeviceBuiltinSurfaceTypeAttr::CUDADeviceBuiltinSurfaceTypeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CUDADeviceBuiltinSurfaceType, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CUDADeviceBuiltinSurfaceTypeAttr *CUDADeviceBuiltinSurfaceTypeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CUDADeviceBuiltinSurfaceTypeAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CUDADeviceBuiltinSurfaceTypeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((device_builtin_surface_type";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__declspec(__device_builtin_surface_type__";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CUDADeviceBuiltinSurfaceTypeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "device_builtin_surface_type";
|
|
case 1:
|
|
return "__device_builtin_surface_type__";
|
|
}
|
|
}
|
|
|
|
|
|
// CUDADeviceBuiltinTextureTypeAttr implementation
|
|
|
|
CUDADeviceBuiltinTextureTypeAttr *CUDADeviceBuiltinTextureTypeAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDADeviceBuiltinTextureTypeAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDADeviceBuiltinTextureTypeAttr *CUDADeviceBuiltinTextureTypeAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDADeviceBuiltinTextureTypeAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDADeviceBuiltinTextureTypeAttr *CUDADeviceBuiltinTextureTypeAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_device_builtin_texture_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_device_builtin_texture_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_device_builtin_texture_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_device_builtin_texture_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CUDADeviceBuiltinTextureTypeAttr *CUDADeviceBuiltinTextureTypeAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_device_builtin_texture_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_device_builtin_texture_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_device_builtin_texture_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_device_builtin_texture_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CUDADeviceBuiltinTextureTypeAttr::CUDADeviceBuiltinTextureTypeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CUDADeviceBuiltinTextureType, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CUDADeviceBuiltinTextureTypeAttr *CUDADeviceBuiltinTextureTypeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CUDADeviceBuiltinTextureTypeAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CUDADeviceBuiltinTextureTypeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((device_builtin_texture_type";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__declspec(__device_builtin_texture_type__";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CUDADeviceBuiltinTextureTypeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "device_builtin_texture_type";
|
|
case 1:
|
|
return "__device_builtin_texture_type__";
|
|
}
|
|
}
|
|
|
|
|
|
// CUDAGlobalAttr implementation
|
|
|
|
CUDAGlobalAttr *CUDAGlobalAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDAGlobalAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDAGlobalAttr *CUDAGlobalAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDAGlobalAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDAGlobalAttr *CUDAGlobalAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_global:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_global, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_global:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_global, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CUDAGlobalAttr *CUDAGlobalAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_global:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_global, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_global:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_global, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CUDAGlobalAttr::CUDAGlobalAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CUDAGlobal, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CUDAGlobalAttr *CUDAGlobalAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CUDAGlobalAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CUDAGlobalAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((global";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__declspec(__global__";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CUDAGlobalAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "global";
|
|
case 1:
|
|
return "__global__";
|
|
}
|
|
}
|
|
|
|
|
|
// CUDAHostAttr implementation
|
|
|
|
CUDAHostAttr *CUDAHostAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDAHostAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDAHostAttr *CUDAHostAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDAHostAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDAHostAttr *CUDAHostAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_host:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_host, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_host:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_host, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CUDAHostAttr *CUDAHostAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_host:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_host, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_host:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_host, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CUDAHostAttr::CUDAHostAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CUDAHost, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CUDAHostAttr *CUDAHostAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CUDAHostAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CUDAHostAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((host";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__declspec(__host__";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CUDAHostAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "host";
|
|
case 1:
|
|
return "__host__";
|
|
}
|
|
}
|
|
|
|
|
|
// CUDAInvalidTargetAttr implementation
|
|
|
|
CUDAInvalidTargetAttr *CUDAInvalidTargetAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDAInvalidTargetAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDAInvalidTargetAttr *CUDAInvalidTargetAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDAInvalidTargetAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDAInvalidTargetAttr *CUDAInvalidTargetAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CUDAInvalidTargetAttr *CUDAInvalidTargetAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CUDAInvalidTargetAttr::CUDAInvalidTargetAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CUDAInvalidTarget, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CUDAInvalidTargetAttr *CUDAInvalidTargetAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CUDAInvalidTargetAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CUDAInvalidTargetAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *CUDAInvalidTargetAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// CUDALaunchBoundsAttr implementation
|
|
|
|
CUDALaunchBoundsAttr *CUDALaunchBoundsAttr::CreateImplicit(ASTContext &Ctx, Expr * MaxThreads, Expr * MinBlocks, Expr * MaxBlocks, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDALaunchBoundsAttr(Ctx, CommonInfo, MaxThreads, MinBlocks, MaxBlocks);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDALaunchBoundsAttr *CUDALaunchBoundsAttr::Create(ASTContext &Ctx, Expr * MaxThreads, Expr * MinBlocks, Expr * MaxBlocks, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDALaunchBoundsAttr(Ctx, CommonInfo, MaxThreads, MinBlocks, MaxBlocks);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDALaunchBoundsAttr *CUDALaunchBoundsAttr::CreateImplicit(ASTContext &Ctx, Expr * MaxThreads, Expr * MinBlocks, Expr * MaxBlocks, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_launch_bounds:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_launch_bounds, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_launch_bounds:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_launch_bounds, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, MaxThreads, MinBlocks, MaxBlocks, I);
|
|
}
|
|
|
|
CUDALaunchBoundsAttr *CUDALaunchBoundsAttr::Create(ASTContext &Ctx, Expr * MaxThreads, Expr * MinBlocks, Expr * MaxBlocks, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_launch_bounds:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_launch_bounds, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_launch_bounds:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_launch_bounds, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, MaxThreads, MinBlocks, MaxBlocks, I);
|
|
}
|
|
|
|
CUDALaunchBoundsAttr::CUDALaunchBoundsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * MaxThreads
|
|
, Expr * MinBlocks
|
|
, Expr * MaxBlocks
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CUDALaunchBounds, /*IsLateParsed=*/false, false)
|
|
, maxThreads(MaxThreads)
|
|
, minBlocks(MinBlocks)
|
|
, maxBlocks(MaxBlocks)
|
|
{
|
|
}
|
|
|
|
CUDALaunchBoundsAttr::CUDALaunchBoundsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * MaxThreads
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CUDALaunchBounds, /*IsLateParsed=*/false, false)
|
|
, maxThreads(MaxThreads)
|
|
, minBlocks()
|
|
, maxBlocks()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CUDALaunchBoundsAttr *CUDALaunchBoundsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CUDALaunchBoundsAttr(C, *this, maxThreads, minBlocks, maxBlocks);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CUDALaunchBoundsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((launch_bounds";
|
|
if (!getMaxBlocks())
|
|
++TrailingOmittedArgs;
|
|
if (!getMinBlocks())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMaxThreads()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!(!getMinBlocks())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMinBlocks()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!(!getMaxBlocks())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMaxBlocks()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__declspec(__launch_bounds__";
|
|
if (!getMaxBlocks())
|
|
++TrailingOmittedArgs;
|
|
if (!getMinBlocks())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMaxThreads()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!(!getMinBlocks())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMinBlocks()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!(!getMaxBlocks())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getMaxBlocks()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CUDALaunchBoundsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "launch_bounds";
|
|
case 1:
|
|
return "__launch_bounds__";
|
|
}
|
|
}
|
|
|
|
|
|
// CUDASharedAttr implementation
|
|
|
|
CUDASharedAttr *CUDASharedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDASharedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDASharedAttr *CUDASharedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CUDASharedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CUDASharedAttr *CUDASharedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_shared:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_shared, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_shared:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_shared, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CUDASharedAttr *CUDASharedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_shared:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_shared, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_shared:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_shared, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CUDASharedAttr::CUDASharedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CUDAShared, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CUDASharedAttr *CUDASharedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CUDASharedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CUDASharedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((shared";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__declspec(__shared__";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CUDASharedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "shared";
|
|
case 1:
|
|
return "__shared__";
|
|
}
|
|
}
|
|
|
|
|
|
// CXX11NoReturnAttr implementation
|
|
|
|
CXX11NoReturnAttr *CXX11NoReturnAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CXX11NoReturnAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CXX11NoReturnAttr *CXX11NoReturnAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CXX11NoReturnAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
CXX11NoReturnAttr *CXX11NoReturnAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_Noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_Noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CXX11NoReturnAttr *CXX11NoReturnAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_Noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_Noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CXX11NoReturnAttr::CXX11NoReturnAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CXX11NoReturn, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CXX11NoReturnAttr::Spelling CXX11NoReturnAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return CXX11_noreturn;
|
|
case 1: return C23_noreturn;
|
|
case 2: return C23_Noreturn;
|
|
}
|
|
}
|
|
CXX11NoReturnAttr *CXX11NoReturnAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CXX11NoReturnAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CXX11NoReturnAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[noreturn";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[noreturn";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[_Noreturn";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CXX11NoReturnAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "noreturn";
|
|
case 1:
|
|
return "noreturn";
|
|
case 2:
|
|
return "_Noreturn";
|
|
}
|
|
}
|
|
|
|
|
|
// CXXAssumeAttr implementation
|
|
|
|
CXXAssumeAttr *CXXAssumeAttr::CreateImplicit(ASTContext &Ctx, Expr * Assumption, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CXXAssumeAttr(Ctx, CommonInfo, Assumption);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CXXAssumeAttr *CXXAssumeAttr::Create(ASTContext &Ctx, Expr * Assumption, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CXXAssumeAttr(Ctx, CommonInfo, Assumption);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CXXAssumeAttr *CXXAssumeAttr::CreateImplicit(ASTContext &Ctx, Expr * Assumption, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_assume:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_assume, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_assume:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_assume, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_assume:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_assume, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_assume:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_assume, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Assumption, I);
|
|
}
|
|
|
|
CXXAssumeAttr *CXXAssumeAttr::Create(ASTContext &Ctx, Expr * Assumption, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_assume:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_assume, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_assume:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_assume, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_assume:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_assume, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_assume:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_assume, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Assumption, I);
|
|
}
|
|
|
|
CXXAssumeAttr::CXXAssumeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Assumption
|
|
)
|
|
: StmtAttr(Ctx, CommonInfo, attr::CXXAssume, /*IsLateParsed=*/false)
|
|
, assumption(Assumption)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
CXXAssumeAttr *CXXAssumeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CXXAssumeAttr(C, *this, assumption);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CXXAssumeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[assume";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getAssumption()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__attribute__((assume";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getAssumption()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::assume";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getAssumption()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::assume";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getAssumption()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CXXAssumeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "assume";
|
|
case 1:
|
|
return "assume";
|
|
case 2:
|
|
return "assume";
|
|
case 3:
|
|
return "assume";
|
|
}
|
|
}
|
|
|
|
|
|
// CallableWhenAttr implementation
|
|
|
|
CallableWhenAttr *CallableWhenAttr::CreateImplicit(ASTContext &Ctx, ConsumedState *CallableStates, unsigned CallableStatesSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CallableWhenAttr(Ctx, CommonInfo, CallableStates, CallableStatesSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CallableWhenAttr *CallableWhenAttr::Create(ASTContext &Ctx, ConsumedState *CallableStates, unsigned CallableStatesSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CallableWhenAttr(Ctx, CommonInfo, CallableStates, CallableStatesSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CallableWhenAttr *CallableWhenAttr::CreateImplicit(ASTContext &Ctx, ConsumedState *CallableStates, unsigned CallableStatesSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_callable_when:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_callable_when, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_callable_when:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_callable_when, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, CallableStates, CallableStatesSize, I);
|
|
}
|
|
|
|
CallableWhenAttr *CallableWhenAttr::Create(ASTContext &Ctx, ConsumedState *CallableStates, unsigned CallableStatesSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_callable_when:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_callable_when, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_callable_when:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_callable_when, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, CallableStates, CallableStatesSize, I);
|
|
}
|
|
|
|
CallableWhenAttr::CallableWhenAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, ConsumedState *CallableStates, unsigned CallableStatesSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CallableWhen, /*IsLateParsed=*/false, false)
|
|
, callableStates_Size(CallableStatesSize), callableStates_(new (Ctx, 16) ConsumedState[callableStates_Size])
|
|
{
|
|
std::copy(CallableStates, CallableStates + callableStates_Size, callableStates_);
|
|
}
|
|
|
|
CallableWhenAttr::CallableWhenAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CallableWhen, /*IsLateParsed=*/false, false)
|
|
, callableStates_Size(0), callableStates_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool CallableWhenAttr::ConvertStrToConsumedState(StringRef Val, CallableWhenAttr::ConsumedState &Out) {
|
|
std::optional<CallableWhenAttr::ConsumedState> R = llvm::StringSwitch<std::optional<CallableWhenAttr::ConsumedState>>(Val)
|
|
.Case("unknown", CallableWhenAttr::ConsumedState::Unknown)
|
|
.Case("consumed", CallableWhenAttr::ConsumedState::Consumed)
|
|
.Case("unconsumed", CallableWhenAttr::ConsumedState::Unconsumed)
|
|
.Default(std::optional<CallableWhenAttr::ConsumedState>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *CallableWhenAttr::ConvertConsumedStateToStr(CallableWhenAttr::ConsumedState Val) {
|
|
switch(Val) {
|
|
case CallableWhenAttr::ConsumedState::Unknown: return "unknown";
|
|
case CallableWhenAttr::ConsumedState::Consumed: return "consumed";
|
|
case CallableWhenAttr::ConsumedState::Unconsumed: return "unconsumed";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
CallableWhenAttr *CallableWhenAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CallableWhenAttr(C, *this, callableStates_, callableStates_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CallableWhenAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((callable_when";
|
|
OS << "";
|
|
for (const auto &Val : callableStates()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << CallableWhenAttr::ConvertConsumedStateToStr(Val)<< "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::callable_when";
|
|
OS << "";
|
|
for (const auto &Val : callableStates()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << CallableWhenAttr::ConvertConsumedStateToStr(Val)<< "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CallableWhenAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "callable_when";
|
|
case 1:
|
|
return "callable_when";
|
|
}
|
|
}
|
|
|
|
|
|
// CallbackAttr implementation
|
|
|
|
CallbackAttr *CallbackAttr::CreateImplicit(ASTContext &Ctx, int *Encoding, unsigned EncodingSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CallbackAttr(Ctx, CommonInfo, Encoding, EncodingSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CallbackAttr *CallbackAttr::Create(ASTContext &Ctx, int *Encoding, unsigned EncodingSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CallbackAttr(Ctx, CommonInfo, Encoding, EncodingSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CallbackAttr *CallbackAttr::CreateImplicit(ASTContext &Ctx, int *Encoding, unsigned EncodingSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_callback:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_callback, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_callback:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_callback, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_callback:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_callback, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Encoding, EncodingSize, I);
|
|
}
|
|
|
|
CallbackAttr *CallbackAttr::Create(ASTContext &Ctx, int *Encoding, unsigned EncodingSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_callback:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_callback, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_callback:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_callback, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_callback:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_callback, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Encoding, EncodingSize, I);
|
|
}
|
|
|
|
CallbackAttr::CallbackAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, int *Encoding, unsigned EncodingSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Callback, /*IsLateParsed=*/false, false)
|
|
, encoding_Size(EncodingSize), encoding_(new (Ctx, 16) int[encoding_Size])
|
|
{
|
|
std::copy(Encoding, Encoding + encoding_Size, encoding_);
|
|
}
|
|
|
|
CallbackAttr::CallbackAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Callback, /*IsLateParsed=*/false, false)
|
|
, encoding_Size(0), encoding_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
CallbackAttr *CallbackAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CallbackAttr(C, *this, encoding_, encoding_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CallbackAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((callback";
|
|
OS << "";
|
|
for (const auto &Val : encoding()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::callback";
|
|
OS << "";
|
|
for (const auto &Val : encoding()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::callback";
|
|
OS << "";
|
|
for (const auto &Val : encoding()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CallbackAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "callback";
|
|
case 1:
|
|
return "callback";
|
|
case 2:
|
|
return "callback";
|
|
}
|
|
}
|
|
|
|
|
|
// CalledOnceAttr implementation
|
|
|
|
CalledOnceAttr *CalledOnceAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CalledOnceAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CalledOnceAttr *CalledOnceAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CalledOnceAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CalledOnceAttr *CalledOnceAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_called_once:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_called_once, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_called_once:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_called_once, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_called_once:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_called_once, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CalledOnceAttr *CalledOnceAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_called_once:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_called_once, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_called_once:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_called_once, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_called_once:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_called_once, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CalledOnceAttr::CalledOnceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::CalledOnce, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
CalledOnceAttr *CalledOnceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CalledOnceAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CalledOnceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((called_once";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::called_once";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::called_once";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CalledOnceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "called_once";
|
|
case 1:
|
|
return "called_once";
|
|
case 2:
|
|
return "called_once";
|
|
}
|
|
}
|
|
|
|
|
|
// CapabilityAttr implementation
|
|
|
|
CapabilityAttr *CapabilityAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CapabilityAttr(Ctx, CommonInfo, Name);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CapabilityAttr *CapabilityAttr::Create(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CapabilityAttr(Ctx, CommonInfo, Name);
|
|
return A;
|
|
}
|
|
|
|
CapabilityAttr *CapabilityAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Name, I);
|
|
}
|
|
|
|
CapabilityAttr *CapabilityAttr::Create(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Name, I);
|
|
}
|
|
|
|
CapabilityAttr::CapabilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Name
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Capability, /*IsLateParsed=*/false, false)
|
|
, nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
|
|
{
|
|
if (!Name.empty())
|
|
std::memcpy(name, Name.data(), nameLength);
|
|
}
|
|
|
|
CapabilityAttr::Spelling CapabilityAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_capability;
|
|
case 1: return CXX11_clang_capability;
|
|
case 2: return GNU_shared_capability;
|
|
case 3: return CXX11_clang_shared_capability;
|
|
}
|
|
}
|
|
|
|
|
|
CapabilityAttr *CapabilityAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CapabilityAttr(C, *this, getName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CapabilityAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((capability";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::capability";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((shared_capability";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::shared_capability";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CapabilityAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "capability";
|
|
case 1:
|
|
return "capability";
|
|
case 2:
|
|
return "shared_capability";
|
|
case 3:
|
|
return "shared_capability";
|
|
}
|
|
}
|
|
|
|
|
|
// CapturedRecordAttr implementation
|
|
|
|
CapturedRecordAttr *CapturedRecordAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CapturedRecordAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CapturedRecordAttr *CapturedRecordAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CapturedRecordAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CapturedRecordAttr *CapturedRecordAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CapturedRecordAttr *CapturedRecordAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CapturedRecordAttr::CapturedRecordAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CapturedRecord, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CapturedRecordAttr *CapturedRecordAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CapturedRecordAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CapturedRecordAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *CapturedRecordAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// CarriesDependencyAttr implementation
|
|
|
|
CarriesDependencyAttr *CarriesDependencyAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CarriesDependencyAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CarriesDependencyAttr *CarriesDependencyAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CarriesDependencyAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CarriesDependencyAttr *CarriesDependencyAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_carries_dependency:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_carries_dependency, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_carries_dependency:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_carries_dependency, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CarriesDependencyAttr *CarriesDependencyAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_carries_dependency:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_carries_dependency, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_carries_dependency:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_carries_dependency, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CarriesDependencyAttr::CarriesDependencyAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableParamAttr(Ctx, CommonInfo, attr::CarriesDependency, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CarriesDependencyAttr *CarriesDependencyAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CarriesDependencyAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CarriesDependencyAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((carries_dependency";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[carries_dependency";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CarriesDependencyAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "carries_dependency";
|
|
case 1:
|
|
return "carries_dependency";
|
|
}
|
|
}
|
|
|
|
|
|
// CleanupAttr implementation
|
|
|
|
CleanupAttr *CleanupAttr::CreateImplicit(ASTContext &Ctx, FunctionDecl * FunctionDecl, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CleanupAttr(Ctx, CommonInfo, FunctionDecl);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CleanupAttr *CleanupAttr::Create(ASTContext &Ctx, FunctionDecl * FunctionDecl, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CleanupAttr(Ctx, CommonInfo, FunctionDecl);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CleanupAttr *CleanupAttr::CreateImplicit(ASTContext &Ctx, FunctionDecl * FunctionDecl, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cleanup:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cleanup, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_cleanup:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_cleanup, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_cleanup:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_cleanup, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, FunctionDecl, I);
|
|
}
|
|
|
|
CleanupAttr *CleanupAttr::Create(ASTContext &Ctx, FunctionDecl * FunctionDecl, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cleanup:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cleanup, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_cleanup:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_cleanup, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_cleanup:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_cleanup, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, FunctionDecl, I);
|
|
}
|
|
|
|
CleanupAttr::CleanupAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, FunctionDecl * FunctionDecl
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Cleanup, /*IsLateParsed=*/false, false)
|
|
, functionDecl(FunctionDecl)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
CleanupAttr *CleanupAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CleanupAttr(C, *this, functionDecl);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CleanupAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cleanup";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFunctionDecl()->getNameInfo().getAsString() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::cleanup";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFunctionDecl()->getNameInfo().getAsString() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::cleanup";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFunctionDecl()->getNameInfo().getAsString() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CleanupAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cleanup";
|
|
case 1:
|
|
return "cleanup";
|
|
case 2:
|
|
return "cleanup";
|
|
}
|
|
}
|
|
|
|
|
|
// ClspvLibclcBuiltinAttr implementation
|
|
|
|
ClspvLibclcBuiltinAttr *ClspvLibclcBuiltinAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ClspvLibclcBuiltinAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ClspvLibclcBuiltinAttr *ClspvLibclcBuiltinAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ClspvLibclcBuiltinAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ClspvLibclcBuiltinAttr *ClspvLibclcBuiltinAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_clspv_libclc_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_clspv_libclc_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_clspv_libclc_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_clspv_libclc_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_clspv_libclc_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_clspv_libclc_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ClspvLibclcBuiltinAttr *ClspvLibclcBuiltinAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_clspv_libclc_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_clspv_libclc_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_clspv_libclc_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_clspv_libclc_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_clspv_libclc_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_clspv_libclc_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ClspvLibclcBuiltinAttr::ClspvLibclcBuiltinAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ClspvLibclcBuiltin, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ClspvLibclcBuiltinAttr *ClspvLibclcBuiltinAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ClspvLibclcBuiltinAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ClspvLibclcBuiltinAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((clspv_libclc_builtin";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::clspv_libclc_builtin";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::clspv_libclc_builtin";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ClspvLibclcBuiltinAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "clspv_libclc_builtin";
|
|
case 1:
|
|
return "clspv_libclc_builtin";
|
|
case 2:
|
|
return "clspv_libclc_builtin";
|
|
}
|
|
}
|
|
|
|
|
|
// CmseNSCallAttr implementation
|
|
|
|
CmseNSCallAttr *CmseNSCallAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CmseNSCallAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CmseNSCallAttr *CmseNSCallAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CmseNSCallAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CmseNSCallAttr *CmseNSCallAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CmseNSCallAttr *CmseNSCallAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CmseNSCallAttr::CmseNSCallAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::CmseNSCall, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
CmseNSCallAttr *CmseNSCallAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CmseNSCallAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CmseNSCallAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cmse_nonsecure_call";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CmseNSCallAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cmse_nonsecure_call";
|
|
}
|
|
}
|
|
|
|
|
|
// CmseNSEntryAttr implementation
|
|
|
|
CmseNSEntryAttr *CmseNSEntryAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CmseNSEntryAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CmseNSEntryAttr *CmseNSEntryAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CmseNSEntryAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CmseNSEntryAttr *CmseNSEntryAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CmseNSEntryAttr *CmseNSEntryAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CmseNSEntryAttr::CmseNSEntryAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CmseNSEntry, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CmseNSEntryAttr *CmseNSEntryAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CmseNSEntryAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CmseNSEntryAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cmse_nonsecure_entry";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CmseNSEntryAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cmse_nonsecure_entry";
|
|
}
|
|
}
|
|
|
|
|
|
// CodeAlignAttr implementation
|
|
|
|
CodeAlignAttr *CodeAlignAttr::CreateImplicit(ASTContext &Ctx, Expr * Alignment, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CodeAlignAttr(Ctx, CommonInfo, Alignment);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CodeAlignAttr *CodeAlignAttr::Create(ASTContext &Ctx, Expr * Alignment, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CodeAlignAttr(Ctx, CommonInfo, Alignment);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CodeAlignAttr *CodeAlignAttr::CreateImplicit(ASTContext &Ctx, Expr * Alignment, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_code_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_code_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_code_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_code_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_code_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_code_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Alignment, I);
|
|
}
|
|
|
|
CodeAlignAttr *CodeAlignAttr::Create(ASTContext &Ctx, Expr * Alignment, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_code_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_code_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_code_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_code_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_code_align:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_code_align, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Alignment, I);
|
|
}
|
|
|
|
CodeAlignAttr::CodeAlignAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Alignment
|
|
)
|
|
: StmtAttr(Ctx, CommonInfo, attr::CodeAlign, /*IsLateParsed=*/false)
|
|
, alignment(Alignment)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
CodeAlignAttr *CodeAlignAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CodeAlignAttr(C, *this, alignment);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CodeAlignAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((code_align";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getAlignment()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::code_align";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getAlignment()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::code_align";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getAlignment()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CodeAlignAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "code_align";
|
|
case 1:
|
|
return "code_align";
|
|
case 2:
|
|
return "code_align";
|
|
}
|
|
}
|
|
|
|
|
|
// CodeModelAttr implementation
|
|
|
|
CodeModelAttr *CodeModelAttr::CreateImplicit(ASTContext &Ctx, llvm::CodeModel::Model Model, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CodeModelAttr(Ctx, CommonInfo, Model);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CodeModelAttr *CodeModelAttr::Create(ASTContext &Ctx, llvm::CodeModel::Model Model, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CodeModelAttr(Ctx, CommonInfo, Model);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CodeModelAttr *CodeModelAttr::CreateImplicit(ASTContext &Ctx, llvm::CodeModel::Model Model, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_model:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_model, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_model:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_model, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_model:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_model, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Model, I);
|
|
}
|
|
|
|
CodeModelAttr *CodeModelAttr::Create(ASTContext &Ctx, llvm::CodeModel::Model Model, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_model:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_model, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_model:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_model, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_model:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_model, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Model, I);
|
|
}
|
|
|
|
CodeModelAttr::CodeModelAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::CodeModel::Model Model
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CodeModel, /*IsLateParsed=*/false, false)
|
|
, model(Model)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool CodeModelAttr::ConvertStrToModel(StringRef Val, llvm::CodeModel::Model &Out) {
|
|
std::optional<llvm::CodeModel::Model> R = llvm::StringSwitch<std::optional<llvm::CodeModel::Model>>(Val)
|
|
.Case("normal", llvm::CodeModel::Model::Small)
|
|
.Case("medium", llvm::CodeModel::Model::Medium)
|
|
.Case("extreme", llvm::CodeModel::Model::Large)
|
|
.Default(std::optional<llvm::CodeModel::Model>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *CodeModelAttr::ConvertModelToStr(llvm::CodeModel::Model Val) {
|
|
switch(Val) {
|
|
case llvm::CodeModel::Model::Small: return "normal";
|
|
case llvm::CodeModel::Model::Medium: return "medium";
|
|
case llvm::CodeModel::Model::Large: return "extreme";
|
|
default: llvm_unreachable("Invalid attribute value");
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
CodeModelAttr *CodeModelAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CodeModelAttr(C, *this, model);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CodeModelAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((model";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << CodeModelAttr::ConvertModelToStr(getModel()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::model";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << CodeModelAttr::ConvertModelToStr(getModel()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::model";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << CodeModelAttr::ConvertModelToStr(getModel()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CodeModelAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "model";
|
|
case 1:
|
|
return "model";
|
|
case 2:
|
|
return "model";
|
|
}
|
|
}
|
|
|
|
|
|
// CodeSegAttr implementation
|
|
|
|
CodeSegAttr *CodeSegAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CodeSegAttr(Ctx, CommonInfo, Name);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CodeSegAttr *CodeSegAttr::Create(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CodeSegAttr(Ctx, CommonInfo, Name);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CodeSegAttr *CodeSegAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Name, I);
|
|
}
|
|
|
|
CodeSegAttr *CodeSegAttr::Create(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Name, I);
|
|
}
|
|
|
|
CodeSegAttr::CodeSegAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Name
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CodeSeg, /*IsLateParsed=*/false, false)
|
|
, nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
|
|
{
|
|
if (!Name.empty())
|
|
std::memcpy(name, Name.data(), nameLength);
|
|
}
|
|
|
|
|
|
|
|
CodeSegAttr *CodeSegAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CodeSegAttr(C, *this, getName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CodeSegAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(code_seg";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CodeSegAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "code_seg";
|
|
}
|
|
}
|
|
|
|
|
|
// ColdAttr implementation
|
|
|
|
ColdAttr *ColdAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ColdAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ColdAttr *ColdAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ColdAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ColdAttr *ColdAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cold:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cold, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_cold:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_cold, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_cold:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_cold, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ColdAttr *ColdAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_cold:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_cold, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_cold:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_cold, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_cold:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_cold, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ColdAttr::ColdAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Cold, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ColdAttr *ColdAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ColdAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ColdAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((cold";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::cold";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::cold";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ColdAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "cold";
|
|
case 1:
|
|
return "cold";
|
|
case 2:
|
|
return "cold";
|
|
}
|
|
}
|
|
|
|
|
|
// CommonAttr implementation
|
|
|
|
CommonAttr *CommonAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CommonAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CommonAttr *CommonAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CommonAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CommonAttr *CommonAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_common:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_common, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_common:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_common, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_common:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_common, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CommonAttr *CommonAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_common:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_common, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_common:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_common, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_common:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_common, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CommonAttr::CommonAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Common, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CommonAttr *CommonAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CommonAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CommonAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((common";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::common";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::common";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CommonAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "common";
|
|
case 1:
|
|
return "common";
|
|
case 2:
|
|
return "common";
|
|
}
|
|
}
|
|
|
|
|
|
// ConstAttr implementation
|
|
|
|
ConstAttr *ConstAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConstAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConstAttr *ConstAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConstAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConstAttr *ConstAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_const:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_const, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_const:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_const, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_const:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_const, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ConstAttr *ConstAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_const:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_const, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_const:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_const, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_const:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_const, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ConstAttr::ConstAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Const, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ConstAttr *ConstAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ConstAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ConstAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((const";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::const";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::const";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__attribute__((__const";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[gnu::__const";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[gnu::__const";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ConstAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "const";
|
|
case 1:
|
|
return "const";
|
|
case 2:
|
|
return "const";
|
|
case 3:
|
|
return "__const";
|
|
case 4:
|
|
return "__const";
|
|
case 5:
|
|
return "__const";
|
|
}
|
|
}
|
|
|
|
|
|
// ConstInitAttr implementation
|
|
|
|
ConstInitAttr *ConstInitAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConstInitAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConstInitAttr *ConstInitAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConstInitAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
ConstInitAttr *ConstInitAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_constinit:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_constinit, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_require_constant_initialization:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_require_constant_initialization, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_require_constant_initialization:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_require_constant_initialization, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ConstInitAttr *ConstInitAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_constinit:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_constinit, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_require_constant_initialization:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_require_constant_initialization, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_require_constant_initialization:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_require_constant_initialization, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ConstInitAttr::ConstInitAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ConstInit, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ConstInitAttr::Spelling ConstInitAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Keyword_constinit;
|
|
case 1: return GNU_require_constant_initialization;
|
|
case 2: return CXX11_clang_require_constant_initialization;
|
|
}
|
|
}
|
|
ConstInitAttr *ConstInitAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ConstInitAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ConstInitAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "constinit";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__attribute__((require_constant_initialization";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::require_constant_initialization";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ConstInitAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "constinit";
|
|
case 1:
|
|
return "require_constant_initialization";
|
|
case 2:
|
|
return "require_constant_initialization";
|
|
}
|
|
}
|
|
|
|
|
|
// ConstructorAttr implementation
|
|
|
|
ConstructorAttr *ConstructorAttr::CreateImplicit(ASTContext &Ctx, int Priority, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConstructorAttr(Ctx, CommonInfo, Priority);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConstructorAttr *ConstructorAttr::Create(ASTContext &Ctx, int Priority, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConstructorAttr(Ctx, CommonInfo, Priority);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConstructorAttr *ConstructorAttr::CreateImplicit(ASTContext &Ctx, int Priority, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_constructor:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_constructor, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_constructor:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_constructor, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_constructor:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_constructor, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Priority, I);
|
|
}
|
|
|
|
ConstructorAttr *ConstructorAttr::Create(ASTContext &Ctx, int Priority, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_constructor:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_constructor, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_constructor:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_constructor, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_constructor:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_constructor, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Priority, I);
|
|
}
|
|
|
|
ConstructorAttr::ConstructorAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, int Priority
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Constructor, /*IsLateParsed=*/false, false)
|
|
, priority(Priority)
|
|
{
|
|
}
|
|
|
|
ConstructorAttr::ConstructorAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Constructor, /*IsLateParsed=*/false, false)
|
|
, priority()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
ConstructorAttr *ConstructorAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ConstructorAttr(C, *this, priority);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ConstructorAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((constructor";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getPriority() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::constructor";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getPriority() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::constructor";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getPriority() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ConstructorAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "constructor";
|
|
case 1:
|
|
return "constructor";
|
|
case 2:
|
|
return "constructor";
|
|
}
|
|
}
|
|
|
|
|
|
// ConsumableAttr implementation
|
|
|
|
ConsumableAttr *ConsumableAttr::CreateImplicit(ASTContext &Ctx, ConsumableAttr::ConsumedState DefaultState, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConsumableAttr(Ctx, CommonInfo, DefaultState);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConsumableAttr *ConsumableAttr::Create(ASTContext &Ctx, ConsumableAttr::ConsumedState DefaultState, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConsumableAttr(Ctx, CommonInfo, DefaultState);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConsumableAttr *ConsumableAttr::CreateImplicit(ASTContext &Ctx, ConsumableAttr::ConsumedState DefaultState, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_consumable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_consumable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_consumable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_consumable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, DefaultState, I);
|
|
}
|
|
|
|
ConsumableAttr *ConsumableAttr::Create(ASTContext &Ctx, ConsumableAttr::ConsumedState DefaultState, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_consumable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_consumable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_consumable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_consumable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, DefaultState, I);
|
|
}
|
|
|
|
ConsumableAttr::ConsumableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, ConsumableAttr::ConsumedState DefaultState
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Consumable, /*IsLateParsed=*/false, false)
|
|
, defaultState(DefaultState)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool ConsumableAttr::ConvertStrToConsumedState(StringRef Val, ConsumableAttr::ConsumedState &Out) {
|
|
std::optional<ConsumableAttr::ConsumedState> R = llvm::StringSwitch<std::optional<ConsumableAttr::ConsumedState>>(Val)
|
|
.Case("unknown", ConsumableAttr::ConsumedState::Unknown)
|
|
.Case("consumed", ConsumableAttr::ConsumedState::Consumed)
|
|
.Case("unconsumed", ConsumableAttr::ConsumedState::Unconsumed)
|
|
.Default(std::optional<ConsumableAttr::ConsumedState>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *ConsumableAttr::ConvertConsumedStateToStr(ConsumableAttr::ConsumedState Val) {
|
|
switch(Val) {
|
|
case ConsumableAttr::ConsumedState::Unknown: return "unknown";
|
|
case ConsumableAttr::ConsumedState::Consumed: return "consumed";
|
|
case ConsumableAttr::ConsumedState::Unconsumed: return "unconsumed";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
ConsumableAttr *ConsumableAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ConsumableAttr(C, *this, defaultState);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ConsumableAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((consumable";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ConsumableAttr::ConvertConsumedStateToStr(getDefaultState()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::consumable";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ConsumableAttr::ConvertConsumedStateToStr(getDefaultState()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ConsumableAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "consumable";
|
|
case 1:
|
|
return "consumable";
|
|
}
|
|
}
|
|
|
|
|
|
// ConsumableAutoCastAttr implementation
|
|
|
|
ConsumableAutoCastAttr *ConsumableAutoCastAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConsumableAutoCastAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConsumableAutoCastAttr *ConsumableAutoCastAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConsumableAutoCastAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConsumableAutoCastAttr *ConsumableAutoCastAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_consumable_auto_cast_state:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_consumable_auto_cast_state, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_consumable_auto_cast_state:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_consumable_auto_cast_state, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ConsumableAutoCastAttr *ConsumableAutoCastAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_consumable_auto_cast_state:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_consumable_auto_cast_state, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_consumable_auto_cast_state:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_consumable_auto_cast_state, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ConsumableAutoCastAttr::ConsumableAutoCastAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ConsumableAutoCast, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ConsumableAutoCastAttr *ConsumableAutoCastAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ConsumableAutoCastAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ConsumableAutoCastAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((consumable_auto_cast_state";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::consumable_auto_cast_state";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ConsumableAutoCastAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "consumable_auto_cast_state";
|
|
case 1:
|
|
return "consumable_auto_cast_state";
|
|
}
|
|
}
|
|
|
|
|
|
// ConsumableSetOnReadAttr implementation
|
|
|
|
ConsumableSetOnReadAttr *ConsumableSetOnReadAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConsumableSetOnReadAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConsumableSetOnReadAttr *ConsumableSetOnReadAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConsumableSetOnReadAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConsumableSetOnReadAttr *ConsumableSetOnReadAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_consumable_set_state_on_read:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_consumable_set_state_on_read, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_consumable_set_state_on_read:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_consumable_set_state_on_read, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ConsumableSetOnReadAttr *ConsumableSetOnReadAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_consumable_set_state_on_read:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_consumable_set_state_on_read, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_consumable_set_state_on_read:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_consumable_set_state_on_read, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ConsumableSetOnReadAttr::ConsumableSetOnReadAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ConsumableSetOnRead, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ConsumableSetOnReadAttr *ConsumableSetOnReadAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ConsumableSetOnReadAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ConsumableSetOnReadAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((consumable_set_state_on_read";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::consumable_set_state_on_read";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ConsumableSetOnReadAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "consumable_set_state_on_read";
|
|
case 1:
|
|
return "consumable_set_state_on_read";
|
|
}
|
|
}
|
|
|
|
|
|
// ConvergentAttr implementation
|
|
|
|
ConvergentAttr *ConvergentAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConvergentAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConvergentAttr *ConvergentAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ConvergentAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ConvergentAttr *ConvergentAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_convergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_convergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_convergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_convergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_convergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_convergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ConvergentAttr *ConvergentAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_convergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_convergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_convergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_convergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_convergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_convergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ConvergentAttr::ConvergentAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Convergent, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ConvergentAttr *ConvergentAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ConvergentAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ConvergentAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((convergent";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::convergent";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::convergent";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ConvergentAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "convergent";
|
|
case 1:
|
|
return "convergent";
|
|
case 2:
|
|
return "convergent";
|
|
}
|
|
}
|
|
|
|
|
|
// CoroDisableLifetimeBoundAttr implementation
|
|
|
|
CoroDisableLifetimeBoundAttr *CoroDisableLifetimeBoundAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CoroDisableLifetimeBoundAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CoroDisableLifetimeBoundAttr *CoroDisableLifetimeBoundAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CoroDisableLifetimeBoundAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CoroDisableLifetimeBoundAttr *CoroDisableLifetimeBoundAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_coro_disable_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_coro_disable_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_coro_disable_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_coro_disable_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_coro_disable_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_coro_disable_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CoroDisableLifetimeBoundAttr *CoroDisableLifetimeBoundAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_coro_disable_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_coro_disable_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_coro_disable_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_coro_disable_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_coro_disable_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_coro_disable_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CoroDisableLifetimeBoundAttr::CoroDisableLifetimeBoundAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CoroDisableLifetimeBound, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CoroDisableLifetimeBoundAttr *CoroDisableLifetimeBoundAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CoroDisableLifetimeBoundAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CoroDisableLifetimeBoundAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((coro_disable_lifetimebound";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::coro_disable_lifetimebound";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::coro_disable_lifetimebound";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CoroDisableLifetimeBoundAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "coro_disable_lifetimebound";
|
|
case 1:
|
|
return "coro_disable_lifetimebound";
|
|
case 2:
|
|
return "coro_disable_lifetimebound";
|
|
}
|
|
}
|
|
|
|
|
|
// CoroLifetimeBoundAttr implementation
|
|
|
|
CoroLifetimeBoundAttr *CoroLifetimeBoundAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CoroLifetimeBoundAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CoroLifetimeBoundAttr *CoroLifetimeBoundAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CoroLifetimeBoundAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CoroLifetimeBoundAttr *CoroLifetimeBoundAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_coro_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_coro_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_coro_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_coro_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_coro_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_coro_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CoroLifetimeBoundAttr *CoroLifetimeBoundAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_coro_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_coro_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_coro_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_coro_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_coro_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_coro_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CoroLifetimeBoundAttr::CoroLifetimeBoundAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CoroLifetimeBound, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CoroLifetimeBoundAttr *CoroLifetimeBoundAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CoroLifetimeBoundAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CoroLifetimeBoundAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((coro_lifetimebound";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::coro_lifetimebound";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::coro_lifetimebound";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CoroLifetimeBoundAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "coro_lifetimebound";
|
|
case 1:
|
|
return "coro_lifetimebound";
|
|
case 2:
|
|
return "coro_lifetimebound";
|
|
}
|
|
}
|
|
|
|
|
|
// CoroOnlyDestroyWhenCompleteAttr implementation
|
|
|
|
CoroOnlyDestroyWhenCompleteAttr *CoroOnlyDestroyWhenCompleteAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CoroOnlyDestroyWhenCompleteAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CoroOnlyDestroyWhenCompleteAttr *CoroOnlyDestroyWhenCompleteAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CoroOnlyDestroyWhenCompleteAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CoroOnlyDestroyWhenCompleteAttr *CoroOnlyDestroyWhenCompleteAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_coro_only_destroy_when_complete:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_coro_only_destroy_when_complete, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_coro_only_destroy_when_complete:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_coro_only_destroy_when_complete, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_coro_only_destroy_when_complete:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_coro_only_destroy_when_complete, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CoroOnlyDestroyWhenCompleteAttr *CoroOnlyDestroyWhenCompleteAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_coro_only_destroy_when_complete:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_coro_only_destroy_when_complete, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_coro_only_destroy_when_complete:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_coro_only_destroy_when_complete, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_coro_only_destroy_when_complete:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_coro_only_destroy_when_complete, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CoroOnlyDestroyWhenCompleteAttr::CoroOnlyDestroyWhenCompleteAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CoroOnlyDestroyWhenComplete, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CoroOnlyDestroyWhenCompleteAttr *CoroOnlyDestroyWhenCompleteAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CoroOnlyDestroyWhenCompleteAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CoroOnlyDestroyWhenCompleteAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((coro_only_destroy_when_complete";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::coro_only_destroy_when_complete";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::coro_only_destroy_when_complete";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CoroOnlyDestroyWhenCompleteAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "coro_only_destroy_when_complete";
|
|
case 1:
|
|
return "coro_only_destroy_when_complete";
|
|
case 2:
|
|
return "coro_only_destroy_when_complete";
|
|
}
|
|
}
|
|
|
|
|
|
// CoroReturnTypeAttr implementation
|
|
|
|
CoroReturnTypeAttr *CoroReturnTypeAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CoroReturnTypeAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CoroReturnTypeAttr *CoroReturnTypeAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CoroReturnTypeAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CoroReturnTypeAttr *CoroReturnTypeAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_coro_return_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_coro_return_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_coro_return_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_coro_return_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_coro_return_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_coro_return_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CoroReturnTypeAttr *CoroReturnTypeAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_coro_return_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_coro_return_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_coro_return_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_coro_return_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_coro_return_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_coro_return_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CoroReturnTypeAttr::CoroReturnTypeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CoroReturnType, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CoroReturnTypeAttr *CoroReturnTypeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CoroReturnTypeAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CoroReturnTypeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((coro_return_type";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::coro_return_type";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::coro_return_type";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CoroReturnTypeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "coro_return_type";
|
|
case 1:
|
|
return "coro_return_type";
|
|
case 2:
|
|
return "coro_return_type";
|
|
}
|
|
}
|
|
|
|
|
|
// CoroWrapperAttr implementation
|
|
|
|
CoroWrapperAttr *CoroWrapperAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CoroWrapperAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CoroWrapperAttr *CoroWrapperAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CoroWrapperAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CoroWrapperAttr *CoroWrapperAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_coro_wrapper:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_coro_wrapper, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_coro_wrapper:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_coro_wrapper, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_coro_wrapper:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_coro_wrapper, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
CoroWrapperAttr *CoroWrapperAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_coro_wrapper:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_coro_wrapper, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_coro_wrapper:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_coro_wrapper, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_coro_wrapper:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_coro_wrapper, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
CoroWrapperAttr::CoroWrapperAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CoroWrapper, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
CoroWrapperAttr *CoroWrapperAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CoroWrapperAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CoroWrapperAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((coro_wrapper";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::coro_wrapper";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::coro_wrapper";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CoroWrapperAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "coro_wrapper";
|
|
case 1:
|
|
return "coro_wrapper";
|
|
case 2:
|
|
return "coro_wrapper";
|
|
}
|
|
}
|
|
|
|
|
|
// CountedByAttr implementation
|
|
|
|
CountedByAttr *CountedByAttr::CreateImplicit(ASTContext &Ctx, Expr * Count, int NestedLevel, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CountedByAttr(Ctx, CommonInfo, Count, NestedLevel);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CountedByAttr *CountedByAttr::Create(ASTContext &Ctx, Expr * Count, int NestedLevel, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CountedByAttr(Ctx, CommonInfo, Count, NestedLevel);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CountedByAttr *CountedByAttr::CreateImplicit(ASTContext &Ctx, Expr * Count, int NestedLevel, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_counted_by:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_counted_by, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_counted_by:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_counted_by, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_counted_by:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_counted_by, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Count, NestedLevel, I);
|
|
}
|
|
|
|
CountedByAttr *CountedByAttr::Create(ASTContext &Ctx, Expr * Count, int NestedLevel, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_counted_by:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_counted_by, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_counted_by:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_counted_by, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_counted_by:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_counted_by, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Count, NestedLevel, I);
|
|
}
|
|
|
|
CountedByAttr::CountedByAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Count
|
|
, int NestedLevel
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CountedBy, /*IsLateParsed=*/true, false)
|
|
, count(Count)
|
|
, nestedLevel(NestedLevel)
|
|
{
|
|
}
|
|
|
|
CountedByAttr::CountedByAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Count
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CountedBy, /*IsLateParsed=*/true, false)
|
|
, count(Count)
|
|
, nestedLevel()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CountedByAttr *CountedByAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CountedByAttr(C, *this, count, nestedLevel);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CountedByAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((counted_by";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCount()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNestedLevel() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::counted_by";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCount()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNestedLevel() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::counted_by";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCount()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNestedLevel() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CountedByAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "counted_by";
|
|
case 1:
|
|
return "counted_by";
|
|
case 2:
|
|
return "counted_by";
|
|
}
|
|
}
|
|
|
|
|
|
// CountedByOrNullAttr implementation
|
|
|
|
CountedByOrNullAttr *CountedByOrNullAttr::CreateImplicit(ASTContext &Ctx, Expr * Count, int NestedLevel, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CountedByOrNullAttr(Ctx, CommonInfo, Count, NestedLevel);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CountedByOrNullAttr *CountedByOrNullAttr::Create(ASTContext &Ctx, Expr * Count, int NestedLevel, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) CountedByOrNullAttr(Ctx, CommonInfo, Count, NestedLevel);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
CountedByOrNullAttr *CountedByOrNullAttr::CreateImplicit(ASTContext &Ctx, Expr * Count, int NestedLevel, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_counted_by_or_null:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_counted_by_or_null, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_counted_by_or_null:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_counted_by_or_null, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_counted_by_or_null:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_counted_by_or_null, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Count, NestedLevel, I);
|
|
}
|
|
|
|
CountedByOrNullAttr *CountedByOrNullAttr::Create(ASTContext &Ctx, Expr * Count, int NestedLevel, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_counted_by_or_null:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_counted_by_or_null, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_counted_by_or_null:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_counted_by_or_null, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_counted_by_or_null:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_counted_by_or_null, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Count, NestedLevel, I);
|
|
}
|
|
|
|
CountedByOrNullAttr::CountedByOrNullAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Count
|
|
, int NestedLevel
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CountedByOrNull, /*IsLateParsed=*/true, false)
|
|
, count(Count)
|
|
, nestedLevel(NestedLevel)
|
|
{
|
|
}
|
|
|
|
CountedByOrNullAttr::CountedByOrNullAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Count
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::CountedByOrNull, /*IsLateParsed=*/true, false)
|
|
, count(Count)
|
|
, nestedLevel()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CountedByOrNullAttr *CountedByOrNullAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) CountedByOrNullAttr(C, *this, count, nestedLevel);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void CountedByOrNullAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((counted_by_or_null";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCount()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNestedLevel() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::counted_by_or_null";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCount()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNestedLevel() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::counted_by_or_null";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCount()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNestedLevel() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *CountedByOrNullAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "counted_by_or_null";
|
|
case 1:
|
|
return "counted_by_or_null";
|
|
case 2:
|
|
return "counted_by_or_null";
|
|
}
|
|
}
|
|
|
|
|
|
// DLLExportAttr implementation
|
|
|
|
DLLExportAttr *DLLExportAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DLLExportAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DLLExportAttr *DLLExportAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DLLExportAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DLLExportAttr *DLLExportAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_dllexport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_dllexport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_dllexport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_dllexport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_dllexport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_dllexport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_dllexport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_dllexport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
DLLExportAttr *DLLExportAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_dllexport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_dllexport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_dllexport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_dllexport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_dllexport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_dllexport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_dllexport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_dllexport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
DLLExportAttr::DLLExportAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::DLLExport, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
DLLExportAttr *DLLExportAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) DLLExportAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void DLLExportAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(dllexport";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__attribute__((dllexport";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::dllexport";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[gnu::dllexport";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *DLLExportAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "dllexport";
|
|
case 1:
|
|
return "dllexport";
|
|
case 2:
|
|
return "dllexport";
|
|
case 3:
|
|
return "dllexport";
|
|
}
|
|
}
|
|
|
|
|
|
// DLLExportStaticLocalAttr implementation
|
|
|
|
DLLExportStaticLocalAttr *DLLExportStaticLocalAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DLLExportStaticLocalAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DLLExportStaticLocalAttr *DLLExportStaticLocalAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DLLExportStaticLocalAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DLLExportStaticLocalAttr *DLLExportStaticLocalAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
DLLExportStaticLocalAttr *DLLExportStaticLocalAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
DLLExportStaticLocalAttr::DLLExportStaticLocalAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::DLLExportStaticLocal, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
DLLExportStaticLocalAttr *DLLExportStaticLocalAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) DLLExportStaticLocalAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void DLLExportStaticLocalAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *DLLExportStaticLocalAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// DLLImportAttr implementation
|
|
|
|
DLLImportAttr *DLLImportAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DLLImportAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DLLImportAttr *DLLImportAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DLLImportAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DLLImportAttr *DLLImportAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_dllimport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_dllimport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_dllimport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_dllimport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_dllimport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_dllimport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_dllimport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_dllimport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
DLLImportAttr *DLLImportAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_dllimport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_dllimport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_dllimport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_dllimport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_dllimport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_dllimport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_dllimport:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_dllimport, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
DLLImportAttr::DLLImportAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::DLLImport, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
DLLImportAttr *DLLImportAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) DLLImportAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void DLLImportAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(dllimport";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__attribute__((dllimport";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::dllimport";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[gnu::dllimport";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *DLLImportAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "dllimport";
|
|
case 1:
|
|
return "dllimport";
|
|
case 2:
|
|
return "dllimport";
|
|
case 3:
|
|
return "dllimport";
|
|
}
|
|
}
|
|
|
|
|
|
// DLLImportStaticLocalAttr implementation
|
|
|
|
DLLImportStaticLocalAttr *DLLImportStaticLocalAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DLLImportStaticLocalAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DLLImportStaticLocalAttr *DLLImportStaticLocalAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DLLImportStaticLocalAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DLLImportStaticLocalAttr *DLLImportStaticLocalAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
DLLImportStaticLocalAttr *DLLImportStaticLocalAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
DLLImportStaticLocalAttr::DLLImportStaticLocalAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::DLLImportStaticLocal, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
DLLImportStaticLocalAttr *DLLImportStaticLocalAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) DLLImportStaticLocalAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void DLLImportStaticLocalAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *DLLImportStaticLocalAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// DeprecatedAttr implementation
|
|
|
|
DeprecatedAttr *DeprecatedAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, llvm::StringRef Replacement, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DeprecatedAttr(Ctx, CommonInfo, Message, Replacement);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DeprecatedAttr *DeprecatedAttr::Create(ASTContext &Ctx, llvm::StringRef Message, llvm::StringRef Replacement, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DeprecatedAttr(Ctx, CommonInfo, Message, Replacement);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DeprecatedAttr *DeprecatedAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, llvm::StringRef Replacement, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_deprecated:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_deprecated, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_deprecated:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_deprecated, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_deprecated:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_deprecated, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_deprecated:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_deprecated, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_deprecated:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_deprecated, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_deprecated:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_deprecated, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Message, Replacement, I);
|
|
}
|
|
|
|
DeprecatedAttr *DeprecatedAttr::Create(ASTContext &Ctx, llvm::StringRef Message, llvm::StringRef Replacement, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_deprecated:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_deprecated, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_deprecated:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_deprecated, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_deprecated:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_deprecated, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_deprecated:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_deprecated, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_deprecated:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_deprecated, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_deprecated:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_deprecated, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Message, Replacement, I);
|
|
}
|
|
|
|
DeprecatedAttr::DeprecatedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Message
|
|
, llvm::StringRef Replacement
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Deprecated, /*IsLateParsed=*/false, false)
|
|
, messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
|
|
, replacementLength(Replacement.size()),replacement(new (Ctx, 1) char[replacementLength])
|
|
{
|
|
if (!Message.empty())
|
|
std::memcpy(message, Message.data(), messageLength);
|
|
if (!Replacement.empty())
|
|
std::memcpy(replacement, Replacement.data(), replacementLength);
|
|
}
|
|
|
|
DeprecatedAttr::DeprecatedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Deprecated, /*IsLateParsed=*/false, false)
|
|
, messageLength(0),message(nullptr)
|
|
, replacementLength(0),replacement(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DeprecatedAttr *DeprecatedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) DeprecatedAttr(C, *this, getMessage(), getReplacement());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void DeprecatedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((deprecated";
|
|
OS << "(\"" << getMessage() << "\"";
|
|
if (!getReplacement().empty()) OS << ", \"" << getReplacement() << "\"";
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::deprecated";
|
|
OS << "(\"" << getMessage() << "\"";
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::deprecated";
|
|
OS << "(\"" << getMessage() << "\"";
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__declspec(deprecated";
|
|
OS << "(\"" << getMessage() << "\"";
|
|
OS << ")";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[deprecated";
|
|
OS << "(\"" << getMessage() << "\"";
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[deprecated";
|
|
OS << "(\"" << getMessage() << "\"";
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *DeprecatedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "deprecated";
|
|
case 1:
|
|
return "deprecated";
|
|
case 2:
|
|
return "deprecated";
|
|
case 3:
|
|
return "deprecated";
|
|
case 4:
|
|
return "deprecated";
|
|
case 5:
|
|
return "deprecated";
|
|
}
|
|
}
|
|
|
|
|
|
// DestructorAttr implementation
|
|
|
|
DestructorAttr *DestructorAttr::CreateImplicit(ASTContext &Ctx, int Priority, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DestructorAttr(Ctx, CommonInfo, Priority);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DestructorAttr *DestructorAttr::Create(ASTContext &Ctx, int Priority, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DestructorAttr(Ctx, CommonInfo, Priority);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DestructorAttr *DestructorAttr::CreateImplicit(ASTContext &Ctx, int Priority, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_destructor:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_destructor, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_destructor:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_destructor, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_destructor:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_destructor, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Priority, I);
|
|
}
|
|
|
|
DestructorAttr *DestructorAttr::Create(ASTContext &Ctx, int Priority, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_destructor:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_destructor, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_destructor:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_destructor, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_destructor:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_destructor, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Priority, I);
|
|
}
|
|
|
|
DestructorAttr::DestructorAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, int Priority
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Destructor, /*IsLateParsed=*/false, false)
|
|
, priority(Priority)
|
|
{
|
|
}
|
|
|
|
DestructorAttr::DestructorAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Destructor, /*IsLateParsed=*/false, false)
|
|
, priority()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
DestructorAttr *DestructorAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) DestructorAttr(C, *this, priority);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void DestructorAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((destructor";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getPriority() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::destructor";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getPriority() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::destructor";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getPriority() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *DestructorAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "destructor";
|
|
case 1:
|
|
return "destructor";
|
|
case 2:
|
|
return "destructor";
|
|
}
|
|
}
|
|
|
|
|
|
// DiagnoseAsBuiltinAttr implementation
|
|
|
|
DiagnoseAsBuiltinAttr *DiagnoseAsBuiltinAttr::CreateImplicit(ASTContext &Ctx, FunctionDecl * Function, unsigned *ArgIndices, unsigned ArgIndicesSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DiagnoseAsBuiltinAttr(Ctx, CommonInfo, Function, ArgIndices, ArgIndicesSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DiagnoseAsBuiltinAttr *DiagnoseAsBuiltinAttr::Create(ASTContext &Ctx, FunctionDecl * Function, unsigned *ArgIndices, unsigned ArgIndicesSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DiagnoseAsBuiltinAttr(Ctx, CommonInfo, Function, ArgIndices, ArgIndicesSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DiagnoseAsBuiltinAttr *DiagnoseAsBuiltinAttr::CreateImplicit(ASTContext &Ctx, FunctionDecl * Function, unsigned *ArgIndices, unsigned ArgIndicesSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_diagnose_as_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_diagnose_as_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_diagnose_as_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_diagnose_as_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_diagnose_as_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_diagnose_as_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Function, ArgIndices, ArgIndicesSize, I);
|
|
}
|
|
|
|
DiagnoseAsBuiltinAttr *DiagnoseAsBuiltinAttr::Create(ASTContext &Ctx, FunctionDecl * Function, unsigned *ArgIndices, unsigned ArgIndicesSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_diagnose_as_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_diagnose_as_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_diagnose_as_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_diagnose_as_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_diagnose_as_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_diagnose_as_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Function, ArgIndices, ArgIndicesSize, I);
|
|
}
|
|
|
|
DiagnoseAsBuiltinAttr::DiagnoseAsBuiltinAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, FunctionDecl * Function
|
|
, unsigned *ArgIndices, unsigned ArgIndicesSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::DiagnoseAsBuiltin, /*IsLateParsed=*/false, false)
|
|
, function(Function)
|
|
, argIndices_Size(ArgIndicesSize), argIndices_(new (Ctx, 16) unsigned[argIndices_Size])
|
|
{
|
|
std::copy(ArgIndices, ArgIndices + argIndices_Size, argIndices_);
|
|
}
|
|
|
|
DiagnoseAsBuiltinAttr::DiagnoseAsBuiltinAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, FunctionDecl * Function
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::DiagnoseAsBuiltin, /*IsLateParsed=*/false, false)
|
|
, function(Function)
|
|
, argIndices_Size(0), argIndices_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DiagnoseAsBuiltinAttr *DiagnoseAsBuiltinAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) DiagnoseAsBuiltinAttr(C, *this, function, argIndices_, argIndices_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void DiagnoseAsBuiltinAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((diagnose_as_builtin";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFunction()->getNameInfo().getAsString() << "";
|
|
OS << "";
|
|
for (const auto &Val : argIndices()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::diagnose_as_builtin";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFunction()->getNameInfo().getAsString() << "";
|
|
OS << "";
|
|
for (const auto &Val : argIndices()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::diagnose_as_builtin";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFunction()->getNameInfo().getAsString() << "";
|
|
OS << "";
|
|
for (const auto &Val : argIndices()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *DiagnoseAsBuiltinAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "diagnose_as_builtin";
|
|
case 1:
|
|
return "diagnose_as_builtin";
|
|
case 2:
|
|
return "diagnose_as_builtin";
|
|
}
|
|
}
|
|
|
|
|
|
// DiagnoseIfAttr implementation
|
|
|
|
DiagnoseIfAttr *DiagnoseIfAttr::CreateImplicit(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, DiagnoseIfAttr::DiagnosticType DiagnosticType, bool ArgDependent, NamedDecl * Parent, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DiagnoseIfAttr(Ctx, CommonInfo, Cond, Message, DiagnosticType, ArgDependent, Parent);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DiagnoseIfAttr *DiagnoseIfAttr::Create(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, DiagnoseIfAttr::DiagnosticType DiagnosticType, bool ArgDependent, NamedDecl * Parent, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DiagnoseIfAttr(Ctx, CommonInfo, Cond, Message, DiagnosticType, ArgDependent, Parent);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DiagnoseIfAttr *DiagnoseIfAttr::CreateImplicit(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, DiagnoseIfAttr::DiagnosticType DiagnosticType, bool ArgDependent, NamedDecl * Parent, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Cond, Message, DiagnosticType, ArgDependent, Parent, I);
|
|
}
|
|
|
|
DiagnoseIfAttr *DiagnoseIfAttr::Create(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, DiagnoseIfAttr::DiagnosticType DiagnosticType, bool ArgDependent, NamedDecl * Parent, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Cond, Message, DiagnosticType, ArgDependent, Parent, I);
|
|
}
|
|
|
|
DiagnoseIfAttr *DiagnoseIfAttr::CreateImplicit(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, DiagnoseIfAttr::DiagnosticType DiagnosticType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DiagnoseIfAttr(Ctx, CommonInfo, Cond, Message, DiagnosticType);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DiagnoseIfAttr *DiagnoseIfAttr::Create(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, DiagnoseIfAttr::DiagnosticType DiagnosticType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DiagnoseIfAttr(Ctx, CommonInfo, Cond, Message, DiagnosticType);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DiagnoseIfAttr *DiagnoseIfAttr::CreateImplicit(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, DiagnoseIfAttr::DiagnosticType DiagnosticType, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Cond, Message, DiagnosticType, I);
|
|
}
|
|
|
|
DiagnoseIfAttr *DiagnoseIfAttr::Create(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, DiagnoseIfAttr::DiagnosticType DiagnosticType, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Cond, Message, DiagnosticType, I);
|
|
}
|
|
|
|
DiagnoseIfAttr::DiagnoseIfAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Cond
|
|
, llvm::StringRef Message
|
|
, DiagnoseIfAttr::DiagnosticType DiagnosticType
|
|
, bool ArgDependent
|
|
, NamedDecl * Parent
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::DiagnoseIf, /*IsLateParsed=*/true, true)
|
|
, cond(Cond)
|
|
, messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
|
|
, diagnosticType(DiagnosticType)
|
|
, argDependent(ArgDependent)
|
|
, parent(Parent)
|
|
{
|
|
if (!Message.empty())
|
|
std::memcpy(message, Message.data(), messageLength);
|
|
}
|
|
|
|
DiagnoseIfAttr::DiagnoseIfAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Cond
|
|
, llvm::StringRef Message
|
|
, DiagnoseIfAttr::DiagnosticType DiagnosticType
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::DiagnoseIf, /*IsLateParsed=*/true, true)
|
|
, cond(Cond)
|
|
, messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
|
|
, diagnosticType(DiagnosticType)
|
|
, argDependent()
|
|
, parent()
|
|
{
|
|
if (!Message.empty())
|
|
std::memcpy(message, Message.data(), messageLength);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool DiagnoseIfAttr::ConvertStrToDiagnosticType(StringRef Val, DiagnoseIfAttr::DiagnosticType &Out) {
|
|
std::optional<DiagnoseIfAttr::DiagnosticType> R = llvm::StringSwitch<std::optional<DiagnoseIfAttr::DiagnosticType>>(Val)
|
|
.Case("error", DiagnoseIfAttr::DiagnosticType::DT_Error)
|
|
.Case("warning", DiagnoseIfAttr::DiagnosticType::DT_Warning)
|
|
.Default(std::optional<DiagnoseIfAttr::DiagnosticType>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *DiagnoseIfAttr::ConvertDiagnosticTypeToStr(DiagnoseIfAttr::DiagnosticType Val) {
|
|
switch(Val) {
|
|
case DiagnoseIfAttr::DiagnosticType::DT_Error: return "error";
|
|
case DiagnoseIfAttr::DiagnosticType::DT_Warning: return "warning";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
|
|
|
|
|
|
|
|
DiagnoseIfAttr *DiagnoseIfAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) DiagnoseIfAttr(C, *this, cond, getMessage(), diagnosticType, argDependent, parent);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void DiagnoseIfAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((diagnose_if";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCond()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << DiagnoseIfAttr::ConvertDiagnosticTypeToStr(getDiagnosticType()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *DiagnoseIfAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "diagnose_if";
|
|
}
|
|
}
|
|
|
|
|
|
// DisableSanitizerInstrumentationAttr implementation
|
|
|
|
DisableSanitizerInstrumentationAttr *DisableSanitizerInstrumentationAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DisableSanitizerInstrumentationAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DisableSanitizerInstrumentationAttr *DisableSanitizerInstrumentationAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DisableSanitizerInstrumentationAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DisableSanitizerInstrumentationAttr *DisableSanitizerInstrumentationAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_disable_sanitizer_instrumentation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_disable_sanitizer_instrumentation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_disable_sanitizer_instrumentation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_disable_sanitizer_instrumentation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_disable_sanitizer_instrumentation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_disable_sanitizer_instrumentation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
DisableSanitizerInstrumentationAttr *DisableSanitizerInstrumentationAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_disable_sanitizer_instrumentation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_disable_sanitizer_instrumentation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_disable_sanitizer_instrumentation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_disable_sanitizer_instrumentation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_disable_sanitizer_instrumentation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_disable_sanitizer_instrumentation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
DisableSanitizerInstrumentationAttr::DisableSanitizerInstrumentationAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::DisableSanitizerInstrumentation, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
DisableSanitizerInstrumentationAttr *DisableSanitizerInstrumentationAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) DisableSanitizerInstrumentationAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void DisableSanitizerInstrumentationAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((disable_sanitizer_instrumentation";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::disable_sanitizer_instrumentation";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::disable_sanitizer_instrumentation";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *DisableSanitizerInstrumentationAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "disable_sanitizer_instrumentation";
|
|
case 1:
|
|
return "disable_sanitizer_instrumentation";
|
|
case 2:
|
|
return "disable_sanitizer_instrumentation";
|
|
}
|
|
}
|
|
|
|
|
|
// DisableTailCallsAttr implementation
|
|
|
|
DisableTailCallsAttr *DisableTailCallsAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DisableTailCallsAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DisableTailCallsAttr *DisableTailCallsAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) DisableTailCallsAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
DisableTailCallsAttr *DisableTailCallsAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_disable_tail_calls:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_disable_tail_calls, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_disable_tail_calls:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_disable_tail_calls, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_disable_tail_calls:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_disable_tail_calls, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
DisableTailCallsAttr *DisableTailCallsAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_disable_tail_calls:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_disable_tail_calls, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_disable_tail_calls:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_disable_tail_calls, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_disable_tail_calls:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_disable_tail_calls, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
DisableTailCallsAttr::DisableTailCallsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::DisableTailCalls, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
DisableTailCallsAttr *DisableTailCallsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) DisableTailCallsAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void DisableTailCallsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((disable_tail_calls";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::disable_tail_calls";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::disable_tail_calls";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *DisableTailCallsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "disable_tail_calls";
|
|
case 1:
|
|
return "disable_tail_calls";
|
|
case 2:
|
|
return "disable_tail_calls";
|
|
}
|
|
}
|
|
|
|
|
|
// EmptyBasesAttr implementation
|
|
|
|
EmptyBasesAttr *EmptyBasesAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) EmptyBasesAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
EmptyBasesAttr *EmptyBasesAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) EmptyBasesAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
EmptyBasesAttr *EmptyBasesAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
EmptyBasesAttr *EmptyBasesAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
EmptyBasesAttr::EmptyBasesAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::EmptyBases, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
EmptyBasesAttr *EmptyBasesAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) EmptyBasesAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void EmptyBasesAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(empty_bases";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *EmptyBasesAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "empty_bases";
|
|
}
|
|
}
|
|
|
|
|
|
// EnableIfAttr implementation
|
|
|
|
EnableIfAttr *EnableIfAttr::CreateImplicit(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) EnableIfAttr(Ctx, CommonInfo, Cond, Message);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
EnableIfAttr *EnableIfAttr::Create(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) EnableIfAttr(Ctx, CommonInfo, Cond, Message);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
EnableIfAttr *EnableIfAttr::CreateImplicit(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Cond, Message, I);
|
|
}
|
|
|
|
EnableIfAttr *EnableIfAttr::Create(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Cond, Message, I);
|
|
}
|
|
|
|
EnableIfAttr::EnableIfAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Cond
|
|
, llvm::StringRef Message
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::EnableIf, /*IsLateParsed=*/false, false)
|
|
, cond(Cond)
|
|
, messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
|
|
{
|
|
if (!Message.empty())
|
|
std::memcpy(message, Message.data(), messageLength);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EnableIfAttr *EnableIfAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) EnableIfAttr(C, *this, cond, getMessage());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void EnableIfAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((enable_if";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCond()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *EnableIfAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "enable_if";
|
|
}
|
|
}
|
|
|
|
|
|
// EnforceTCBAttr implementation
|
|
|
|
EnforceTCBAttr *EnforceTCBAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef TCBName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) EnforceTCBAttr(Ctx, CommonInfo, TCBName);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
EnforceTCBAttr *EnforceTCBAttr::Create(ASTContext &Ctx, llvm::StringRef TCBName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) EnforceTCBAttr(Ctx, CommonInfo, TCBName);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
EnforceTCBAttr *EnforceTCBAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef TCBName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_enforce_tcb:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_enforce_tcb, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_enforce_tcb:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_enforce_tcb, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_enforce_tcb:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_enforce_tcb, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, TCBName, I);
|
|
}
|
|
|
|
EnforceTCBAttr *EnforceTCBAttr::Create(ASTContext &Ctx, llvm::StringRef TCBName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_enforce_tcb:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_enforce_tcb, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_enforce_tcb:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_enforce_tcb, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_enforce_tcb:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_enforce_tcb, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, TCBName, I);
|
|
}
|
|
|
|
EnforceTCBAttr::EnforceTCBAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef TCBName
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::EnforceTCB, /*IsLateParsed=*/false, true)
|
|
, tCBNameLength(TCBName.size()),tCBName(new (Ctx, 1) char[tCBNameLength])
|
|
{
|
|
if (!TCBName.empty())
|
|
std::memcpy(tCBName, TCBName.data(), tCBNameLength);
|
|
}
|
|
|
|
|
|
|
|
EnforceTCBAttr *EnforceTCBAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) EnforceTCBAttr(C, *this, getTCBName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void EnforceTCBAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((enforce_tcb";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getTCBName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::enforce_tcb";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getTCBName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::enforce_tcb";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getTCBName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *EnforceTCBAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "enforce_tcb";
|
|
case 1:
|
|
return "enforce_tcb";
|
|
case 2:
|
|
return "enforce_tcb";
|
|
}
|
|
}
|
|
|
|
|
|
// EnforceTCBLeafAttr implementation
|
|
|
|
EnforceTCBLeafAttr *EnforceTCBLeafAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef TCBName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) EnforceTCBLeafAttr(Ctx, CommonInfo, TCBName);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
EnforceTCBLeafAttr *EnforceTCBLeafAttr::Create(ASTContext &Ctx, llvm::StringRef TCBName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) EnforceTCBLeafAttr(Ctx, CommonInfo, TCBName);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
EnforceTCBLeafAttr *EnforceTCBLeafAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef TCBName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_enforce_tcb_leaf:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_enforce_tcb_leaf, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_enforce_tcb_leaf:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_enforce_tcb_leaf, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_enforce_tcb_leaf:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_enforce_tcb_leaf, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, TCBName, I);
|
|
}
|
|
|
|
EnforceTCBLeafAttr *EnforceTCBLeafAttr::Create(ASTContext &Ctx, llvm::StringRef TCBName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_enforce_tcb_leaf:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_enforce_tcb_leaf, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_enforce_tcb_leaf:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_enforce_tcb_leaf, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_enforce_tcb_leaf:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_enforce_tcb_leaf, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, TCBName, I);
|
|
}
|
|
|
|
EnforceTCBLeafAttr::EnforceTCBLeafAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef TCBName
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::EnforceTCBLeaf, /*IsLateParsed=*/false, true)
|
|
, tCBNameLength(TCBName.size()),tCBName(new (Ctx, 1) char[tCBNameLength])
|
|
{
|
|
if (!TCBName.empty())
|
|
std::memcpy(tCBName, TCBName.data(), tCBNameLength);
|
|
}
|
|
|
|
|
|
|
|
EnforceTCBLeafAttr *EnforceTCBLeafAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) EnforceTCBLeafAttr(C, *this, getTCBName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void EnforceTCBLeafAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((enforce_tcb_leaf";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getTCBName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::enforce_tcb_leaf";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getTCBName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::enforce_tcb_leaf";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getTCBName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *EnforceTCBLeafAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "enforce_tcb_leaf";
|
|
case 1:
|
|
return "enforce_tcb_leaf";
|
|
case 2:
|
|
return "enforce_tcb_leaf";
|
|
}
|
|
}
|
|
|
|
|
|
// EnumExtensibilityAttr implementation
|
|
|
|
EnumExtensibilityAttr *EnumExtensibilityAttr::CreateImplicit(ASTContext &Ctx, EnumExtensibilityAttr::Kind Extensibility, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) EnumExtensibilityAttr(Ctx, CommonInfo, Extensibility);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
EnumExtensibilityAttr *EnumExtensibilityAttr::Create(ASTContext &Ctx, EnumExtensibilityAttr::Kind Extensibility, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) EnumExtensibilityAttr(Ctx, CommonInfo, Extensibility);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
EnumExtensibilityAttr *EnumExtensibilityAttr::CreateImplicit(ASTContext &Ctx, EnumExtensibilityAttr::Kind Extensibility, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_enum_extensibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_enum_extensibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_enum_extensibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_enum_extensibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_enum_extensibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_enum_extensibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Extensibility, I);
|
|
}
|
|
|
|
EnumExtensibilityAttr *EnumExtensibilityAttr::Create(ASTContext &Ctx, EnumExtensibilityAttr::Kind Extensibility, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_enum_extensibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_enum_extensibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_enum_extensibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_enum_extensibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_enum_extensibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_enum_extensibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Extensibility, I);
|
|
}
|
|
|
|
EnumExtensibilityAttr::EnumExtensibilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, EnumExtensibilityAttr::Kind Extensibility
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::EnumExtensibility, /*IsLateParsed=*/false, false)
|
|
, extensibility(Extensibility)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool EnumExtensibilityAttr::ConvertStrToKind(StringRef Val, EnumExtensibilityAttr::Kind &Out) {
|
|
std::optional<EnumExtensibilityAttr::Kind> R = llvm::StringSwitch<std::optional<EnumExtensibilityAttr::Kind>>(Val)
|
|
.Case("closed", EnumExtensibilityAttr::Kind::Closed)
|
|
.Case("open", EnumExtensibilityAttr::Kind::Open)
|
|
.Default(std::optional<EnumExtensibilityAttr::Kind>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *EnumExtensibilityAttr::ConvertKindToStr(EnumExtensibilityAttr::Kind Val) {
|
|
switch(Val) {
|
|
case EnumExtensibilityAttr::Kind::Closed: return "closed";
|
|
case EnumExtensibilityAttr::Kind::Open: return "open";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
EnumExtensibilityAttr *EnumExtensibilityAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) EnumExtensibilityAttr(C, *this, extensibility);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void EnumExtensibilityAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((enum_extensibility";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << EnumExtensibilityAttr::ConvertKindToStr(getExtensibility()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::enum_extensibility";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << EnumExtensibilityAttr::ConvertKindToStr(getExtensibility()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::enum_extensibility";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << EnumExtensibilityAttr::ConvertKindToStr(getExtensibility()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *EnumExtensibilityAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "enum_extensibility";
|
|
case 1:
|
|
return "enum_extensibility";
|
|
case 2:
|
|
return "enum_extensibility";
|
|
}
|
|
}
|
|
|
|
|
|
// ErrorAttr implementation
|
|
|
|
ErrorAttr *ErrorAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef UserDiagnostic, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ErrorAttr(Ctx, CommonInfo, UserDiagnostic);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ErrorAttr *ErrorAttr::Create(ASTContext &Ctx, llvm::StringRef UserDiagnostic, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ErrorAttr(Ctx, CommonInfo, UserDiagnostic);
|
|
return A;
|
|
}
|
|
|
|
ErrorAttr *ErrorAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef UserDiagnostic, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_error:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_error, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_error:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_error, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_error:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_error, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_warning:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_warning, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_warning:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_warning, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_warning:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_warning, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, UserDiagnostic, I);
|
|
}
|
|
|
|
ErrorAttr *ErrorAttr::Create(ASTContext &Ctx, llvm::StringRef UserDiagnostic, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_error:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_error, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_error:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_error, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_error:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_error, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_warning:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_warning, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_warning:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_warning, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_warning:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_warning, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, UserDiagnostic, I);
|
|
}
|
|
|
|
ErrorAttr::ErrorAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef UserDiagnostic
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Error, /*IsLateParsed=*/false, false)
|
|
, userDiagnosticLength(UserDiagnostic.size()),userDiagnostic(new (Ctx, 1) char[userDiagnosticLength])
|
|
{
|
|
if (!UserDiagnostic.empty())
|
|
std::memcpy(userDiagnostic, UserDiagnostic.data(), userDiagnosticLength);
|
|
}
|
|
|
|
ErrorAttr::Spelling ErrorAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_error;
|
|
case 1: return CXX11_gnu_error;
|
|
case 2: return C23_gnu_error;
|
|
case 3: return GNU_warning;
|
|
case 4: return CXX11_gnu_warning;
|
|
case 5: return C23_gnu_warning;
|
|
}
|
|
}
|
|
|
|
|
|
ErrorAttr *ErrorAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ErrorAttr(C, *this, getUserDiagnostic());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ErrorAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((error";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getUserDiagnostic() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::error";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getUserDiagnostic() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::error";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getUserDiagnostic() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__attribute__((warning";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getUserDiagnostic() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[gnu::warning";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getUserDiagnostic() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[gnu::warning";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getUserDiagnostic() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ErrorAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "error";
|
|
case 1:
|
|
return "error";
|
|
case 2:
|
|
return "error";
|
|
case 3:
|
|
return "warning";
|
|
case 4:
|
|
return "warning";
|
|
case 5:
|
|
return "warning";
|
|
}
|
|
}
|
|
|
|
|
|
// ExcludeFromExplicitInstantiationAttr implementation
|
|
|
|
ExcludeFromExplicitInstantiationAttr *ExcludeFromExplicitInstantiationAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ExcludeFromExplicitInstantiationAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ExcludeFromExplicitInstantiationAttr *ExcludeFromExplicitInstantiationAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ExcludeFromExplicitInstantiationAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ExcludeFromExplicitInstantiationAttr *ExcludeFromExplicitInstantiationAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_exclude_from_explicit_instantiation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_exclude_from_explicit_instantiation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_exclude_from_explicit_instantiation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_exclude_from_explicit_instantiation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_exclude_from_explicit_instantiation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_exclude_from_explicit_instantiation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ExcludeFromExplicitInstantiationAttr *ExcludeFromExplicitInstantiationAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_exclude_from_explicit_instantiation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_exclude_from_explicit_instantiation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_exclude_from_explicit_instantiation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_exclude_from_explicit_instantiation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_exclude_from_explicit_instantiation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_exclude_from_explicit_instantiation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ExcludeFromExplicitInstantiationAttr::ExcludeFromExplicitInstantiationAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ExcludeFromExplicitInstantiation, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ExcludeFromExplicitInstantiationAttr *ExcludeFromExplicitInstantiationAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ExcludeFromExplicitInstantiationAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ExcludeFromExplicitInstantiationAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((exclude_from_explicit_instantiation";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::exclude_from_explicit_instantiation";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::exclude_from_explicit_instantiation";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ExcludeFromExplicitInstantiationAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "exclude_from_explicit_instantiation";
|
|
case 1:
|
|
return "exclude_from_explicit_instantiation";
|
|
case 2:
|
|
return "exclude_from_explicit_instantiation";
|
|
}
|
|
}
|
|
|
|
|
|
// ExclusiveTrylockFunctionAttr implementation
|
|
|
|
ExclusiveTrylockFunctionAttr *ExclusiveTrylockFunctionAttr::CreateImplicit(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ExclusiveTrylockFunctionAttr(Ctx, CommonInfo, SuccessValue, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ExclusiveTrylockFunctionAttr *ExclusiveTrylockFunctionAttr::Create(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ExclusiveTrylockFunctionAttr(Ctx, CommonInfo, SuccessValue, Args, ArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ExclusiveTrylockFunctionAttr *ExclusiveTrylockFunctionAttr::CreateImplicit(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, SuccessValue, Args, ArgsSize, I);
|
|
}
|
|
|
|
ExclusiveTrylockFunctionAttr *ExclusiveTrylockFunctionAttr::Create(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, SuccessValue, Args, ArgsSize, I);
|
|
}
|
|
|
|
ExclusiveTrylockFunctionAttr::ExclusiveTrylockFunctionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * SuccessValue
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ExclusiveTrylockFunction, /*IsLateParsed=*/true, true)
|
|
, successValue(SuccessValue)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
ExclusiveTrylockFunctionAttr::ExclusiveTrylockFunctionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * SuccessValue
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ExclusiveTrylockFunction, /*IsLateParsed=*/true, true)
|
|
, successValue(SuccessValue)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ExclusiveTrylockFunctionAttr *ExclusiveTrylockFunctionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ExclusiveTrylockFunctionAttr(C, *this, successValue, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ExclusiveTrylockFunctionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((exclusive_trylock_function";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getSuccessValue()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ExclusiveTrylockFunctionAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "exclusive_trylock_function";
|
|
}
|
|
}
|
|
|
|
|
|
// ExternalSourceSymbolAttr implementation
|
|
|
|
ExternalSourceSymbolAttr *ExternalSourceSymbolAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Language, llvm::StringRef DefinedIn, bool GeneratedDeclaration, llvm::StringRef USR, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ExternalSourceSymbolAttr(Ctx, CommonInfo, Language, DefinedIn, GeneratedDeclaration, USR);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ExternalSourceSymbolAttr *ExternalSourceSymbolAttr::Create(ASTContext &Ctx, llvm::StringRef Language, llvm::StringRef DefinedIn, bool GeneratedDeclaration, llvm::StringRef USR, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ExternalSourceSymbolAttr(Ctx, CommonInfo, Language, DefinedIn, GeneratedDeclaration, USR);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ExternalSourceSymbolAttr *ExternalSourceSymbolAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Language, llvm::StringRef DefinedIn, bool GeneratedDeclaration, llvm::StringRef USR, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_external_source_symbol:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_external_source_symbol, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_external_source_symbol:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_external_source_symbol, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_external_source_symbol:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_external_source_symbol, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Language, DefinedIn, GeneratedDeclaration, USR, I);
|
|
}
|
|
|
|
ExternalSourceSymbolAttr *ExternalSourceSymbolAttr::Create(ASTContext &Ctx, llvm::StringRef Language, llvm::StringRef DefinedIn, bool GeneratedDeclaration, llvm::StringRef USR, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_external_source_symbol:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_external_source_symbol, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_external_source_symbol:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_external_source_symbol, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_external_source_symbol:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_external_source_symbol, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Language, DefinedIn, GeneratedDeclaration, USR, I);
|
|
}
|
|
|
|
ExternalSourceSymbolAttr::ExternalSourceSymbolAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Language
|
|
, llvm::StringRef DefinedIn
|
|
, bool GeneratedDeclaration
|
|
, llvm::StringRef USR
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ExternalSourceSymbol, /*IsLateParsed=*/false, false)
|
|
, languageLength(Language.size()),language(new (Ctx, 1) char[languageLength])
|
|
, definedInLength(DefinedIn.size()),definedIn(new (Ctx, 1) char[definedInLength])
|
|
, generatedDeclaration(GeneratedDeclaration)
|
|
, uSRLength(USR.size()),uSR(new (Ctx, 1) char[uSRLength])
|
|
{
|
|
if (!Language.empty())
|
|
std::memcpy(language, Language.data(), languageLength);
|
|
if (!DefinedIn.empty())
|
|
std::memcpy(definedIn, DefinedIn.data(), definedInLength);
|
|
if (!USR.empty())
|
|
std::memcpy(uSR, USR.data(), uSRLength);
|
|
}
|
|
|
|
ExternalSourceSymbolAttr::ExternalSourceSymbolAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ExternalSourceSymbol, /*IsLateParsed=*/false, false)
|
|
, languageLength(0),language(nullptr)
|
|
, definedInLength(0),definedIn(nullptr)
|
|
, generatedDeclaration()
|
|
, uSRLength(0),uSR(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ExternalSourceSymbolAttr *ExternalSourceSymbolAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ExternalSourceSymbolAttr(C, *this, getLanguage(), getDefinedIn(), generatedDeclaration, getUSR());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ExternalSourceSymbolAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((external_source_symbol";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getLanguage() << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getDefinedIn() << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getGeneratedDeclaration() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getUSR() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::external_source_symbol";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getLanguage() << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getDefinedIn() << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getGeneratedDeclaration() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getUSR() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::external_source_symbol";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getLanguage() << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getDefinedIn() << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getGeneratedDeclaration() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getUSR() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ExternalSourceSymbolAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "external_source_symbol";
|
|
case 1:
|
|
return "external_source_symbol";
|
|
case 2:
|
|
return "external_source_symbol";
|
|
}
|
|
}
|
|
|
|
|
|
// FallThroughAttr implementation
|
|
|
|
FallThroughAttr *FallThroughAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FallThroughAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FallThroughAttr *FallThroughAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FallThroughAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FallThroughAttr *FallThroughAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_fallthrough:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_fallthrough, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_fallthrough:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_fallthrough, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_fallthrough:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_fallthrough, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_fallthrough:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_fallthrough, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_fallthrough:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_fallthrough, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_fallthrough:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_fallthrough, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
FallThroughAttr *FallThroughAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_fallthrough:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_fallthrough, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_fallthrough:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_fallthrough, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_fallthrough:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_fallthrough, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_fallthrough:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_fallthrough, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_fallthrough:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_fallthrough, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_fallthrough:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_fallthrough, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
FallThroughAttr::FallThroughAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: StmtAttr(Ctx, CommonInfo, attr::FallThrough, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
FallThroughAttr *FallThroughAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) FallThroughAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void FallThroughAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[fallthrough";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[fallthrough";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::fallthrough";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__attribute__((fallthrough";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[gnu::fallthrough";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[gnu::fallthrough";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *FallThroughAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "fallthrough";
|
|
case 1:
|
|
return "fallthrough";
|
|
case 2:
|
|
return "fallthrough";
|
|
case 3:
|
|
return "fallthrough";
|
|
case 4:
|
|
return "fallthrough";
|
|
case 5:
|
|
return "fallthrough";
|
|
}
|
|
}
|
|
|
|
|
|
// FastCallAttr implementation
|
|
|
|
FastCallAttr *FastCallAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FastCallAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FastCallAttr *FastCallAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FastCallAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FastCallAttr *FastCallAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
FastCallAttr *FastCallAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_fastcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_fastcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
FastCallAttr::FastCallAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::FastCall, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
FastCallAttr *FastCallAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) FastCallAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void FastCallAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((fastcall";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::fastcall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::fastcall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__fastcall";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "_fastcall";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *FastCallAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "fastcall";
|
|
case 1:
|
|
return "fastcall";
|
|
case 2:
|
|
return "fastcall";
|
|
case 3:
|
|
return "__fastcall";
|
|
case 4:
|
|
return "_fastcall";
|
|
}
|
|
}
|
|
|
|
|
|
// FinalAttr implementation
|
|
|
|
FinalAttr *FinalAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FinalAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FinalAttr *FinalAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FinalAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
FinalAttr *FinalAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_final:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_final, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_sealed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_sealed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
FinalAttr *FinalAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_final:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_final, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_sealed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_sealed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
FinalAttr::FinalAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Final, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
FinalAttr::Spelling FinalAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Keyword_final;
|
|
case 1: return Keyword_sealed;
|
|
}
|
|
}
|
|
FinalAttr *FinalAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) FinalAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void FinalAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "final";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "sealed";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *FinalAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "final";
|
|
case 1:
|
|
return "sealed";
|
|
}
|
|
}
|
|
|
|
|
|
// FlagEnumAttr implementation
|
|
|
|
FlagEnumAttr *FlagEnumAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FlagEnumAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FlagEnumAttr *FlagEnumAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FlagEnumAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FlagEnumAttr *FlagEnumAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_flag_enum:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_flag_enum, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_flag_enum:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_flag_enum, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_flag_enum:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_flag_enum, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
FlagEnumAttr *FlagEnumAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_flag_enum:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_flag_enum, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_flag_enum:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_flag_enum, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_flag_enum:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_flag_enum, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
FlagEnumAttr::FlagEnumAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::FlagEnum, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
FlagEnumAttr *FlagEnumAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) FlagEnumAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void FlagEnumAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((flag_enum";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::flag_enum";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::flag_enum";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *FlagEnumAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "flag_enum";
|
|
case 1:
|
|
return "flag_enum";
|
|
case 2:
|
|
return "flag_enum";
|
|
}
|
|
}
|
|
|
|
|
|
// FlattenAttr implementation
|
|
|
|
FlattenAttr *FlattenAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FlattenAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FlattenAttr *FlattenAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FlattenAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FlattenAttr *FlattenAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_flatten:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_flatten, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_flatten:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_flatten, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_flatten:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_flatten, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
FlattenAttr *FlattenAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_flatten:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_flatten, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_flatten:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_flatten, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_flatten:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_flatten, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
FlattenAttr::FlattenAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Flatten, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
FlattenAttr *FlattenAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) FlattenAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void FlattenAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((flatten";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::flatten";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::flatten";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *FlattenAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "flatten";
|
|
case 1:
|
|
return "flatten";
|
|
case 2:
|
|
return "flatten";
|
|
}
|
|
}
|
|
|
|
|
|
// FormatAttr implementation
|
|
|
|
FormatAttr *FormatAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * Type, int FormatIdx, int FirstArg, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FormatAttr(Ctx, CommonInfo, Type, FormatIdx, FirstArg);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FormatAttr *FormatAttr::Create(ASTContext &Ctx, IdentifierInfo * Type, int FormatIdx, int FirstArg, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FormatAttr(Ctx, CommonInfo, Type, FormatIdx, FirstArg);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FormatAttr *FormatAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * Type, int FormatIdx, int FirstArg, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_format:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_format, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_format:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_format, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_format:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_format, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Type, FormatIdx, FirstArg, I);
|
|
}
|
|
|
|
FormatAttr *FormatAttr::Create(ASTContext &Ctx, IdentifierInfo * Type, int FormatIdx, int FirstArg, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_format:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_format, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_format:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_format, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_format:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_format, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Type, FormatIdx, FirstArg, I);
|
|
}
|
|
|
|
FormatAttr::FormatAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * Type
|
|
, int FormatIdx
|
|
, int FirstArg
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Format, /*IsLateParsed=*/false, false)
|
|
, type(Type)
|
|
, formatIdx(FormatIdx)
|
|
, firstArg(FirstArg)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FormatAttr *FormatAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) FormatAttr(C, *this, type, formatIdx, firstArg);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void FormatAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((format";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getType() ? getType()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFormatIdx() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFirstArg() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::format";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getType() ? getType()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFormatIdx() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFirstArg() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::format";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getType() ? getType()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFormatIdx() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFirstArg() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *FormatAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "format";
|
|
case 1:
|
|
return "format";
|
|
case 2:
|
|
return "format";
|
|
}
|
|
}
|
|
|
|
|
|
// FormatArgAttr implementation
|
|
|
|
FormatArgAttr *FormatArgAttr::CreateImplicit(ASTContext &Ctx, ParamIdx FormatIdx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FormatArgAttr(Ctx, CommonInfo, FormatIdx);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FormatArgAttr *FormatArgAttr::Create(ASTContext &Ctx, ParamIdx FormatIdx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FormatArgAttr(Ctx, CommonInfo, FormatIdx);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FormatArgAttr *FormatArgAttr::CreateImplicit(ASTContext &Ctx, ParamIdx FormatIdx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_format_arg:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_format_arg, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_format_arg:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_format_arg, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_format_arg:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_format_arg, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, FormatIdx, I);
|
|
}
|
|
|
|
FormatArgAttr *FormatArgAttr::Create(ASTContext &Ctx, ParamIdx FormatIdx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_format_arg:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_format_arg, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_format_arg:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_format_arg, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_format_arg:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_format_arg, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, FormatIdx, I);
|
|
}
|
|
|
|
FormatArgAttr::FormatArgAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, ParamIdx FormatIdx
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::FormatArg, /*IsLateParsed=*/false, false)
|
|
, formatIdx(FormatIdx)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
FormatArgAttr *FormatArgAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) FormatArgAttr(C, *this, formatIdx);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void FormatArgAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((format_arg";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFormatIdx().getSourceIndex() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::format_arg";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFormatIdx().getSourceIndex() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::format_arg";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getFormatIdx().getSourceIndex() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *FormatArgAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "format_arg";
|
|
case 1:
|
|
return "format_arg";
|
|
case 2:
|
|
return "format_arg";
|
|
}
|
|
}
|
|
|
|
|
|
// FunctionReturnThunksAttr implementation
|
|
|
|
FunctionReturnThunksAttr *FunctionReturnThunksAttr::CreateImplicit(ASTContext &Ctx, FunctionReturnThunksAttr::Kind ThunkType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FunctionReturnThunksAttr(Ctx, CommonInfo, ThunkType);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FunctionReturnThunksAttr *FunctionReturnThunksAttr::Create(ASTContext &Ctx, FunctionReturnThunksAttr::Kind ThunkType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) FunctionReturnThunksAttr(Ctx, CommonInfo, ThunkType);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
FunctionReturnThunksAttr *FunctionReturnThunksAttr::CreateImplicit(ASTContext &Ctx, FunctionReturnThunksAttr::Kind ThunkType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_function_return:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_function_return, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_function_return:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_function_return, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_function_return:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_function_return, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, ThunkType, I);
|
|
}
|
|
|
|
FunctionReturnThunksAttr *FunctionReturnThunksAttr::Create(ASTContext &Ctx, FunctionReturnThunksAttr::Kind ThunkType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_function_return:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_function_return, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_function_return:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_function_return, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_function_return:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_function_return, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, ThunkType, I);
|
|
}
|
|
|
|
FunctionReturnThunksAttr::FunctionReturnThunksAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, FunctionReturnThunksAttr::Kind ThunkType
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::FunctionReturnThunks, /*IsLateParsed=*/false, false)
|
|
, thunkType(ThunkType)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool FunctionReturnThunksAttr::ConvertStrToKind(StringRef Val, FunctionReturnThunksAttr::Kind &Out) {
|
|
std::optional<FunctionReturnThunksAttr::Kind> R = llvm::StringSwitch<std::optional<FunctionReturnThunksAttr::Kind>>(Val)
|
|
.Case("keep", FunctionReturnThunksAttr::Kind::Keep)
|
|
.Case("thunk-extern", FunctionReturnThunksAttr::Kind::Extern)
|
|
.Default(std::optional<FunctionReturnThunksAttr::Kind>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *FunctionReturnThunksAttr::ConvertKindToStr(FunctionReturnThunksAttr::Kind Val) {
|
|
switch(Val) {
|
|
case FunctionReturnThunksAttr::Kind::Keep: return "keep";
|
|
case FunctionReturnThunksAttr::Kind::Extern: return "thunk-extern";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
FunctionReturnThunksAttr *FunctionReturnThunksAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) FunctionReturnThunksAttr(C, *this, thunkType);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void FunctionReturnThunksAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((function_return";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << FunctionReturnThunksAttr::ConvertKindToStr(getThunkType()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::function_return";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << FunctionReturnThunksAttr::ConvertKindToStr(getThunkType()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::function_return";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << FunctionReturnThunksAttr::ConvertKindToStr(getThunkType()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *FunctionReturnThunksAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "function_return";
|
|
case 1:
|
|
return "function_return";
|
|
case 2:
|
|
return "function_return";
|
|
}
|
|
}
|
|
|
|
|
|
// GNUInlineAttr implementation
|
|
|
|
GNUInlineAttr *GNUInlineAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) GNUInlineAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
GNUInlineAttr *GNUInlineAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) GNUInlineAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
GNUInlineAttr *GNUInlineAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_gnu_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_gnu_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_gnu_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_gnu_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_gnu_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_gnu_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
GNUInlineAttr *GNUInlineAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_gnu_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_gnu_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_gnu_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_gnu_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_gnu_inline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_gnu_inline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
GNUInlineAttr::GNUInlineAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::GNUInline, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
GNUInlineAttr *GNUInlineAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) GNUInlineAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void GNUInlineAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((gnu_inline";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::gnu_inline";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::gnu_inline";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *GNUInlineAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "gnu_inline";
|
|
case 1:
|
|
return "gnu_inline";
|
|
case 2:
|
|
return "gnu_inline";
|
|
}
|
|
}
|
|
|
|
|
|
// GuardedByAttr implementation
|
|
|
|
GuardedByAttr *GuardedByAttr::CreateImplicit(ASTContext &Ctx, Expr * Arg, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) GuardedByAttr(Ctx, CommonInfo, Arg);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
GuardedByAttr *GuardedByAttr::Create(ASTContext &Ctx, Expr * Arg, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) GuardedByAttr(Ctx, CommonInfo, Arg);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
GuardedByAttr *GuardedByAttr::CreateImplicit(ASTContext &Ctx, Expr * Arg, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Arg, I);
|
|
}
|
|
|
|
GuardedByAttr *GuardedByAttr::Create(ASTContext &Ctx, Expr * Arg, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Arg, I);
|
|
}
|
|
|
|
GuardedByAttr::GuardedByAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Arg
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::GuardedBy, /*IsLateParsed=*/true, true)
|
|
, arg(Arg)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
GuardedByAttr *GuardedByAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) GuardedByAttr(C, *this, arg);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void GuardedByAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((guarded_by";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getArg()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *GuardedByAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "guarded_by";
|
|
}
|
|
}
|
|
|
|
|
|
// GuardedVarAttr implementation
|
|
|
|
GuardedVarAttr *GuardedVarAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) GuardedVarAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
GuardedVarAttr *GuardedVarAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) GuardedVarAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
GuardedVarAttr *GuardedVarAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_guarded_var:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_guarded_var, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_guarded_var:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_guarded_var, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
GuardedVarAttr *GuardedVarAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_guarded_var:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_guarded_var, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_guarded_var:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_guarded_var, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
GuardedVarAttr::GuardedVarAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::GuardedVar, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
GuardedVarAttr *GuardedVarAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) GuardedVarAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void GuardedVarAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((guarded_var";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::guarded_var";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *GuardedVarAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "guarded_var";
|
|
case 1:
|
|
return "guarded_var";
|
|
}
|
|
}
|
|
|
|
|
|
// HIPManagedAttr implementation
|
|
|
|
HIPManagedAttr *HIPManagedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HIPManagedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HIPManagedAttr *HIPManagedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HIPManagedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HIPManagedAttr *HIPManagedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_managed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_managed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_managed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_managed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
HIPManagedAttr *HIPManagedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_managed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_managed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_managed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_managed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
HIPManagedAttr::HIPManagedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::HIPManaged, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
HIPManagedAttr *HIPManagedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HIPManagedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HIPManagedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((managed";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__declspec(__managed__";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HIPManagedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "managed";
|
|
case 1:
|
|
return "__managed__";
|
|
}
|
|
}
|
|
|
|
|
|
// HLSLGroupSharedAddressSpaceAttr implementation
|
|
|
|
HLSLGroupSharedAddressSpaceAttr *HLSLGroupSharedAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLGroupSharedAddressSpaceAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLGroupSharedAddressSpaceAttr *HLSLGroupSharedAddressSpaceAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLGroupSharedAddressSpaceAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLGroupSharedAddressSpaceAttr *HLSLGroupSharedAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
HLSLGroupSharedAddressSpaceAttr *HLSLGroupSharedAddressSpaceAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
HLSLGroupSharedAddressSpaceAttr::HLSLGroupSharedAddressSpaceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::HLSLGroupSharedAddressSpace, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
HLSLGroupSharedAddressSpaceAttr *HLSLGroupSharedAddressSpaceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HLSLGroupSharedAddressSpaceAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HLSLGroupSharedAddressSpaceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "groupshared";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HLSLGroupSharedAddressSpaceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "groupshared";
|
|
}
|
|
}
|
|
|
|
|
|
// HLSLLoopHintAttr implementation
|
|
|
|
HLSLLoopHintAttr *HLSLLoopHintAttr::CreateImplicit(ASTContext &Ctx, unsigned Directive, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLLoopHintAttr(Ctx, CommonInfo, Directive);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLLoopHintAttr *HLSLLoopHintAttr::Create(ASTContext &Ctx, unsigned Directive, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLLoopHintAttr(Ctx, CommonInfo, Directive);
|
|
return A;
|
|
}
|
|
|
|
HLSLLoopHintAttr *HLSLLoopHintAttr::CreateImplicit(ASTContext &Ctx, unsigned Directive, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Microsoft_unroll:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Microsoft, Microsoft_unroll, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Microsoft_loop:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Microsoft, Microsoft_loop, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Microsoft, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Directive, I);
|
|
}
|
|
|
|
HLSLLoopHintAttr *HLSLLoopHintAttr::Create(ASTContext &Ctx, unsigned Directive, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Microsoft_unroll:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Microsoft, Microsoft_unroll, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Microsoft_loop:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Microsoft, Microsoft_loop, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Microsoft, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Directive, I);
|
|
}
|
|
|
|
HLSLLoopHintAttr::HLSLLoopHintAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned Directive
|
|
)
|
|
: StmtAttr(Ctx, CommonInfo, attr::HLSLLoopHint, /*IsLateParsed=*/false)
|
|
, directive(Directive)
|
|
{
|
|
}
|
|
|
|
HLSLLoopHintAttr::HLSLLoopHintAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: StmtAttr(Ctx, CommonInfo, attr::HLSLLoopHint, /*IsLateParsed=*/false)
|
|
, directive()
|
|
{
|
|
}
|
|
|
|
HLSLLoopHintAttr::Spelling HLSLLoopHintAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Microsoft_unroll;
|
|
case 1: return Microsoft_loop;
|
|
}
|
|
}
|
|
|
|
|
|
HLSLLoopHintAttr *HLSLLoopHintAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HLSLLoopHintAttr(C, *this, directive);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HLSLLoopHintAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[unroll";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getDirective() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[loop";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getDirective() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HLSLLoopHintAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "unroll";
|
|
case 1:
|
|
return "loop";
|
|
}
|
|
}
|
|
|
|
|
|
// HLSLNumThreadsAttr implementation
|
|
|
|
HLSLNumThreadsAttr *HLSLNumThreadsAttr::CreateImplicit(ASTContext &Ctx, int X, int Y, int Z, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLNumThreadsAttr(Ctx, CommonInfo, X, Y, Z);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLNumThreadsAttr *HLSLNumThreadsAttr::Create(ASTContext &Ctx, int X, int Y, int Z, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLNumThreadsAttr(Ctx, CommonInfo, X, Y, Z);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLNumThreadsAttr *HLSLNumThreadsAttr::CreateImplicit(ASTContext &Ctx, int X, int Y, int Z, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Microsoft, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, X, Y, Z, I);
|
|
}
|
|
|
|
HLSLNumThreadsAttr *HLSLNumThreadsAttr::Create(ASTContext &Ctx, int X, int Y, int Z, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Microsoft, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, X, Y, Z, I);
|
|
}
|
|
|
|
HLSLNumThreadsAttr::HLSLNumThreadsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, int X
|
|
, int Y
|
|
, int Z
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::HLSLNumThreads, /*IsLateParsed=*/false, false)
|
|
, x(X)
|
|
, y(Y)
|
|
, z(Z)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HLSLNumThreadsAttr *HLSLNumThreadsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HLSLNumThreadsAttr(C, *this, x, y, z);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HLSLNumThreadsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[numthreads";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getX() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getY() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getZ() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HLSLNumThreadsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "numthreads";
|
|
}
|
|
}
|
|
|
|
|
|
// HLSLPackOffsetAttr implementation
|
|
|
|
HLSLPackOffsetAttr *HLSLPackOffsetAttr::CreateImplicit(ASTContext &Ctx, int Subcomponent, int Component, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLPackOffsetAttr(Ctx, CommonInfo, Subcomponent, Component);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLPackOffsetAttr *HLSLPackOffsetAttr::Create(ASTContext &Ctx, int Subcomponent, int Component, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLPackOffsetAttr(Ctx, CommonInfo, Subcomponent, Component);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLPackOffsetAttr *HLSLPackOffsetAttr::CreateImplicit(ASTContext &Ctx, int Subcomponent, int Component, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_HLSLAnnotation, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Subcomponent, Component, I);
|
|
}
|
|
|
|
HLSLPackOffsetAttr *HLSLPackOffsetAttr::Create(ASTContext &Ctx, int Subcomponent, int Component, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_HLSLAnnotation, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Subcomponent, Component, I);
|
|
}
|
|
|
|
HLSLPackOffsetAttr::HLSLPackOffsetAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, int Subcomponent
|
|
, int Component
|
|
)
|
|
: HLSLAnnotationAttr(Ctx, CommonInfo, attr::HLSLPackOffset, /*IsLateParsed=*/false, false)
|
|
, subcomponent(Subcomponent)
|
|
, component(Component)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
HLSLPackOffsetAttr *HLSLPackOffsetAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HLSLPackOffsetAttr(C, *this, subcomponent, component);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HLSLPackOffsetAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << ":packoffset";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getSubcomponent() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getComponent() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HLSLPackOffsetAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "packoffset";
|
|
}
|
|
}
|
|
|
|
|
|
// HLSLParamModifierAttr implementation
|
|
|
|
HLSLParamModifierAttr *HLSLParamModifierAttr::CreateImplicit(ASTContext &Ctx, bool MergedSpelling, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLParamModifierAttr(Ctx, CommonInfo, MergedSpelling);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLParamModifierAttr *HLSLParamModifierAttr::Create(ASTContext &Ctx, bool MergedSpelling, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLParamModifierAttr(Ctx, CommonInfo, MergedSpelling);
|
|
return A;
|
|
}
|
|
|
|
HLSLParamModifierAttr *HLSLParamModifierAttr::CreateImplicit(ASTContext &Ctx, bool MergedSpelling, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_in:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_in, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_inout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_inout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_out:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_out, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, MergedSpelling, I);
|
|
}
|
|
|
|
HLSLParamModifierAttr *HLSLParamModifierAttr::Create(ASTContext &Ctx, bool MergedSpelling, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_in:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_in, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_inout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_inout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_out:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_out, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, MergedSpelling, I);
|
|
}
|
|
|
|
HLSLParamModifierAttr *HLSLParamModifierAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLParamModifierAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLParamModifierAttr *HLSLParamModifierAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLParamModifierAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
HLSLParamModifierAttr *HLSLParamModifierAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_in:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_in, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_inout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_inout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_out:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_out, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
HLSLParamModifierAttr *HLSLParamModifierAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_in:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_in, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_inout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_inout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_out:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_out, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
HLSLParamModifierAttr::HLSLParamModifierAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, bool MergedSpelling
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::HLSLParamModifier, /*IsLateParsed=*/false)
|
|
, mergedSpelling(MergedSpelling)
|
|
{
|
|
}
|
|
|
|
HLSLParamModifierAttr::HLSLParamModifierAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::HLSLParamModifier, /*IsLateParsed=*/false)
|
|
, mergedSpelling()
|
|
{
|
|
}
|
|
|
|
HLSLParamModifierAttr::Spelling HLSLParamModifierAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Keyword_in;
|
|
case 1: return Keyword_inout;
|
|
case 2: return Keyword_out;
|
|
}
|
|
}
|
|
|
|
|
|
HLSLParamModifierAttr *HLSLParamModifierAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HLSLParamModifierAttr(C, *this, mergedSpelling);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HLSLParamModifierAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "in";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "inout";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "out";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HLSLParamModifierAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "in";
|
|
case 1:
|
|
return "inout";
|
|
case 2:
|
|
return "out";
|
|
}
|
|
}
|
|
|
|
|
|
// HLSLROVAttr implementation
|
|
|
|
HLSLROVAttr *HLSLROVAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLROVAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLROVAttr *HLSLROVAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLROVAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLROVAttr *HLSLROVAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
HLSLROVAttr *HLSLROVAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
HLSLROVAttr::HLSLROVAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::HLSLROV, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
HLSLROVAttr *HLSLROVAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HLSLROVAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HLSLROVAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[hlsl::is_rov";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HLSLROVAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "is_rov";
|
|
}
|
|
}
|
|
|
|
|
|
// HLSLResourceAttr implementation
|
|
|
|
HLSLResourceAttr *HLSLResourceAttr::CreateImplicit(ASTContext &Ctx, llvm::hlsl::ResourceKind ResourceKind, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLResourceAttr(Ctx, CommonInfo, ResourceKind);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLResourceAttr *HLSLResourceAttr::Create(ASTContext &Ctx, llvm::hlsl::ResourceKind ResourceKind, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLResourceAttr(Ctx, CommonInfo, ResourceKind);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLResourceAttr *HLSLResourceAttr::CreateImplicit(ASTContext &Ctx, llvm::hlsl::ResourceKind ResourceKind, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, ResourceKind, I);
|
|
}
|
|
|
|
HLSLResourceAttr *HLSLResourceAttr::Create(ASTContext &Ctx, llvm::hlsl::ResourceKind ResourceKind, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, ResourceKind, I);
|
|
}
|
|
|
|
HLSLResourceAttr::HLSLResourceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::hlsl::ResourceKind ResourceKind
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::HLSLResource, /*IsLateParsed=*/false, false)
|
|
, resourceKind(ResourceKind)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool HLSLResourceAttr::ConvertStrToResourceKind(StringRef Val, llvm::hlsl::ResourceKind &Out) {
|
|
std::optional<llvm::hlsl::ResourceKind> R = llvm::StringSwitch<std::optional<llvm::hlsl::ResourceKind>>(Val)
|
|
.Case("Texture1D", llvm::hlsl::ResourceKind::Texture1D)
|
|
.Case("Texture2D", llvm::hlsl::ResourceKind::Texture2D)
|
|
.Case("Texture2DMS", llvm::hlsl::ResourceKind::Texture2DMS)
|
|
.Case("Texture3D", llvm::hlsl::ResourceKind::Texture3D)
|
|
.Case("TextureCube", llvm::hlsl::ResourceKind::TextureCube)
|
|
.Case("Texture1DArray", llvm::hlsl::ResourceKind::Texture1DArray)
|
|
.Case("Texture2DArray", llvm::hlsl::ResourceKind::Texture2DArray)
|
|
.Case("Texture2DMSArray", llvm::hlsl::ResourceKind::Texture2DMSArray)
|
|
.Case("TextureCubeArray", llvm::hlsl::ResourceKind::TextureCubeArray)
|
|
.Case("TypedBuffer", llvm::hlsl::ResourceKind::TypedBuffer)
|
|
.Case("RawBuffer", llvm::hlsl::ResourceKind::RawBuffer)
|
|
.Case("StructuredBuffer", llvm::hlsl::ResourceKind::StructuredBuffer)
|
|
.Case("CBuffer", llvm::hlsl::ResourceKind::CBuffer)
|
|
.Case("Sampler", llvm::hlsl::ResourceKind::Sampler)
|
|
.Case("TBuffer", llvm::hlsl::ResourceKind::TBuffer)
|
|
.Case("RTAccelerationStructure", llvm::hlsl::ResourceKind::RTAccelerationStructure)
|
|
.Case("FeedbackTexture2D", llvm::hlsl::ResourceKind::FeedbackTexture2D)
|
|
.Case("FeedbackTexture2DArray", llvm::hlsl::ResourceKind::FeedbackTexture2DArray)
|
|
.Default(std::optional<llvm::hlsl::ResourceKind>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *HLSLResourceAttr::ConvertResourceKindToStr(llvm::hlsl::ResourceKind Val) {
|
|
switch(Val) {
|
|
case llvm::hlsl::ResourceKind::Texture1D: return "Texture1D";
|
|
case llvm::hlsl::ResourceKind::Texture2D: return "Texture2D";
|
|
case llvm::hlsl::ResourceKind::Texture2DMS: return "Texture2DMS";
|
|
case llvm::hlsl::ResourceKind::Texture3D: return "Texture3D";
|
|
case llvm::hlsl::ResourceKind::TextureCube: return "TextureCube";
|
|
case llvm::hlsl::ResourceKind::Texture1DArray: return "Texture1DArray";
|
|
case llvm::hlsl::ResourceKind::Texture2DArray: return "Texture2DArray";
|
|
case llvm::hlsl::ResourceKind::Texture2DMSArray: return "Texture2DMSArray";
|
|
case llvm::hlsl::ResourceKind::TextureCubeArray: return "TextureCubeArray";
|
|
case llvm::hlsl::ResourceKind::TypedBuffer: return "TypedBuffer";
|
|
case llvm::hlsl::ResourceKind::RawBuffer: return "RawBuffer";
|
|
case llvm::hlsl::ResourceKind::StructuredBuffer: return "StructuredBuffer";
|
|
case llvm::hlsl::ResourceKind::CBuffer: return "CBuffer";
|
|
case llvm::hlsl::ResourceKind::Sampler: return "Sampler";
|
|
case llvm::hlsl::ResourceKind::TBuffer: return "TBuffer";
|
|
case llvm::hlsl::ResourceKind::RTAccelerationStructure: return "RTAccelerationStructure";
|
|
case llvm::hlsl::ResourceKind::FeedbackTexture2D: return "FeedbackTexture2D";
|
|
case llvm::hlsl::ResourceKind::FeedbackTexture2DArray: return "FeedbackTexture2DArray";
|
|
default: llvm_unreachable("Invalid attribute value");
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
HLSLResourceAttr *HLSLResourceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HLSLResourceAttr(C, *this, resourceKind);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HLSLResourceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *HLSLResourceAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// HLSLResourceBindingAttr implementation
|
|
|
|
HLSLResourceBindingAttr *HLSLResourceBindingAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Slot, llvm::StringRef Space, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLResourceBindingAttr(Ctx, CommonInfo, Slot, Space);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLResourceBindingAttr *HLSLResourceBindingAttr::Create(ASTContext &Ctx, llvm::StringRef Slot, llvm::StringRef Space, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLResourceBindingAttr(Ctx, CommonInfo, Slot, Space);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLResourceBindingAttr *HLSLResourceBindingAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Slot, llvm::StringRef Space, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_HLSLAnnotation, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Slot, Space, I);
|
|
}
|
|
|
|
HLSLResourceBindingAttr *HLSLResourceBindingAttr::Create(ASTContext &Ctx, llvm::StringRef Slot, llvm::StringRef Space, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_HLSLAnnotation, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Slot, Space, I);
|
|
}
|
|
|
|
HLSLResourceBindingAttr::HLSLResourceBindingAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Slot
|
|
, llvm::StringRef Space
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::HLSLResourceBinding, /*IsLateParsed=*/false, false)
|
|
, slotLength(Slot.size()),slot(new (Ctx, 1) char[slotLength])
|
|
, spaceLength(Space.size()),space(new (Ctx, 1) char[spaceLength])
|
|
{
|
|
if (!Slot.empty())
|
|
std::memcpy(slot, Slot.data(), slotLength);
|
|
if (!Space.empty())
|
|
std::memcpy(space, Space.data(), spaceLength);
|
|
}
|
|
|
|
HLSLResourceBindingAttr::HLSLResourceBindingAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Slot
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::HLSLResourceBinding, /*IsLateParsed=*/false, false)
|
|
, slotLength(Slot.size()),slot(new (Ctx, 1) char[slotLength])
|
|
, spaceLength(0),space(nullptr)
|
|
{
|
|
if (!Slot.empty())
|
|
std::memcpy(slot, Slot.data(), slotLength);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
HLSLResourceBindingAttr *HLSLResourceBindingAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HLSLResourceBindingAttr(C, *this, getSlot(), getSpace());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HLSLResourceBindingAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << ":register";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getSlot() << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getSpace() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HLSLResourceBindingAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "register";
|
|
}
|
|
}
|
|
|
|
|
|
// HLSLResourceClassAttr implementation
|
|
|
|
HLSLResourceClassAttr *HLSLResourceClassAttr::CreateImplicit(ASTContext &Ctx, llvm::hlsl::ResourceClass ResourceClass, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLResourceClassAttr(Ctx, CommonInfo, ResourceClass);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLResourceClassAttr *HLSLResourceClassAttr::Create(ASTContext &Ctx, llvm::hlsl::ResourceClass ResourceClass, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLResourceClassAttr(Ctx, CommonInfo, ResourceClass);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLResourceClassAttr *HLSLResourceClassAttr::CreateImplicit(ASTContext &Ctx, llvm::hlsl::ResourceClass ResourceClass, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, ResourceClass, I);
|
|
}
|
|
|
|
HLSLResourceClassAttr *HLSLResourceClassAttr::Create(ASTContext &Ctx, llvm::hlsl::ResourceClass ResourceClass, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, ResourceClass, I);
|
|
}
|
|
|
|
HLSLResourceClassAttr::HLSLResourceClassAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::hlsl::ResourceClass ResourceClass
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::HLSLResourceClass, /*IsLateParsed=*/false, false)
|
|
, resourceClass(ResourceClass)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool HLSLResourceClassAttr::ConvertStrToResourceClass(StringRef Val, llvm::hlsl::ResourceClass &Out) {
|
|
std::optional<llvm::hlsl::ResourceClass> R = llvm::StringSwitch<std::optional<llvm::hlsl::ResourceClass>>(Val)
|
|
.Case("SRV", llvm::hlsl::ResourceClass::SRV)
|
|
.Case("UAV", llvm::hlsl::ResourceClass::UAV)
|
|
.Case("CBuffer", llvm::hlsl::ResourceClass::CBuffer)
|
|
.Case("Sampler", llvm::hlsl::ResourceClass::Sampler)
|
|
.Default(std::optional<llvm::hlsl::ResourceClass>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *HLSLResourceClassAttr::ConvertResourceClassToStr(llvm::hlsl::ResourceClass Val) {
|
|
switch(Val) {
|
|
case llvm::hlsl::ResourceClass::SRV: return "SRV";
|
|
case llvm::hlsl::ResourceClass::UAV: return "UAV";
|
|
case llvm::hlsl::ResourceClass::CBuffer: return "CBuffer";
|
|
case llvm::hlsl::ResourceClass::Sampler: return "Sampler";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
HLSLResourceClassAttr *HLSLResourceClassAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HLSLResourceClassAttr(C, *this, resourceClass);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HLSLResourceClassAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[hlsl::resource_class";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << HLSLResourceClassAttr::ConvertResourceClassToStr(getResourceClass()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HLSLResourceClassAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "resource_class";
|
|
}
|
|
}
|
|
|
|
|
|
// HLSLSV_DispatchThreadIDAttr implementation
|
|
|
|
HLSLSV_DispatchThreadIDAttr *HLSLSV_DispatchThreadIDAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLSV_DispatchThreadIDAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLSV_DispatchThreadIDAttr *HLSLSV_DispatchThreadIDAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLSV_DispatchThreadIDAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLSV_DispatchThreadIDAttr *HLSLSV_DispatchThreadIDAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_HLSLAnnotation, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
HLSLSV_DispatchThreadIDAttr *HLSLSV_DispatchThreadIDAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_HLSLAnnotation, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
HLSLSV_DispatchThreadIDAttr::HLSLSV_DispatchThreadIDAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: HLSLAnnotationAttr(Ctx, CommonInfo, attr::HLSLSV_DispatchThreadID, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
HLSLSV_DispatchThreadIDAttr *HLSLSV_DispatchThreadIDAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HLSLSV_DispatchThreadIDAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HLSLSV_DispatchThreadIDAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << ":SV_DispatchThreadID";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HLSLSV_DispatchThreadIDAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "SV_DispatchThreadID";
|
|
}
|
|
}
|
|
|
|
|
|
// HLSLSV_GroupIndexAttr implementation
|
|
|
|
HLSLSV_GroupIndexAttr *HLSLSV_GroupIndexAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLSV_GroupIndexAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLSV_GroupIndexAttr *HLSLSV_GroupIndexAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLSV_GroupIndexAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLSV_GroupIndexAttr *HLSLSV_GroupIndexAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_HLSLAnnotation, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
HLSLSV_GroupIndexAttr *HLSLSV_GroupIndexAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_HLSLAnnotation, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
HLSLSV_GroupIndexAttr::HLSLSV_GroupIndexAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: HLSLAnnotationAttr(Ctx, CommonInfo, attr::HLSLSV_GroupIndex, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
HLSLSV_GroupIndexAttr *HLSLSV_GroupIndexAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HLSLSV_GroupIndexAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HLSLSV_GroupIndexAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << ":SV_GroupIndex";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HLSLSV_GroupIndexAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "SV_GroupIndex";
|
|
}
|
|
}
|
|
|
|
|
|
// HLSLShaderAttr implementation
|
|
|
|
HLSLShaderAttr *HLSLShaderAttr::CreateImplicit(ASTContext &Ctx, llvm::Triple::EnvironmentType Type, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLShaderAttr(Ctx, CommonInfo, Type);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLShaderAttr *HLSLShaderAttr::Create(ASTContext &Ctx, llvm::Triple::EnvironmentType Type, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HLSLShaderAttr(Ctx, CommonInfo, Type);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HLSLShaderAttr *HLSLShaderAttr::CreateImplicit(ASTContext &Ctx, llvm::Triple::EnvironmentType Type, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Microsoft, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Type, I);
|
|
}
|
|
|
|
HLSLShaderAttr *HLSLShaderAttr::Create(ASTContext &Ctx, llvm::Triple::EnvironmentType Type, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Microsoft, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Type, I);
|
|
}
|
|
|
|
HLSLShaderAttr::HLSLShaderAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::Triple::EnvironmentType Type
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::HLSLShader, /*IsLateParsed=*/false, false)
|
|
, type(Type)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool HLSLShaderAttr::ConvertStrToEnvironmentType(StringRef Val, llvm::Triple::EnvironmentType &Out) {
|
|
std::optional<llvm::Triple::EnvironmentType> R = llvm::StringSwitch<std::optional<llvm::Triple::EnvironmentType>>(Val)
|
|
.Case("pixel", llvm::Triple::EnvironmentType::Pixel)
|
|
.Case("vertex", llvm::Triple::EnvironmentType::Vertex)
|
|
.Case("geometry", llvm::Triple::EnvironmentType::Geometry)
|
|
.Case("hull", llvm::Triple::EnvironmentType::Hull)
|
|
.Case("domain", llvm::Triple::EnvironmentType::Domain)
|
|
.Case("compute", llvm::Triple::EnvironmentType::Compute)
|
|
.Case("raygeneration", llvm::Triple::EnvironmentType::RayGeneration)
|
|
.Case("intersection", llvm::Triple::EnvironmentType::Intersection)
|
|
.Case("anyhit", llvm::Triple::EnvironmentType::AnyHit)
|
|
.Case("closesthit", llvm::Triple::EnvironmentType::ClosestHit)
|
|
.Case("miss", llvm::Triple::EnvironmentType::Miss)
|
|
.Case("callable", llvm::Triple::EnvironmentType::Callable)
|
|
.Case("mesh", llvm::Triple::EnvironmentType::Mesh)
|
|
.Case("amplification", llvm::Triple::EnvironmentType::Amplification)
|
|
.Default(std::optional<llvm::Triple::EnvironmentType>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *HLSLShaderAttr::ConvertEnvironmentTypeToStr(llvm::Triple::EnvironmentType Val) {
|
|
switch(Val) {
|
|
case llvm::Triple::EnvironmentType::Pixel: return "pixel";
|
|
case llvm::Triple::EnvironmentType::Vertex: return "vertex";
|
|
case llvm::Triple::EnvironmentType::Geometry: return "geometry";
|
|
case llvm::Triple::EnvironmentType::Hull: return "hull";
|
|
case llvm::Triple::EnvironmentType::Domain: return "domain";
|
|
case llvm::Triple::EnvironmentType::Compute: return "compute";
|
|
case llvm::Triple::EnvironmentType::RayGeneration: return "raygeneration";
|
|
case llvm::Triple::EnvironmentType::Intersection: return "intersection";
|
|
case llvm::Triple::EnvironmentType::AnyHit: return "anyhit";
|
|
case llvm::Triple::EnvironmentType::ClosestHit: return "closesthit";
|
|
case llvm::Triple::EnvironmentType::Miss: return "miss";
|
|
case llvm::Triple::EnvironmentType::Callable: return "callable";
|
|
case llvm::Triple::EnvironmentType::Mesh: return "mesh";
|
|
case llvm::Triple::EnvironmentType::Amplification: return "amplification";
|
|
default: llvm_unreachable("Invalid attribute value");
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
HLSLShaderAttr *HLSLShaderAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HLSLShaderAttr(C, *this, type);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HLSLShaderAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[shader";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << HLSLShaderAttr::ConvertEnvironmentTypeToStr(getType()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HLSLShaderAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "shader";
|
|
}
|
|
}
|
|
|
|
|
|
// HotAttr implementation
|
|
|
|
HotAttr *HotAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HotAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HotAttr *HotAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HotAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HotAttr *HotAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_hot:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_hot, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_hot:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_hot, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_hot:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_hot, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
HotAttr *HotAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_hot:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_hot, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_hot:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_hot, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_hot:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_hot, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
HotAttr::HotAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Hot, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
HotAttr *HotAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HotAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HotAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((hot";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::hot";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::hot";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HotAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "hot";
|
|
case 1:
|
|
return "hot";
|
|
case 2:
|
|
return "hot";
|
|
}
|
|
}
|
|
|
|
|
|
// HybridPatchableAttr implementation
|
|
|
|
HybridPatchableAttr *HybridPatchableAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HybridPatchableAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HybridPatchableAttr *HybridPatchableAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) HybridPatchableAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
HybridPatchableAttr *HybridPatchableAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_hybrid_patchable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_hybrid_patchable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_hybrid_patchable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_hybrid_patchable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_hybrid_patchable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_hybrid_patchable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_hybrid_patchable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_hybrid_patchable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
HybridPatchableAttr *HybridPatchableAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_hybrid_patchable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_hybrid_patchable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_hybrid_patchable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_hybrid_patchable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_hybrid_patchable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_hybrid_patchable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_hybrid_patchable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_hybrid_patchable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
HybridPatchableAttr::HybridPatchableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::HybridPatchable, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
HybridPatchableAttr *HybridPatchableAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) HybridPatchableAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void HybridPatchableAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(hybrid_patchable";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__attribute__((hybrid_patchable";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::hybrid_patchable";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::hybrid_patchable";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *HybridPatchableAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "hybrid_patchable";
|
|
case 1:
|
|
return "hybrid_patchable";
|
|
case 2:
|
|
return "hybrid_patchable";
|
|
case 3:
|
|
return "hybrid_patchable";
|
|
}
|
|
}
|
|
|
|
|
|
// IBActionAttr implementation
|
|
|
|
IBActionAttr *IBActionAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) IBActionAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
IBActionAttr *IBActionAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) IBActionAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
IBActionAttr *IBActionAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ibaction:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ibaction, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ibaction:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ibaction, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ibaction:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ibaction, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
IBActionAttr *IBActionAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ibaction:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ibaction, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ibaction:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ibaction, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ibaction:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ibaction, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
IBActionAttr::IBActionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::IBAction, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
IBActionAttr *IBActionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) IBActionAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void IBActionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((ibaction";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::ibaction";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::ibaction";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *IBActionAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "ibaction";
|
|
case 1:
|
|
return "ibaction";
|
|
case 2:
|
|
return "ibaction";
|
|
}
|
|
}
|
|
|
|
|
|
// IBOutletAttr implementation
|
|
|
|
IBOutletAttr *IBOutletAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) IBOutletAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
IBOutletAttr *IBOutletAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) IBOutletAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
IBOutletAttr *IBOutletAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_iboutlet:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_iboutlet, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_iboutlet:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_iboutlet, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_iboutlet:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_iboutlet, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
IBOutletAttr *IBOutletAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_iboutlet:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_iboutlet, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_iboutlet:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_iboutlet, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_iboutlet:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_iboutlet, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
IBOutletAttr::IBOutletAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::IBOutlet, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
IBOutletAttr *IBOutletAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) IBOutletAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void IBOutletAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((iboutlet";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::iboutlet";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::iboutlet";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *IBOutletAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "iboutlet";
|
|
case 1:
|
|
return "iboutlet";
|
|
case 2:
|
|
return "iboutlet";
|
|
}
|
|
}
|
|
|
|
|
|
// IBOutletCollectionAttr implementation
|
|
|
|
IBOutletCollectionAttr *IBOutletCollectionAttr::CreateImplicit(ASTContext &Ctx, TypeSourceInfo * Interface, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) IBOutletCollectionAttr(Ctx, CommonInfo, Interface);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
IBOutletCollectionAttr *IBOutletCollectionAttr::Create(ASTContext &Ctx, TypeSourceInfo * Interface, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) IBOutletCollectionAttr(Ctx, CommonInfo, Interface);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
IBOutletCollectionAttr *IBOutletCollectionAttr::CreateImplicit(ASTContext &Ctx, TypeSourceInfo * Interface, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_iboutletcollection:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_iboutletcollection, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_iboutletcollection:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_iboutletcollection, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_iboutletcollection:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_iboutletcollection, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Interface, I);
|
|
}
|
|
|
|
IBOutletCollectionAttr *IBOutletCollectionAttr::Create(ASTContext &Ctx, TypeSourceInfo * Interface, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_iboutletcollection:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_iboutletcollection, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_iboutletcollection:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_iboutletcollection, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_iboutletcollection:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_iboutletcollection, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Interface, I);
|
|
}
|
|
|
|
IBOutletCollectionAttr::IBOutletCollectionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, TypeSourceInfo * Interface
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::IBOutletCollection, /*IsLateParsed=*/false, false)
|
|
, interface_(Interface)
|
|
{
|
|
}
|
|
|
|
IBOutletCollectionAttr::IBOutletCollectionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::IBOutletCollection, /*IsLateParsed=*/false, false)
|
|
, interface_()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
IBOutletCollectionAttr *IBOutletCollectionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) IBOutletCollectionAttr(C, *this, interface_);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void IBOutletCollectionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((iboutletcollection";
|
|
if (!getInterfaceLoc())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getInterfaceLoc())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getInterface().getAsString() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::iboutletcollection";
|
|
if (!getInterfaceLoc())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getInterfaceLoc())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getInterface().getAsString() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::iboutletcollection";
|
|
if (!getInterfaceLoc())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getInterfaceLoc())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getInterface().getAsString() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *IBOutletCollectionAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "iboutletcollection";
|
|
case 1:
|
|
return "iboutletcollection";
|
|
case 2:
|
|
return "iboutletcollection";
|
|
}
|
|
}
|
|
|
|
|
|
// IFuncAttr implementation
|
|
|
|
IFuncAttr *IFuncAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Resolver, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) IFuncAttr(Ctx, CommonInfo, Resolver);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
IFuncAttr *IFuncAttr::Create(ASTContext &Ctx, llvm::StringRef Resolver, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) IFuncAttr(Ctx, CommonInfo, Resolver);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
IFuncAttr *IFuncAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Resolver, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ifunc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ifunc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_ifunc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_ifunc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_ifunc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_ifunc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Resolver, I);
|
|
}
|
|
|
|
IFuncAttr *IFuncAttr::Create(ASTContext &Ctx, llvm::StringRef Resolver, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ifunc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ifunc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_ifunc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_ifunc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_ifunc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_ifunc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Resolver, I);
|
|
}
|
|
|
|
IFuncAttr::IFuncAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Resolver
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::IFunc, /*IsLateParsed=*/false)
|
|
, resolverLength(Resolver.size()),resolver(new (Ctx, 1) char[resolverLength])
|
|
{
|
|
if (!Resolver.empty())
|
|
std::memcpy(resolver, Resolver.data(), resolverLength);
|
|
}
|
|
|
|
|
|
|
|
IFuncAttr *IFuncAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) IFuncAttr(C, *this, getResolver());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void IFuncAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((ifunc";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getResolver() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::ifunc";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getResolver() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::ifunc";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getResolver() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *IFuncAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "ifunc";
|
|
case 1:
|
|
return "ifunc";
|
|
case 2:
|
|
return "ifunc";
|
|
}
|
|
}
|
|
|
|
|
|
// InitPriorityAttr implementation
|
|
|
|
InitPriorityAttr *InitPriorityAttr::CreateImplicit(ASTContext &Ctx, unsigned Priority, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) InitPriorityAttr(Ctx, CommonInfo, Priority);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
InitPriorityAttr *InitPriorityAttr::Create(ASTContext &Ctx, unsigned Priority, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) InitPriorityAttr(Ctx, CommonInfo, Priority);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
InitPriorityAttr *InitPriorityAttr::CreateImplicit(ASTContext &Ctx, unsigned Priority, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_init_priority:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_init_priority, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_init_priority:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_init_priority, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Priority, I);
|
|
}
|
|
|
|
InitPriorityAttr *InitPriorityAttr::Create(ASTContext &Ctx, unsigned Priority, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_init_priority:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_init_priority, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_init_priority:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_init_priority, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Priority, I);
|
|
}
|
|
|
|
InitPriorityAttr::InitPriorityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned Priority
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::InitPriority, /*IsLateParsed=*/false, false)
|
|
, priority(Priority)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
InitPriorityAttr *InitPriorityAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) InitPriorityAttr(C, *this, priority);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void InitPriorityAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((init_priority";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getPriority() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::init_priority";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getPriority() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *InitPriorityAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "init_priority";
|
|
case 1:
|
|
return "init_priority";
|
|
}
|
|
}
|
|
|
|
|
|
// InitSegAttr implementation
|
|
|
|
InitSegAttr *InitSegAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Section, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) InitSegAttr(Ctx, CommonInfo, Section);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
InitSegAttr *InitSegAttr::Create(ASTContext &Ctx, llvm::StringRef Section, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) InitSegAttr(Ctx, CommonInfo, Section);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
InitSegAttr *InitSegAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Section, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Pragma, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Section, I);
|
|
}
|
|
|
|
InitSegAttr *InitSegAttr::Create(ASTContext &Ctx, llvm::StringRef Section, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Pragma, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Section, I);
|
|
}
|
|
|
|
InitSegAttr::InitSegAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Section
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::InitSeg, /*IsLateParsed=*/false)
|
|
, sectionLength(Section.size()),section(new (Ctx, 1) char[sectionLength])
|
|
{
|
|
if (!Section.empty())
|
|
std::memcpy(section, Section.data(), sectionLength);
|
|
}
|
|
|
|
|
|
|
|
InitSegAttr *InitSegAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) InitSegAttr(C, *this, getSection());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void InitSegAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "#pragma init_seg";
|
|
printPrettyPragma(OS, Policy);
|
|
OS << "\n"; break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *InitSegAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "init_seg";
|
|
}
|
|
}
|
|
|
|
|
|
// IntelOclBiccAttr implementation
|
|
|
|
IntelOclBiccAttr *IntelOclBiccAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) IntelOclBiccAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
IntelOclBiccAttr *IntelOclBiccAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) IntelOclBiccAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
IntelOclBiccAttr *IntelOclBiccAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_intel_ocl_bicc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_intel_ocl_bicc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_intel_ocl_bicc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_intel_ocl_bicc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
IntelOclBiccAttr *IntelOclBiccAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_intel_ocl_bicc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_intel_ocl_bicc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_intel_ocl_bicc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_intel_ocl_bicc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
IntelOclBiccAttr::IntelOclBiccAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::IntelOclBicc, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
IntelOclBiccAttr *IntelOclBiccAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) IntelOclBiccAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void IntelOclBiccAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((intel_ocl_bicc";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::intel_ocl_bicc";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *IntelOclBiccAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "intel_ocl_bicc";
|
|
case 1:
|
|
return "intel_ocl_bicc";
|
|
}
|
|
}
|
|
|
|
|
|
// InternalLinkageAttr implementation
|
|
|
|
InternalLinkageAttr *InternalLinkageAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) InternalLinkageAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
InternalLinkageAttr *InternalLinkageAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) InternalLinkageAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
InternalLinkageAttr *InternalLinkageAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_internal_linkage:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_internal_linkage, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_internal_linkage:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_internal_linkage, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_internal_linkage:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_internal_linkage, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
InternalLinkageAttr *InternalLinkageAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_internal_linkage:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_internal_linkage, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_internal_linkage:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_internal_linkage, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_internal_linkage:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_internal_linkage, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
InternalLinkageAttr::InternalLinkageAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::InternalLinkage, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
InternalLinkageAttr *InternalLinkageAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) InternalLinkageAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void InternalLinkageAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((internal_linkage";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::internal_linkage";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::internal_linkage";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *InternalLinkageAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "internal_linkage";
|
|
case 1:
|
|
return "internal_linkage";
|
|
case 2:
|
|
return "internal_linkage";
|
|
}
|
|
}
|
|
|
|
|
|
// LTOVisibilityPublicAttr implementation
|
|
|
|
LTOVisibilityPublicAttr *LTOVisibilityPublicAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LTOVisibilityPublicAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LTOVisibilityPublicAttr *LTOVisibilityPublicAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LTOVisibilityPublicAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LTOVisibilityPublicAttr *LTOVisibilityPublicAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_lto_visibility_public:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_lto_visibility_public, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_lto_visibility_public:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_lto_visibility_public, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_lto_visibility_public:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_lto_visibility_public, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
LTOVisibilityPublicAttr *LTOVisibilityPublicAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_lto_visibility_public:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_lto_visibility_public, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_lto_visibility_public:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_lto_visibility_public, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_lto_visibility_public:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_lto_visibility_public, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
LTOVisibilityPublicAttr::LTOVisibilityPublicAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::LTOVisibilityPublic, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
LTOVisibilityPublicAttr *LTOVisibilityPublicAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) LTOVisibilityPublicAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void LTOVisibilityPublicAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((lto_visibility_public";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::lto_visibility_public";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::lto_visibility_public";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *LTOVisibilityPublicAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "lto_visibility_public";
|
|
case 1:
|
|
return "lto_visibility_public";
|
|
case 2:
|
|
return "lto_visibility_public";
|
|
}
|
|
}
|
|
|
|
|
|
// LayoutVersionAttr implementation
|
|
|
|
LayoutVersionAttr *LayoutVersionAttr::CreateImplicit(ASTContext &Ctx, unsigned Version, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LayoutVersionAttr(Ctx, CommonInfo, Version);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LayoutVersionAttr *LayoutVersionAttr::Create(ASTContext &Ctx, unsigned Version, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LayoutVersionAttr(Ctx, CommonInfo, Version);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LayoutVersionAttr *LayoutVersionAttr::CreateImplicit(ASTContext &Ctx, unsigned Version, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Version, I);
|
|
}
|
|
|
|
LayoutVersionAttr *LayoutVersionAttr::Create(ASTContext &Ctx, unsigned Version, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Version, I);
|
|
}
|
|
|
|
LayoutVersionAttr::LayoutVersionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned Version
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::LayoutVersion, /*IsLateParsed=*/false, false)
|
|
, version(Version)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
LayoutVersionAttr *LayoutVersionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) LayoutVersionAttr(C, *this, version);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void LayoutVersionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(layout_version";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getVersion() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *LayoutVersionAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "layout_version";
|
|
}
|
|
}
|
|
|
|
|
|
// LeafAttr implementation
|
|
|
|
LeafAttr *LeafAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LeafAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LeafAttr *LeafAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LeafAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LeafAttr *LeafAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_leaf:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_leaf, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_leaf:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_leaf, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_leaf:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_leaf, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
LeafAttr *LeafAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_leaf:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_leaf, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_leaf:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_leaf, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_leaf:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_leaf, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
LeafAttr::LeafAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Leaf, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
LeafAttr *LeafAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) LeafAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void LeafAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((leaf";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::leaf";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::leaf";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *LeafAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "leaf";
|
|
case 1:
|
|
return "leaf";
|
|
case 2:
|
|
return "leaf";
|
|
}
|
|
}
|
|
|
|
|
|
// LifetimeBoundAttr implementation
|
|
|
|
LifetimeBoundAttr *LifetimeBoundAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LifetimeBoundAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LifetimeBoundAttr *LifetimeBoundAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LifetimeBoundAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LifetimeBoundAttr *LifetimeBoundAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
LifetimeBoundAttr *LifetimeBoundAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_lifetimebound:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_lifetimebound, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
LifetimeBoundAttr::LifetimeBoundAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::LifetimeBound, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
LifetimeBoundAttr *LifetimeBoundAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) LifetimeBoundAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void LifetimeBoundAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((lifetimebound";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::lifetimebound";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *LifetimeBoundAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "lifetimebound";
|
|
case 1:
|
|
return "lifetimebound";
|
|
}
|
|
}
|
|
|
|
|
|
// LikelyAttr implementation
|
|
|
|
LikelyAttr *LikelyAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LikelyAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LikelyAttr *LikelyAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LikelyAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LikelyAttr *LikelyAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_likely:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_likely, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_likely:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_likely, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
LikelyAttr *LikelyAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_likely:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_likely, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_likely:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_likely, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
LikelyAttr::LikelyAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: StmtAttr(Ctx, CommonInfo, attr::Likely, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
LikelyAttr *LikelyAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) LikelyAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void LikelyAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[likely";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::likely";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *LikelyAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "likely";
|
|
case 1:
|
|
return "likely";
|
|
}
|
|
}
|
|
|
|
|
|
// LoaderUninitializedAttr implementation
|
|
|
|
LoaderUninitializedAttr *LoaderUninitializedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LoaderUninitializedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LoaderUninitializedAttr *LoaderUninitializedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LoaderUninitializedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LoaderUninitializedAttr *LoaderUninitializedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_loader_uninitialized:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_loader_uninitialized, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_loader_uninitialized:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_loader_uninitialized, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_loader_uninitialized:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_loader_uninitialized, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
LoaderUninitializedAttr *LoaderUninitializedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_loader_uninitialized:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_loader_uninitialized, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_loader_uninitialized:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_loader_uninitialized, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_loader_uninitialized:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_loader_uninitialized, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
LoaderUninitializedAttr::LoaderUninitializedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::LoaderUninitialized, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
LoaderUninitializedAttr *LoaderUninitializedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) LoaderUninitializedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void LoaderUninitializedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((loader_uninitialized";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::loader_uninitialized";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::loader_uninitialized";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *LoaderUninitializedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "loader_uninitialized";
|
|
case 1:
|
|
return "loader_uninitialized";
|
|
case 2:
|
|
return "loader_uninitialized";
|
|
}
|
|
}
|
|
|
|
|
|
// LockReturnedAttr implementation
|
|
|
|
LockReturnedAttr *LockReturnedAttr::CreateImplicit(ASTContext &Ctx, Expr * Arg, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LockReturnedAttr(Ctx, CommonInfo, Arg);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LockReturnedAttr *LockReturnedAttr::Create(ASTContext &Ctx, Expr * Arg, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LockReturnedAttr(Ctx, CommonInfo, Arg);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LockReturnedAttr *LockReturnedAttr::CreateImplicit(ASTContext &Ctx, Expr * Arg, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Arg, I);
|
|
}
|
|
|
|
LockReturnedAttr *LockReturnedAttr::Create(ASTContext &Ctx, Expr * Arg, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Arg, I);
|
|
}
|
|
|
|
LockReturnedAttr::LockReturnedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Arg
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::LockReturned, /*IsLateParsed=*/true, false)
|
|
, arg(Arg)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
LockReturnedAttr *LockReturnedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) LockReturnedAttr(C, *this, arg);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void LockReturnedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((lock_returned";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getArg()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *LockReturnedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "lock_returned";
|
|
}
|
|
}
|
|
|
|
|
|
// LocksExcludedAttr implementation
|
|
|
|
LocksExcludedAttr *LocksExcludedAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LocksExcludedAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LocksExcludedAttr *LocksExcludedAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LocksExcludedAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LocksExcludedAttr *LocksExcludedAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
LocksExcludedAttr *LocksExcludedAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
LocksExcludedAttr::LocksExcludedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::LocksExcluded, /*IsLateParsed=*/true, true)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
LocksExcludedAttr::LocksExcludedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::LocksExcluded, /*IsLateParsed=*/true, true)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
LocksExcludedAttr *LocksExcludedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) LocksExcludedAttr(C, *this, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void LocksExcludedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((locks_excluded";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *LocksExcludedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "locks_excluded";
|
|
}
|
|
}
|
|
|
|
|
|
// LoopHintAttr implementation
|
|
|
|
LoopHintAttr *LoopHintAttr::CreateImplicit(ASTContext &Ctx, LoopHintAttr::OptionType Option, LoopHintAttr::LoopHintState State, Expr * Value, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LoopHintAttr(Ctx, CommonInfo, Option, State, Value);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
LoopHintAttr *LoopHintAttr::Create(ASTContext &Ctx, LoopHintAttr::OptionType Option, LoopHintAttr::LoopHintState State, Expr * Value, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) LoopHintAttr(Ctx, CommonInfo, Option, State, Value);
|
|
return A;
|
|
}
|
|
|
|
LoopHintAttr *LoopHintAttr::CreateImplicit(ASTContext &Ctx, LoopHintAttr::OptionType Option, LoopHintAttr::LoopHintState State, Expr * Value, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Pragma_clang_loop:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Pragma, Pragma_clang_loop, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Pragma_unroll:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Pragma, Pragma_unroll, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Pragma_nounroll:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Pragma, Pragma_nounroll, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Pragma_unroll_and_jam:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Pragma, Pragma_unroll_and_jam, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Pragma_nounroll_and_jam:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Pragma, Pragma_nounroll_and_jam, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Pragma, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Option, State, Value, I);
|
|
}
|
|
|
|
LoopHintAttr *LoopHintAttr::Create(ASTContext &Ctx, LoopHintAttr::OptionType Option, LoopHintAttr::LoopHintState State, Expr * Value, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Pragma_clang_loop:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Pragma, Pragma_clang_loop, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Pragma_unroll:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Pragma, Pragma_unroll, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Pragma_nounroll:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Pragma, Pragma_nounroll, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Pragma_unroll_and_jam:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Pragma, Pragma_unroll_and_jam, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Pragma_nounroll_and_jam:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Pragma, Pragma_nounroll_and_jam, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Pragma, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Option, State, Value, I);
|
|
}
|
|
|
|
LoopHintAttr::LoopHintAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, LoopHintAttr::OptionType Option
|
|
, LoopHintAttr::LoopHintState State
|
|
, Expr * Value
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::LoopHint, /*IsLateParsed=*/false)
|
|
, option(Option)
|
|
, state(State)
|
|
, value(Value)
|
|
{
|
|
}
|
|
|
|
LoopHintAttr::Spelling LoopHintAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Pragma_clang_loop;
|
|
case 1: return Pragma_unroll;
|
|
case 2: return Pragma_nounroll;
|
|
case 3: return Pragma_unroll_and_jam;
|
|
case 4: return Pragma_nounroll_and_jam;
|
|
}
|
|
}
|
|
|
|
|
|
bool LoopHintAttr::ConvertStrToOptionType(StringRef Val, LoopHintAttr::OptionType &Out) {
|
|
std::optional<LoopHintAttr::OptionType> R = llvm::StringSwitch<std::optional<LoopHintAttr::OptionType>>(Val)
|
|
.Case("vectorize", LoopHintAttr::OptionType::Vectorize)
|
|
.Case("vectorize_width", LoopHintAttr::OptionType::VectorizeWidth)
|
|
.Case("interleave", LoopHintAttr::OptionType::Interleave)
|
|
.Case("interleave_count", LoopHintAttr::OptionType::InterleaveCount)
|
|
.Case("unroll", LoopHintAttr::OptionType::Unroll)
|
|
.Case("unroll_count", LoopHintAttr::OptionType::UnrollCount)
|
|
.Case("unroll_and_jam", LoopHintAttr::OptionType::UnrollAndJam)
|
|
.Case("unroll_and_jam_count", LoopHintAttr::OptionType::UnrollAndJamCount)
|
|
.Case("pipeline", LoopHintAttr::OptionType::PipelineDisabled)
|
|
.Case("pipeline_initiation_interval", LoopHintAttr::OptionType::PipelineInitiationInterval)
|
|
.Case("distribute", LoopHintAttr::OptionType::Distribute)
|
|
.Case("vectorize_predicate", LoopHintAttr::OptionType::VectorizePredicate)
|
|
.Default(std::optional<LoopHintAttr::OptionType>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *LoopHintAttr::ConvertOptionTypeToStr(LoopHintAttr::OptionType Val) {
|
|
switch(Val) {
|
|
case LoopHintAttr::OptionType::Vectorize: return "vectorize";
|
|
case LoopHintAttr::OptionType::VectorizeWidth: return "vectorize_width";
|
|
case LoopHintAttr::OptionType::Interleave: return "interleave";
|
|
case LoopHintAttr::OptionType::InterleaveCount: return "interleave_count";
|
|
case LoopHintAttr::OptionType::Unroll: return "unroll";
|
|
case LoopHintAttr::OptionType::UnrollCount: return "unroll_count";
|
|
case LoopHintAttr::OptionType::UnrollAndJam: return "unroll_and_jam";
|
|
case LoopHintAttr::OptionType::UnrollAndJamCount: return "unroll_and_jam_count";
|
|
case LoopHintAttr::OptionType::PipelineDisabled: return "pipeline";
|
|
case LoopHintAttr::OptionType::PipelineInitiationInterval: return "pipeline_initiation_interval";
|
|
case LoopHintAttr::OptionType::Distribute: return "distribute";
|
|
case LoopHintAttr::OptionType::VectorizePredicate: return "vectorize_predicate";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
|
|
|
|
bool LoopHintAttr::ConvertStrToLoopHintState(StringRef Val, LoopHintAttr::LoopHintState &Out) {
|
|
std::optional<LoopHintAttr::LoopHintState> R = llvm::StringSwitch<std::optional<LoopHintAttr::LoopHintState>>(Val)
|
|
.Case("enable", LoopHintAttr::LoopHintState::Enable)
|
|
.Case("disable", LoopHintAttr::LoopHintState::Disable)
|
|
.Case("numeric", LoopHintAttr::LoopHintState::Numeric)
|
|
.Case("fixed_width", LoopHintAttr::LoopHintState::FixedWidth)
|
|
.Case("scalable_width", LoopHintAttr::LoopHintState::ScalableWidth)
|
|
.Case("assume_safety", LoopHintAttr::LoopHintState::AssumeSafety)
|
|
.Case("full", LoopHintAttr::LoopHintState::Full)
|
|
.Default(std::optional<LoopHintAttr::LoopHintState>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *LoopHintAttr::ConvertLoopHintStateToStr(LoopHintAttr::LoopHintState Val) {
|
|
switch(Val) {
|
|
case LoopHintAttr::LoopHintState::Enable: return "enable";
|
|
case LoopHintAttr::LoopHintState::Disable: return "disable";
|
|
case LoopHintAttr::LoopHintState::Numeric: return "numeric";
|
|
case LoopHintAttr::LoopHintState::FixedWidth: return "fixed_width";
|
|
case LoopHintAttr::LoopHintState::ScalableWidth: return "scalable_width";
|
|
case LoopHintAttr::LoopHintState::AssumeSafety: return "assume_safety";
|
|
case LoopHintAttr::LoopHintState::Full: return "full";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
|
|
|
|
LoopHintAttr *LoopHintAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) LoopHintAttr(C, *this, option, state, value);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void LoopHintAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "#pragma clang loop";
|
|
printPrettyPragma(OS, Policy);
|
|
OS << "\n"; break;
|
|
}
|
|
case 1 : {
|
|
OS << "#pragma unroll";
|
|
printPrettyPragma(OS, Policy);
|
|
OS << "\n"; break;
|
|
}
|
|
case 2 : {
|
|
OS << "#pragma nounroll";
|
|
printPrettyPragma(OS, Policy);
|
|
OS << "\n"; break;
|
|
}
|
|
case 3 : {
|
|
OS << "#pragma unroll_and_jam";
|
|
printPrettyPragma(OS, Policy);
|
|
OS << "\n"; break;
|
|
}
|
|
case 4 : {
|
|
OS << "#pragma nounroll_and_jam";
|
|
printPrettyPragma(OS, Policy);
|
|
OS << "\n"; break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *LoopHintAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "loop";
|
|
case 1:
|
|
return "unroll";
|
|
case 2:
|
|
return "nounroll";
|
|
case 3:
|
|
return "unroll_and_jam";
|
|
case 4:
|
|
return "nounroll_and_jam";
|
|
}
|
|
}
|
|
|
|
|
|
// M68kInterruptAttr implementation
|
|
|
|
M68kInterruptAttr *M68kInterruptAttr::CreateImplicit(ASTContext &Ctx, unsigned Number, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) M68kInterruptAttr(Ctx, CommonInfo, Number);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
M68kInterruptAttr *M68kInterruptAttr::Create(ASTContext &Ctx, unsigned Number, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) M68kInterruptAttr(Ctx, CommonInfo, Number);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
M68kInterruptAttr *M68kInterruptAttr::CreateImplicit(ASTContext &Ctx, unsigned Number, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Number, I);
|
|
}
|
|
|
|
M68kInterruptAttr *M68kInterruptAttr::Create(ASTContext &Ctx, unsigned Number, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Number, I);
|
|
}
|
|
|
|
M68kInterruptAttr::M68kInterruptAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned Number
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::M68kInterrupt, /*IsLateParsed=*/false, false)
|
|
, number(Number)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
M68kInterruptAttr *M68kInterruptAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) M68kInterruptAttr(C, *this, number);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void M68kInterruptAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNumber() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *M68kInterruptAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "interrupt";
|
|
}
|
|
}
|
|
|
|
|
|
// M68kRTDAttr implementation
|
|
|
|
M68kRTDAttr *M68kRTDAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) M68kRTDAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
M68kRTDAttr *M68kRTDAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) M68kRTDAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
M68kRTDAttr *M68kRTDAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_m68k_rtd:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_m68k_rtd, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_m68k_rtd:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_m68k_rtd, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_m68k_rtd:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_m68k_rtd, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
M68kRTDAttr *M68kRTDAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_m68k_rtd:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_m68k_rtd, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_m68k_rtd:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_m68k_rtd, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_m68k_rtd:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_m68k_rtd, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
M68kRTDAttr::M68kRTDAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::M68kRTD, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
M68kRTDAttr *M68kRTDAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) M68kRTDAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void M68kRTDAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((m68k_rtd";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::m68k_rtd";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::m68k_rtd";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *M68kRTDAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "m68k_rtd";
|
|
case 1:
|
|
return "m68k_rtd";
|
|
case 2:
|
|
return "m68k_rtd";
|
|
}
|
|
}
|
|
|
|
|
|
// MIGServerRoutineAttr implementation
|
|
|
|
MIGServerRoutineAttr *MIGServerRoutineAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MIGServerRoutineAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MIGServerRoutineAttr *MIGServerRoutineAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MIGServerRoutineAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MIGServerRoutineAttr *MIGServerRoutineAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_mig_server_routine:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_mig_server_routine, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_mig_server_routine:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_mig_server_routine, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_mig_server_routine:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_mig_server_routine, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MIGServerRoutineAttr *MIGServerRoutineAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_mig_server_routine:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_mig_server_routine, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_mig_server_routine:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_mig_server_routine, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_mig_server_routine:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_mig_server_routine, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MIGServerRoutineAttr::MIGServerRoutineAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MIGServerRoutine, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
MIGServerRoutineAttr *MIGServerRoutineAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MIGServerRoutineAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MIGServerRoutineAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((mig_server_routine";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::mig_server_routine";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::mig_server_routine";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MIGServerRoutineAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "mig_server_routine";
|
|
case 1:
|
|
return "mig_server_routine";
|
|
case 2:
|
|
return "mig_server_routine";
|
|
}
|
|
}
|
|
|
|
|
|
// MSABIAttr implementation
|
|
|
|
MSABIAttr *MSABIAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSABIAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSABIAttr *MSABIAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSABIAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSABIAttr *MSABIAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ms_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ms_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_ms_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_ms_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_ms_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_ms_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MSABIAttr *MSABIAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ms_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ms_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_ms_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_ms_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_ms_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_ms_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MSABIAttr::MSABIAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MSABI, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
MSABIAttr *MSABIAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MSABIAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MSABIAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((ms_abi";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::ms_abi";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::ms_abi";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MSABIAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "ms_abi";
|
|
case 1:
|
|
return "ms_abi";
|
|
case 2:
|
|
return "ms_abi";
|
|
}
|
|
}
|
|
|
|
|
|
// MSAllocatorAttr implementation
|
|
|
|
MSAllocatorAttr *MSAllocatorAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSAllocatorAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSAllocatorAttr *MSAllocatorAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSAllocatorAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSAllocatorAttr *MSAllocatorAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MSAllocatorAttr *MSAllocatorAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MSAllocatorAttr::MSAllocatorAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MSAllocator, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
MSAllocatorAttr *MSAllocatorAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MSAllocatorAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MSAllocatorAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(allocator";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MSAllocatorAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "allocator";
|
|
}
|
|
}
|
|
|
|
|
|
// MSConstexprAttr implementation
|
|
|
|
MSConstexprAttr *MSConstexprAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSConstexprAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSConstexprAttr *MSConstexprAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSConstexprAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSConstexprAttr *MSConstexprAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MSConstexprAttr *MSConstexprAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MSConstexprAttr::MSConstexprAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MSConstexpr, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
MSConstexprAttr *MSConstexprAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MSConstexprAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MSConstexprAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[msvc::constexpr";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MSConstexprAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "constexpr";
|
|
}
|
|
}
|
|
|
|
|
|
// MSInheritanceAttr implementation
|
|
|
|
MSInheritanceAttr *MSInheritanceAttr::CreateImplicit(ASTContext &Ctx, bool BestCase, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSInheritanceAttr(Ctx, CommonInfo, BestCase);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSInheritanceAttr *MSInheritanceAttr::Create(ASTContext &Ctx, bool BestCase, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSInheritanceAttr(Ctx, CommonInfo, BestCase);
|
|
return A;
|
|
}
|
|
|
|
MSInheritanceAttr *MSInheritanceAttr::CreateImplicit(ASTContext &Ctx, bool BestCase, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_single_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_single_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_multiple_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_multiple_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_virtual_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_virtual_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_unspecified_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_unspecified_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, BestCase, I);
|
|
}
|
|
|
|
MSInheritanceAttr *MSInheritanceAttr::Create(ASTContext &Ctx, bool BestCase, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_single_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_single_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_multiple_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_multiple_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_virtual_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_virtual_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_unspecified_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_unspecified_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, BestCase, I);
|
|
}
|
|
|
|
MSInheritanceAttr *MSInheritanceAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSInheritanceAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSInheritanceAttr *MSInheritanceAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSInheritanceAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
MSInheritanceAttr *MSInheritanceAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_single_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_single_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_multiple_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_multiple_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_virtual_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_virtual_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_unspecified_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_unspecified_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MSInheritanceAttr *MSInheritanceAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_single_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_single_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_multiple_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_multiple_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_virtual_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_virtual_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_unspecified_inheritance:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_unspecified_inheritance, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MSInheritanceAttr::MSInheritanceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, bool BestCase
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MSInheritance, /*IsLateParsed=*/false, false)
|
|
, bestCase(BestCase)
|
|
{
|
|
}
|
|
|
|
MSInheritanceAttr::MSInheritanceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MSInheritance, /*IsLateParsed=*/false, false)
|
|
, bestCase()
|
|
{
|
|
}
|
|
|
|
MSInheritanceAttr::Spelling MSInheritanceAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Keyword_single_inheritance;
|
|
case 1: return Keyword_multiple_inheritance;
|
|
case 2: return Keyword_virtual_inheritance;
|
|
case 3: return Keyword_unspecified_inheritance;
|
|
}
|
|
}
|
|
|
|
|
|
MSInheritanceAttr *MSInheritanceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MSInheritanceAttr(C, *this, bestCase);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MSInheritanceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__single_inheritance";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__multiple_inheritance";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__virtual_inheritance";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__unspecified_inheritance";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MSInheritanceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__single_inheritance";
|
|
case 1:
|
|
return "__multiple_inheritance";
|
|
case 2:
|
|
return "__virtual_inheritance";
|
|
case 3:
|
|
return "__unspecified_inheritance";
|
|
}
|
|
}
|
|
|
|
|
|
// MSNoVTableAttr implementation
|
|
|
|
MSNoVTableAttr *MSNoVTableAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSNoVTableAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSNoVTableAttr *MSNoVTableAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSNoVTableAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSNoVTableAttr *MSNoVTableAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MSNoVTableAttr *MSNoVTableAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MSNoVTableAttr::MSNoVTableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MSNoVTable, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
MSNoVTableAttr *MSNoVTableAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MSNoVTableAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MSNoVTableAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(novtable";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MSNoVTableAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "novtable";
|
|
}
|
|
}
|
|
|
|
|
|
// MSP430InterruptAttr implementation
|
|
|
|
MSP430InterruptAttr *MSP430InterruptAttr::CreateImplicit(ASTContext &Ctx, unsigned Number, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSP430InterruptAttr(Ctx, CommonInfo, Number);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSP430InterruptAttr *MSP430InterruptAttr::Create(ASTContext &Ctx, unsigned Number, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSP430InterruptAttr(Ctx, CommonInfo, Number);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSP430InterruptAttr *MSP430InterruptAttr::CreateImplicit(ASTContext &Ctx, unsigned Number, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Number, I);
|
|
}
|
|
|
|
MSP430InterruptAttr *MSP430InterruptAttr::Create(ASTContext &Ctx, unsigned Number, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Number, I);
|
|
}
|
|
|
|
MSP430InterruptAttr::MSP430InterruptAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned Number
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MSP430Interrupt, /*IsLateParsed=*/false, false)
|
|
, number(Number)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
MSP430InterruptAttr *MSP430InterruptAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MSP430InterruptAttr(C, *this, number);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MSP430InterruptAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNumber() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNumber() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNumber() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MSP430InterruptAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "interrupt";
|
|
case 1:
|
|
return "interrupt";
|
|
case 2:
|
|
return "interrupt";
|
|
}
|
|
}
|
|
|
|
|
|
// MSStructAttr implementation
|
|
|
|
MSStructAttr *MSStructAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSStructAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSStructAttr *MSStructAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSStructAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSStructAttr *MSStructAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ms_struct:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ms_struct, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_ms_struct:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_ms_struct, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_ms_struct:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_ms_struct, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MSStructAttr *MSStructAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ms_struct:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ms_struct, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_ms_struct:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_ms_struct, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_ms_struct:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_ms_struct, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MSStructAttr::MSStructAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MSStruct, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
MSStructAttr *MSStructAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MSStructAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MSStructAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((ms_struct";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::ms_struct";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::ms_struct";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MSStructAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "ms_struct";
|
|
case 1:
|
|
return "ms_struct";
|
|
case 2:
|
|
return "ms_struct";
|
|
}
|
|
}
|
|
|
|
|
|
// MSVtorDispAttr implementation
|
|
|
|
MSVtorDispAttr *MSVtorDispAttr::CreateImplicit(ASTContext &Ctx, unsigned Vdm, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSVtorDispAttr(Ctx, CommonInfo, Vdm);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSVtorDispAttr *MSVtorDispAttr::Create(ASTContext &Ctx, unsigned Vdm, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MSVtorDispAttr(Ctx, CommonInfo, Vdm);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MSVtorDispAttr *MSVtorDispAttr::CreateImplicit(ASTContext &Ctx, unsigned Vdm, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, Vdm, I);
|
|
}
|
|
|
|
MSVtorDispAttr *MSVtorDispAttr::Create(ASTContext &Ctx, unsigned Vdm, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, Vdm, I);
|
|
}
|
|
|
|
MSVtorDispAttr::MSVtorDispAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned Vdm
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MSVtorDisp, /*IsLateParsed=*/false, false)
|
|
, vdm(Vdm)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
MSVtorDispAttr *MSVtorDispAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MSVtorDispAttr(C, *this, vdm);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MSVtorDispAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *MSVtorDispAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// MaxFieldAlignmentAttr implementation
|
|
|
|
MaxFieldAlignmentAttr *MaxFieldAlignmentAttr::CreateImplicit(ASTContext &Ctx, unsigned Alignment, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MaxFieldAlignmentAttr(Ctx, CommonInfo, Alignment);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MaxFieldAlignmentAttr *MaxFieldAlignmentAttr::Create(ASTContext &Ctx, unsigned Alignment, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MaxFieldAlignmentAttr(Ctx, CommonInfo, Alignment);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MaxFieldAlignmentAttr *MaxFieldAlignmentAttr::CreateImplicit(ASTContext &Ctx, unsigned Alignment, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, Alignment, I);
|
|
}
|
|
|
|
MaxFieldAlignmentAttr *MaxFieldAlignmentAttr::Create(ASTContext &Ctx, unsigned Alignment, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, Alignment, I);
|
|
}
|
|
|
|
MaxFieldAlignmentAttr::MaxFieldAlignmentAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned Alignment
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MaxFieldAlignment, /*IsLateParsed=*/false, false)
|
|
, alignment(Alignment)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
MaxFieldAlignmentAttr *MaxFieldAlignmentAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MaxFieldAlignmentAttr(C, *this, alignment);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MaxFieldAlignmentAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *MaxFieldAlignmentAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// MayAliasAttr implementation
|
|
|
|
MayAliasAttr *MayAliasAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MayAliasAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MayAliasAttr *MayAliasAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MayAliasAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MayAliasAttr *MayAliasAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_may_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_may_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_may_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_may_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_may_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_may_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MayAliasAttr *MayAliasAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_may_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_may_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_may_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_may_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_may_alias:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_may_alias, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MayAliasAttr::MayAliasAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MayAlias, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
MayAliasAttr *MayAliasAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MayAliasAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MayAliasAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((may_alias";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::may_alias";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::may_alias";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MayAliasAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "may_alias";
|
|
case 1:
|
|
return "may_alias";
|
|
case 2:
|
|
return "may_alias";
|
|
}
|
|
}
|
|
|
|
|
|
// MaybeUndefAttr implementation
|
|
|
|
MaybeUndefAttr *MaybeUndefAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MaybeUndefAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MaybeUndefAttr *MaybeUndefAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MaybeUndefAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MaybeUndefAttr *MaybeUndefAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_maybe_undef:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_maybe_undef, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_maybe_undef:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_maybe_undef, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_maybe_undef:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_maybe_undef, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MaybeUndefAttr *MaybeUndefAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_maybe_undef:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_maybe_undef, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_maybe_undef:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_maybe_undef, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_maybe_undef:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_maybe_undef, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MaybeUndefAttr::MaybeUndefAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MaybeUndef, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
MaybeUndefAttr *MaybeUndefAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MaybeUndefAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MaybeUndefAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((maybe_undef";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::maybe_undef";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::maybe_undef";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MaybeUndefAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "maybe_undef";
|
|
case 1:
|
|
return "maybe_undef";
|
|
case 2:
|
|
return "maybe_undef";
|
|
}
|
|
}
|
|
|
|
|
|
// MicroMipsAttr implementation
|
|
|
|
MicroMipsAttr *MicroMipsAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MicroMipsAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MicroMipsAttr *MicroMipsAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MicroMipsAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MicroMipsAttr *MicroMipsAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_micromips:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_micromips, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_micromips:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_micromips, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_micromips:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_micromips, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MicroMipsAttr *MicroMipsAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_micromips:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_micromips, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_micromips:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_micromips, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_micromips:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_micromips, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MicroMipsAttr::MicroMipsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MicroMips, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
MicroMipsAttr *MicroMipsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MicroMipsAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MicroMipsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((micromips";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::micromips";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::micromips";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MicroMipsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "micromips";
|
|
case 1:
|
|
return "micromips";
|
|
case 2:
|
|
return "micromips";
|
|
}
|
|
}
|
|
|
|
|
|
// MinSizeAttr implementation
|
|
|
|
MinSizeAttr *MinSizeAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MinSizeAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MinSizeAttr *MinSizeAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MinSizeAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MinSizeAttr *MinSizeAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_minsize:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_minsize, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_minsize:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_minsize, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_minsize:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_minsize, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MinSizeAttr *MinSizeAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_minsize:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_minsize, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_minsize:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_minsize, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_minsize:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_minsize, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MinSizeAttr::MinSizeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MinSize, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
MinSizeAttr *MinSizeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MinSizeAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MinSizeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((minsize";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::minsize";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::minsize";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MinSizeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "minsize";
|
|
case 1:
|
|
return "minsize";
|
|
case 2:
|
|
return "minsize";
|
|
}
|
|
}
|
|
|
|
|
|
// MinVectorWidthAttr implementation
|
|
|
|
MinVectorWidthAttr *MinVectorWidthAttr::CreateImplicit(ASTContext &Ctx, unsigned VectorWidth, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MinVectorWidthAttr(Ctx, CommonInfo, VectorWidth);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MinVectorWidthAttr *MinVectorWidthAttr::Create(ASTContext &Ctx, unsigned VectorWidth, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MinVectorWidthAttr(Ctx, CommonInfo, VectorWidth);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MinVectorWidthAttr *MinVectorWidthAttr::CreateImplicit(ASTContext &Ctx, unsigned VectorWidth, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_min_vector_width:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_min_vector_width, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_min_vector_width:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_min_vector_width, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_min_vector_width:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_min_vector_width, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, VectorWidth, I);
|
|
}
|
|
|
|
MinVectorWidthAttr *MinVectorWidthAttr::Create(ASTContext &Ctx, unsigned VectorWidth, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_min_vector_width:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_min_vector_width, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_min_vector_width:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_min_vector_width, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_min_vector_width:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_min_vector_width, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, VectorWidth, I);
|
|
}
|
|
|
|
MinVectorWidthAttr::MinVectorWidthAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned VectorWidth
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MinVectorWidth, /*IsLateParsed=*/false, false)
|
|
, vectorWidth(VectorWidth)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
MinVectorWidthAttr *MinVectorWidthAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MinVectorWidthAttr(C, *this, vectorWidth);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MinVectorWidthAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((min_vector_width";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getVectorWidth() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::min_vector_width";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getVectorWidth() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::min_vector_width";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getVectorWidth() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MinVectorWidthAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "min_vector_width";
|
|
case 1:
|
|
return "min_vector_width";
|
|
case 2:
|
|
return "min_vector_width";
|
|
}
|
|
}
|
|
|
|
|
|
// Mips16Attr implementation
|
|
|
|
Mips16Attr *Mips16Attr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) Mips16Attr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
Mips16Attr *Mips16Attr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) Mips16Attr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
Mips16Attr *Mips16Attr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_mips16:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_mips16, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_mips16:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_mips16, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_mips16:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_mips16, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
Mips16Attr *Mips16Attr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_mips16:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_mips16, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_mips16:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_mips16, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_mips16:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_mips16, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
Mips16Attr::Mips16Attr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Mips16, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
Mips16Attr *Mips16Attr::clone(ASTContext &C) const {
|
|
auto *A = new (C) Mips16Attr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void Mips16Attr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((mips16";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::mips16";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::mips16";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *Mips16Attr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "mips16";
|
|
case 1:
|
|
return "mips16";
|
|
case 2:
|
|
return "mips16";
|
|
}
|
|
}
|
|
|
|
|
|
// MipsInterruptAttr implementation
|
|
|
|
MipsInterruptAttr *MipsInterruptAttr::CreateImplicit(ASTContext &Ctx, MipsInterruptAttr::InterruptType Interrupt, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MipsInterruptAttr(Ctx, CommonInfo, Interrupt);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MipsInterruptAttr *MipsInterruptAttr::Create(ASTContext &Ctx, MipsInterruptAttr::InterruptType Interrupt, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MipsInterruptAttr(Ctx, CommonInfo, Interrupt);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MipsInterruptAttr *MipsInterruptAttr::CreateImplicit(ASTContext &Ctx, MipsInterruptAttr::InterruptType Interrupt, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Interrupt, I);
|
|
}
|
|
|
|
MipsInterruptAttr *MipsInterruptAttr::Create(ASTContext &Ctx, MipsInterruptAttr::InterruptType Interrupt, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Interrupt, I);
|
|
}
|
|
|
|
MipsInterruptAttr::MipsInterruptAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, MipsInterruptAttr::InterruptType Interrupt
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MipsInterrupt, /*IsLateParsed=*/false, false)
|
|
, interrupt(Interrupt)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool MipsInterruptAttr::ConvertStrToInterruptType(StringRef Val, MipsInterruptAttr::InterruptType &Out) {
|
|
std::optional<MipsInterruptAttr::InterruptType> R = llvm::StringSwitch<std::optional<MipsInterruptAttr::InterruptType>>(Val)
|
|
.Case("vector=sw0", MipsInterruptAttr::InterruptType::sw0)
|
|
.Case("vector=sw1", MipsInterruptAttr::InterruptType::sw1)
|
|
.Case("vector=hw0", MipsInterruptAttr::InterruptType::hw0)
|
|
.Case("vector=hw1", MipsInterruptAttr::InterruptType::hw1)
|
|
.Case("vector=hw2", MipsInterruptAttr::InterruptType::hw2)
|
|
.Case("vector=hw3", MipsInterruptAttr::InterruptType::hw3)
|
|
.Case("vector=hw4", MipsInterruptAttr::InterruptType::hw4)
|
|
.Case("vector=hw5", MipsInterruptAttr::InterruptType::hw5)
|
|
.Case("eic", MipsInterruptAttr::InterruptType::eic)
|
|
.Case("", MipsInterruptAttr::InterruptType::eic)
|
|
.Default(std::optional<MipsInterruptAttr::InterruptType>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *MipsInterruptAttr::ConvertInterruptTypeToStr(MipsInterruptAttr::InterruptType Val) {
|
|
switch(Val) {
|
|
case MipsInterruptAttr::InterruptType::sw0: return "vector=sw0";
|
|
case MipsInterruptAttr::InterruptType::sw1: return "vector=sw1";
|
|
case MipsInterruptAttr::InterruptType::hw0: return "vector=hw0";
|
|
case MipsInterruptAttr::InterruptType::hw1: return "vector=hw1";
|
|
case MipsInterruptAttr::InterruptType::hw2: return "vector=hw2";
|
|
case MipsInterruptAttr::InterruptType::hw3: return "vector=hw3";
|
|
case MipsInterruptAttr::InterruptType::hw4: return "vector=hw4";
|
|
case MipsInterruptAttr::InterruptType::hw5: return "vector=hw5";
|
|
case MipsInterruptAttr::InterruptType::eic: return "eic";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
MipsInterruptAttr *MipsInterruptAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MipsInterruptAttr(C, *this, interrupt);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MipsInterruptAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << MipsInterruptAttr::ConvertInterruptTypeToStr(getInterrupt()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << MipsInterruptAttr::ConvertInterruptTypeToStr(getInterrupt()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << MipsInterruptAttr::ConvertInterruptTypeToStr(getInterrupt()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MipsInterruptAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "interrupt";
|
|
case 1:
|
|
return "interrupt";
|
|
case 2:
|
|
return "interrupt";
|
|
}
|
|
}
|
|
|
|
|
|
// MipsLongCallAttr implementation
|
|
|
|
MipsLongCallAttr *MipsLongCallAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MipsLongCallAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MipsLongCallAttr *MipsLongCallAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MipsLongCallAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
MipsLongCallAttr *MipsLongCallAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_long_call:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_long_call, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_long_call:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_long_call, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_long_call:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_long_call, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_far:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_far, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_far:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_far, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_far:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_far, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MipsLongCallAttr *MipsLongCallAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_long_call:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_long_call, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_long_call:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_long_call, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_long_call:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_long_call, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_far:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_far, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_far:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_far, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_far:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_far, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MipsLongCallAttr::MipsLongCallAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MipsLongCall, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
MipsLongCallAttr::Spelling MipsLongCallAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_long_call;
|
|
case 1: return CXX11_gnu_long_call;
|
|
case 2: return C23_gnu_long_call;
|
|
case 3: return GNU_far;
|
|
case 4: return CXX11_gnu_far;
|
|
case 5: return C23_gnu_far;
|
|
}
|
|
}
|
|
MipsLongCallAttr *MipsLongCallAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MipsLongCallAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MipsLongCallAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((long_call";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::long_call";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::long_call";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__attribute__((far";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[gnu::far";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[gnu::far";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MipsLongCallAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "long_call";
|
|
case 1:
|
|
return "long_call";
|
|
case 2:
|
|
return "long_call";
|
|
case 3:
|
|
return "far";
|
|
case 4:
|
|
return "far";
|
|
case 5:
|
|
return "far";
|
|
}
|
|
}
|
|
|
|
|
|
// MipsShortCallAttr implementation
|
|
|
|
MipsShortCallAttr *MipsShortCallAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MipsShortCallAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MipsShortCallAttr *MipsShortCallAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MipsShortCallAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
MipsShortCallAttr *MipsShortCallAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_short_call:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_short_call, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_short_call:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_short_call, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_short_call:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_short_call, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_near:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_near, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_near:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_near, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_near:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_near, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MipsShortCallAttr *MipsShortCallAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_short_call:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_short_call, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_short_call:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_short_call, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_short_call:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_short_call, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_near:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_near, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_near:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_near, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_near:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_near, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MipsShortCallAttr::MipsShortCallAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::MipsShortCall, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
MipsShortCallAttr::Spelling MipsShortCallAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_short_call;
|
|
case 1: return CXX11_gnu_short_call;
|
|
case 2: return C23_gnu_short_call;
|
|
case 3: return GNU_near;
|
|
case 4: return CXX11_gnu_near;
|
|
case 5: return C23_gnu_near;
|
|
}
|
|
}
|
|
MipsShortCallAttr *MipsShortCallAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MipsShortCallAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MipsShortCallAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((short_call";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::short_call";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::short_call";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__attribute__((near";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[gnu::near";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[gnu::near";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MipsShortCallAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "short_call";
|
|
case 1:
|
|
return "short_call";
|
|
case 2:
|
|
return "short_call";
|
|
case 3:
|
|
return "near";
|
|
case 4:
|
|
return "near";
|
|
case 5:
|
|
return "near";
|
|
}
|
|
}
|
|
|
|
|
|
// ModeAttr implementation
|
|
|
|
ModeAttr *ModeAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * Mode, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ModeAttr(Ctx, CommonInfo, Mode);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ModeAttr *ModeAttr::Create(ASTContext &Ctx, IdentifierInfo * Mode, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ModeAttr(Ctx, CommonInfo, Mode);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ModeAttr *ModeAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * Mode, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_mode:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_mode, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_mode:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_mode, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_mode:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_mode, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Mode, I);
|
|
}
|
|
|
|
ModeAttr *ModeAttr::Create(ASTContext &Ctx, IdentifierInfo * Mode, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_mode:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_mode, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_mode:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_mode, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_mode:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_mode, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Mode, I);
|
|
}
|
|
|
|
ModeAttr::ModeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * Mode
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::Mode, /*IsLateParsed=*/false)
|
|
, mode(Mode)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
ModeAttr *ModeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ModeAttr(C, *this, mode);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ModeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((mode";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getMode() ? getMode()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::mode";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getMode() ? getMode()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::mode";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getMode() ? getMode()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ModeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "mode";
|
|
case 1:
|
|
return "mode";
|
|
case 2:
|
|
return "mode";
|
|
}
|
|
}
|
|
|
|
|
|
// MustTailAttr implementation
|
|
|
|
MustTailAttr *MustTailAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MustTailAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MustTailAttr *MustTailAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) MustTailAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
MustTailAttr *MustTailAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_musttail:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_musttail, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_musttail:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_musttail, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_musttail:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_musttail, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
MustTailAttr *MustTailAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_musttail:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_musttail, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_musttail:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_musttail, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_musttail:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_musttail, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
MustTailAttr::MustTailAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: StmtAttr(Ctx, CommonInfo, attr::MustTail, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
MustTailAttr *MustTailAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) MustTailAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void MustTailAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((musttail";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::musttail";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::musttail";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *MustTailAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "musttail";
|
|
case 1:
|
|
return "musttail";
|
|
case 2:
|
|
return "musttail";
|
|
}
|
|
}
|
|
|
|
|
|
// NSConsumedAttr implementation
|
|
|
|
NSConsumedAttr *NSConsumedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NSConsumedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NSConsumedAttr *NSConsumedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NSConsumedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NSConsumedAttr *NSConsumedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ns_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ns_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ns_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ns_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ns_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ns_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NSConsumedAttr *NSConsumedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ns_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ns_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ns_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ns_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ns_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ns_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NSConsumedAttr::NSConsumedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableParamAttr(Ctx, CommonInfo, attr::NSConsumed, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NSConsumedAttr *NSConsumedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NSConsumedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NSConsumedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((ns_consumed";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::ns_consumed";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::ns_consumed";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NSConsumedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "ns_consumed";
|
|
case 1:
|
|
return "ns_consumed";
|
|
case 2:
|
|
return "ns_consumed";
|
|
}
|
|
}
|
|
|
|
|
|
// NSConsumesSelfAttr implementation
|
|
|
|
NSConsumesSelfAttr *NSConsumesSelfAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NSConsumesSelfAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NSConsumesSelfAttr *NSConsumesSelfAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NSConsumesSelfAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NSConsumesSelfAttr *NSConsumesSelfAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ns_consumes_self:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ns_consumes_self, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ns_consumes_self:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ns_consumes_self, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ns_consumes_self:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ns_consumes_self, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NSConsumesSelfAttr *NSConsumesSelfAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ns_consumes_self:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ns_consumes_self, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ns_consumes_self:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ns_consumes_self, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ns_consumes_self:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ns_consumes_self, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NSConsumesSelfAttr::NSConsumesSelfAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NSConsumesSelf, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NSConsumesSelfAttr *NSConsumesSelfAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NSConsumesSelfAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NSConsumesSelfAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((ns_consumes_self";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::ns_consumes_self";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::ns_consumes_self";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NSConsumesSelfAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "ns_consumes_self";
|
|
case 1:
|
|
return "ns_consumes_self";
|
|
case 2:
|
|
return "ns_consumes_self";
|
|
}
|
|
}
|
|
|
|
|
|
// NSErrorDomainAttr implementation
|
|
|
|
NSErrorDomainAttr *NSErrorDomainAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * ErrorDomain, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NSErrorDomainAttr(Ctx, CommonInfo, ErrorDomain);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NSErrorDomainAttr *NSErrorDomainAttr::Create(ASTContext &Ctx, IdentifierInfo * ErrorDomain, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NSErrorDomainAttr(Ctx, CommonInfo, ErrorDomain);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NSErrorDomainAttr *NSErrorDomainAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * ErrorDomain, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, ErrorDomain, I);
|
|
}
|
|
|
|
NSErrorDomainAttr *NSErrorDomainAttr::Create(ASTContext &Ctx, IdentifierInfo * ErrorDomain, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, ErrorDomain, I);
|
|
}
|
|
|
|
NSErrorDomainAttr::NSErrorDomainAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * ErrorDomain
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NSErrorDomain, /*IsLateParsed=*/false, false)
|
|
, errorDomain(ErrorDomain)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
NSErrorDomainAttr *NSErrorDomainAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NSErrorDomainAttr(C, *this, errorDomain);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NSErrorDomainAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((ns_error_domain";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getErrorDomain() ? getErrorDomain()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NSErrorDomainAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "ns_error_domain";
|
|
}
|
|
}
|
|
|
|
|
|
// NSReturnsAutoreleasedAttr implementation
|
|
|
|
NSReturnsAutoreleasedAttr *NSReturnsAutoreleasedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NSReturnsAutoreleasedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NSReturnsAutoreleasedAttr *NSReturnsAutoreleasedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NSReturnsAutoreleasedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NSReturnsAutoreleasedAttr *NSReturnsAutoreleasedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ns_returns_autoreleased:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ns_returns_autoreleased, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ns_returns_autoreleased:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ns_returns_autoreleased, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ns_returns_autoreleased:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ns_returns_autoreleased, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NSReturnsAutoreleasedAttr *NSReturnsAutoreleasedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ns_returns_autoreleased:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ns_returns_autoreleased, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ns_returns_autoreleased:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ns_returns_autoreleased, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ns_returns_autoreleased:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ns_returns_autoreleased, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NSReturnsAutoreleasedAttr::NSReturnsAutoreleasedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NSReturnsAutoreleased, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NSReturnsAutoreleasedAttr *NSReturnsAutoreleasedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NSReturnsAutoreleasedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NSReturnsAutoreleasedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((ns_returns_autoreleased";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::ns_returns_autoreleased";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::ns_returns_autoreleased";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NSReturnsAutoreleasedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "ns_returns_autoreleased";
|
|
case 1:
|
|
return "ns_returns_autoreleased";
|
|
case 2:
|
|
return "ns_returns_autoreleased";
|
|
}
|
|
}
|
|
|
|
|
|
// NSReturnsNotRetainedAttr implementation
|
|
|
|
NSReturnsNotRetainedAttr *NSReturnsNotRetainedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NSReturnsNotRetainedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NSReturnsNotRetainedAttr *NSReturnsNotRetainedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NSReturnsNotRetainedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NSReturnsNotRetainedAttr *NSReturnsNotRetainedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ns_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ns_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ns_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ns_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ns_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ns_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NSReturnsNotRetainedAttr *NSReturnsNotRetainedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ns_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ns_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ns_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ns_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ns_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ns_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NSReturnsNotRetainedAttr::NSReturnsNotRetainedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NSReturnsNotRetained, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NSReturnsNotRetainedAttr *NSReturnsNotRetainedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NSReturnsNotRetainedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NSReturnsNotRetainedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((ns_returns_not_retained";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::ns_returns_not_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::ns_returns_not_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NSReturnsNotRetainedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "ns_returns_not_retained";
|
|
case 1:
|
|
return "ns_returns_not_retained";
|
|
case 2:
|
|
return "ns_returns_not_retained";
|
|
}
|
|
}
|
|
|
|
|
|
// NSReturnsRetainedAttr implementation
|
|
|
|
NSReturnsRetainedAttr *NSReturnsRetainedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NSReturnsRetainedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NSReturnsRetainedAttr *NSReturnsRetainedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NSReturnsRetainedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NSReturnsRetainedAttr *NSReturnsRetainedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ns_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ns_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ns_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ns_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ns_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ns_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NSReturnsRetainedAttr *NSReturnsRetainedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ns_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ns_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ns_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ns_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ns_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ns_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NSReturnsRetainedAttr::NSReturnsRetainedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NSReturnsRetained, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NSReturnsRetainedAttr *NSReturnsRetainedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NSReturnsRetainedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NSReturnsRetainedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((ns_returns_retained";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::ns_returns_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::ns_returns_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NSReturnsRetainedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "ns_returns_retained";
|
|
case 1:
|
|
return "ns_returns_retained";
|
|
case 2:
|
|
return "ns_returns_retained";
|
|
}
|
|
}
|
|
|
|
|
|
// NVPTXKernelAttr implementation
|
|
|
|
NVPTXKernelAttr *NVPTXKernelAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NVPTXKernelAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NVPTXKernelAttr *NVPTXKernelAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NVPTXKernelAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NVPTXKernelAttr *NVPTXKernelAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nvptx_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nvptx_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_nvptx_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_nvptx_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_nvptx_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_nvptx_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NVPTXKernelAttr *NVPTXKernelAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nvptx_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nvptx_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_nvptx_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_nvptx_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_nvptx_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_nvptx_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NVPTXKernelAttr::NVPTXKernelAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NVPTXKernel, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NVPTXKernelAttr *NVPTXKernelAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NVPTXKernelAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NVPTXKernelAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((nvptx_kernel";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::nvptx_kernel";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::nvptx_kernel";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NVPTXKernelAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nvptx_kernel";
|
|
case 1:
|
|
return "nvptx_kernel";
|
|
case 2:
|
|
return "nvptx_kernel";
|
|
}
|
|
}
|
|
|
|
|
|
// NakedAttr implementation
|
|
|
|
NakedAttr *NakedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NakedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NakedAttr *NakedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NakedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NakedAttr *NakedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_naked:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_naked, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_naked:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_naked, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_naked:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_naked, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_naked:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_naked, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NakedAttr *NakedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_naked:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_naked, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_naked:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_naked, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_naked:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_naked, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_naked:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_naked, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NakedAttr::NakedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Naked, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NakedAttr *NakedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NakedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NakedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((naked";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::naked";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::naked";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__declspec(naked";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NakedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "naked";
|
|
case 1:
|
|
return "naked";
|
|
case 2:
|
|
return "naked";
|
|
case 3:
|
|
return "naked";
|
|
}
|
|
}
|
|
|
|
|
|
// NoAliasAttr implementation
|
|
|
|
NoAliasAttr *NoAliasAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoAliasAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoAliasAttr *NoAliasAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoAliasAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoAliasAttr *NoAliasAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoAliasAttr *NoAliasAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoAliasAttr::NoAliasAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoAlias, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoAliasAttr *NoAliasAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoAliasAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoAliasAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(noalias";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoAliasAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "noalias";
|
|
}
|
|
}
|
|
|
|
|
|
// NoBuiltinAttr implementation
|
|
|
|
NoBuiltinAttr *NoBuiltinAttr::CreateImplicit(ASTContext &Ctx, StringRef *BuiltinNames, unsigned BuiltinNamesSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoBuiltinAttr(Ctx, CommonInfo, BuiltinNames, BuiltinNamesSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoBuiltinAttr *NoBuiltinAttr::Create(ASTContext &Ctx, StringRef *BuiltinNames, unsigned BuiltinNamesSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoBuiltinAttr(Ctx, CommonInfo, BuiltinNames, BuiltinNamesSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoBuiltinAttr *NoBuiltinAttr::CreateImplicit(ASTContext &Ctx, StringRef *BuiltinNames, unsigned BuiltinNamesSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_no_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_no_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_no_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_no_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, BuiltinNames, BuiltinNamesSize, I);
|
|
}
|
|
|
|
NoBuiltinAttr *NoBuiltinAttr::Create(ASTContext &Ctx, StringRef *BuiltinNames, unsigned BuiltinNamesSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_no_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_no_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_no_builtin:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_no_builtin, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, BuiltinNames, BuiltinNamesSize, I);
|
|
}
|
|
|
|
NoBuiltinAttr::NoBuiltinAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, StringRef *BuiltinNames, unsigned BuiltinNamesSize
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::NoBuiltin, /*IsLateParsed=*/false)
|
|
, builtinNames_Size(BuiltinNamesSize), builtinNames_(new (Ctx, 16) StringRef[builtinNames_Size])
|
|
{
|
|
for (size_t I = 0, E = builtinNames_Size; I != E;
|
|
++I) {
|
|
StringRef Ref = BuiltinNames[I];
|
|
if (!Ref.empty()) {
|
|
char *Mem = new (Ctx, 1) char[Ref.size()];
|
|
std::memcpy(Mem, Ref.data(), Ref.size());
|
|
builtinNames_[I] = StringRef(Mem, Ref.size());
|
|
}
|
|
}
|
|
}
|
|
|
|
NoBuiltinAttr::NoBuiltinAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::NoBuiltin, /*IsLateParsed=*/false)
|
|
, builtinNames_Size(0), builtinNames_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
NoBuiltinAttr *NoBuiltinAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoBuiltinAttr(C, *this, builtinNames_, builtinNames_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoBuiltinAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((no_builtin";
|
|
OS << "";
|
|
for (const auto &Val : builtinNames()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::no_builtin";
|
|
OS << "";
|
|
for (const auto &Val : builtinNames()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::no_builtin";
|
|
OS << "";
|
|
for (const auto &Val : builtinNames()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoBuiltinAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "no_builtin";
|
|
case 1:
|
|
return "no_builtin";
|
|
case 2:
|
|
return "no_builtin";
|
|
}
|
|
}
|
|
|
|
|
|
// NoCommonAttr implementation
|
|
|
|
NoCommonAttr *NoCommonAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoCommonAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoCommonAttr *NoCommonAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoCommonAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoCommonAttr *NoCommonAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nocommon:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nocommon, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nocommon:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nocommon, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nocommon:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nocommon, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoCommonAttr *NoCommonAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nocommon:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nocommon, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nocommon:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nocommon, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nocommon:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nocommon, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoCommonAttr::NoCommonAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoCommon, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoCommonAttr *NoCommonAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoCommonAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoCommonAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((nocommon";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::nocommon";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::nocommon";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoCommonAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nocommon";
|
|
case 1:
|
|
return "nocommon";
|
|
case 2:
|
|
return "nocommon";
|
|
}
|
|
}
|
|
|
|
|
|
// NoConvergentAttr implementation
|
|
|
|
NoConvergentAttr *NoConvergentAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoConvergentAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoConvergentAttr *NoConvergentAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoConvergentAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoConvergentAttr *NoConvergentAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_noconvergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_noconvergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_noconvergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_noconvergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_noconvergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_noconvergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_noconvergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_noconvergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoConvergentAttr *NoConvergentAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_noconvergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_noconvergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_noconvergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_noconvergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_noconvergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_noconvergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_noconvergent:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_noconvergent, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoConvergentAttr::NoConvergentAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoConvergent, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoConvergentAttr *NoConvergentAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoConvergentAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoConvergentAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((noconvergent";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::noconvergent";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::noconvergent";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__declspec(noconvergent";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoConvergentAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "noconvergent";
|
|
case 1:
|
|
return "noconvergent";
|
|
case 2:
|
|
return "noconvergent";
|
|
case 3:
|
|
return "noconvergent";
|
|
}
|
|
}
|
|
|
|
|
|
// NoDebugAttr implementation
|
|
|
|
NoDebugAttr *NoDebugAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoDebugAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoDebugAttr *NoDebugAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoDebugAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoDebugAttr *NoDebugAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nodebug:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nodebug, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nodebug:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nodebug, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nodebug:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nodebug, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoDebugAttr *NoDebugAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nodebug:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nodebug, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nodebug:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nodebug, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nodebug:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nodebug, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoDebugAttr::NoDebugAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoDebug, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoDebugAttr *NoDebugAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoDebugAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoDebugAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((nodebug";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::nodebug";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::nodebug";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoDebugAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nodebug";
|
|
case 1:
|
|
return "nodebug";
|
|
case 2:
|
|
return "nodebug";
|
|
}
|
|
}
|
|
|
|
|
|
// NoDerefAttr implementation
|
|
|
|
NoDerefAttr *NoDerefAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoDerefAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoDerefAttr *NoDerefAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoDerefAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoDerefAttr *NoDerefAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_noderef:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_noderef, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_noderef:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_noderef, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_noderef:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_noderef, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoDerefAttr *NoDerefAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_noderef:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_noderef, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_noderef:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_noderef, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_noderef:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_noderef, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoDerefAttr::NoDerefAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::NoDeref, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
NoDerefAttr *NoDerefAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoDerefAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoDerefAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((noderef";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::noderef";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::noderef";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoDerefAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "noderef";
|
|
case 1:
|
|
return "noderef";
|
|
case 2:
|
|
return "noderef";
|
|
}
|
|
}
|
|
|
|
|
|
// NoDestroyAttr implementation
|
|
|
|
NoDestroyAttr *NoDestroyAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoDestroyAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoDestroyAttr *NoDestroyAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoDestroyAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoDestroyAttr *NoDestroyAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_destroy:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_destroy, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_no_destroy:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_no_destroy, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoDestroyAttr *NoDestroyAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_destroy:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_destroy, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_no_destroy:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_no_destroy, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoDestroyAttr::NoDestroyAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoDestroy, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoDestroyAttr *NoDestroyAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoDestroyAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoDestroyAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((no_destroy";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::no_destroy";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoDestroyAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "no_destroy";
|
|
case 1:
|
|
return "no_destroy";
|
|
}
|
|
}
|
|
|
|
|
|
// NoDuplicateAttr implementation
|
|
|
|
NoDuplicateAttr *NoDuplicateAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoDuplicateAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoDuplicateAttr *NoDuplicateAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoDuplicateAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoDuplicateAttr *NoDuplicateAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_noduplicate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_noduplicate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_noduplicate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_noduplicate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_noduplicate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_noduplicate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoDuplicateAttr *NoDuplicateAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_noduplicate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_noduplicate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_noduplicate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_noduplicate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_noduplicate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_noduplicate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoDuplicateAttr::NoDuplicateAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoDuplicate, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoDuplicateAttr *NoDuplicateAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoDuplicateAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoDuplicateAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((noduplicate";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::noduplicate";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::noduplicate";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoDuplicateAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "noduplicate";
|
|
case 1:
|
|
return "noduplicate";
|
|
case 2:
|
|
return "noduplicate";
|
|
}
|
|
}
|
|
|
|
|
|
// NoEscapeAttr implementation
|
|
|
|
NoEscapeAttr *NoEscapeAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoEscapeAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoEscapeAttr *NoEscapeAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoEscapeAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoEscapeAttr *NoEscapeAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_noescape:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_noescape, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_noescape:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_noescape, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_noescape:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_noescape, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoEscapeAttr *NoEscapeAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_noescape:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_noescape, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_noescape:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_noescape, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_noescape:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_noescape, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoEscapeAttr::NoEscapeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::NoEscape, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
NoEscapeAttr *NoEscapeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoEscapeAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoEscapeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((noescape";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::noescape";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::noescape";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoEscapeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "noescape";
|
|
case 1:
|
|
return "noescape";
|
|
case 2:
|
|
return "noescape";
|
|
}
|
|
}
|
|
|
|
|
|
// NoInlineAttr implementation
|
|
|
|
NoInlineAttr *NoInlineAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoInlineAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoInlineAttr *NoInlineAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoInlineAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoInlineAttr *NoInlineAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_msvc_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_msvc_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_msvc_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_msvc_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoInlineAttr *NoInlineAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_msvc_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_msvc_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_msvc_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_msvc_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_noinline:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_noinline, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoInlineAttr::NoInlineAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: DeclOrStmtAttr(Ctx, CommonInfo, attr::NoInline, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoInlineAttr *NoInlineAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoInlineAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoInlineAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__noinline__";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__attribute__((noinline";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::noinline";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[gnu::noinline";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[clang::noinline";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[clang::noinline";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 6 : {
|
|
OS << "[[msvc::noinline";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 7 : {
|
|
OS << "[[msvc::noinline";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 8 : {
|
|
OS << "__declspec(noinline";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoInlineAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__noinline__";
|
|
case 1:
|
|
return "noinline";
|
|
case 2:
|
|
return "noinline";
|
|
case 3:
|
|
return "noinline";
|
|
case 4:
|
|
return "noinline";
|
|
case 5:
|
|
return "noinline";
|
|
case 6:
|
|
return "noinline";
|
|
case 7:
|
|
return "noinline";
|
|
case 8:
|
|
return "noinline";
|
|
}
|
|
}
|
|
|
|
|
|
// NoInstrumentFunctionAttr implementation
|
|
|
|
NoInstrumentFunctionAttr *NoInstrumentFunctionAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoInstrumentFunctionAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoInstrumentFunctionAttr *NoInstrumentFunctionAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoInstrumentFunctionAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoInstrumentFunctionAttr *NoInstrumentFunctionAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_instrument_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_instrument_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_no_instrument_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_no_instrument_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_no_instrument_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_no_instrument_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoInstrumentFunctionAttr *NoInstrumentFunctionAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_instrument_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_instrument_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_no_instrument_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_no_instrument_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_no_instrument_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_no_instrument_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoInstrumentFunctionAttr::NoInstrumentFunctionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoInstrumentFunction, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoInstrumentFunctionAttr *NoInstrumentFunctionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoInstrumentFunctionAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoInstrumentFunctionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((no_instrument_function";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::no_instrument_function";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::no_instrument_function";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoInstrumentFunctionAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "no_instrument_function";
|
|
case 1:
|
|
return "no_instrument_function";
|
|
case 2:
|
|
return "no_instrument_function";
|
|
}
|
|
}
|
|
|
|
|
|
// NoMergeAttr implementation
|
|
|
|
NoMergeAttr *NoMergeAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoMergeAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoMergeAttr *NoMergeAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoMergeAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoMergeAttr *NoMergeAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nomerge:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nomerge, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_nomerge:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_nomerge, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_nomerge:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_nomerge, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoMergeAttr *NoMergeAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nomerge:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nomerge, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_nomerge:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_nomerge, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_nomerge:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_nomerge, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoMergeAttr::NoMergeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: DeclOrStmtAttr(Ctx, CommonInfo, attr::NoMerge, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoMergeAttr *NoMergeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoMergeAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoMergeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((nomerge";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::nomerge";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::nomerge";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoMergeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nomerge";
|
|
case 1:
|
|
return "nomerge";
|
|
case 2:
|
|
return "nomerge";
|
|
}
|
|
}
|
|
|
|
|
|
// NoMicroMipsAttr implementation
|
|
|
|
NoMicroMipsAttr *NoMicroMipsAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoMicroMipsAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoMicroMipsAttr *NoMicroMipsAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoMicroMipsAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoMicroMipsAttr *NoMicroMipsAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nomicromips:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nomicromips, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nomicromips:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nomicromips, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nomicromips:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nomicromips, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoMicroMipsAttr *NoMicroMipsAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nomicromips:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nomicromips, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nomicromips:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nomicromips, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nomicromips:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nomicromips, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoMicroMipsAttr::NoMicroMipsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoMicroMips, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoMicroMipsAttr *NoMicroMipsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoMicroMipsAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoMicroMipsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((nomicromips";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::nomicromips";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::nomicromips";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoMicroMipsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nomicromips";
|
|
case 1:
|
|
return "nomicromips";
|
|
case 2:
|
|
return "nomicromips";
|
|
}
|
|
}
|
|
|
|
|
|
// NoMips16Attr implementation
|
|
|
|
NoMips16Attr *NoMips16Attr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoMips16Attr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoMips16Attr *NoMips16Attr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoMips16Attr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoMips16Attr *NoMips16Attr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nomips16:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nomips16, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nomips16:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nomips16, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nomips16:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nomips16, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoMips16Attr *NoMips16Attr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nomips16:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nomips16, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nomips16:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nomips16, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nomips16:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nomips16, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoMips16Attr::NoMips16Attr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoMips16, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoMips16Attr *NoMips16Attr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoMips16Attr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoMips16Attr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((nomips16";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::nomips16";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::nomips16";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoMips16Attr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nomips16";
|
|
case 1:
|
|
return "nomips16";
|
|
case 2:
|
|
return "nomips16";
|
|
}
|
|
}
|
|
|
|
|
|
// NoProfileFunctionAttr implementation
|
|
|
|
NoProfileFunctionAttr *NoProfileFunctionAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoProfileFunctionAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoProfileFunctionAttr *NoProfileFunctionAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoProfileFunctionAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoProfileFunctionAttr *NoProfileFunctionAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_profile_instrument_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_profile_instrument_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_no_profile_instrument_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_no_profile_instrument_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_no_profile_instrument_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_no_profile_instrument_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoProfileFunctionAttr *NoProfileFunctionAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_profile_instrument_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_profile_instrument_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_no_profile_instrument_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_no_profile_instrument_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_no_profile_instrument_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_no_profile_instrument_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoProfileFunctionAttr::NoProfileFunctionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoProfileFunction, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoProfileFunctionAttr *NoProfileFunctionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoProfileFunctionAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoProfileFunctionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((no_profile_instrument_function";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::no_profile_instrument_function";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::no_profile_instrument_function";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoProfileFunctionAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "no_profile_instrument_function";
|
|
case 1:
|
|
return "no_profile_instrument_function";
|
|
case 2:
|
|
return "no_profile_instrument_function";
|
|
}
|
|
}
|
|
|
|
|
|
// NoRandomizeLayoutAttr implementation
|
|
|
|
NoRandomizeLayoutAttr *NoRandomizeLayoutAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoRandomizeLayoutAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoRandomizeLayoutAttr *NoRandomizeLayoutAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoRandomizeLayoutAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoRandomizeLayoutAttr *NoRandomizeLayoutAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_randomize_layout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_randomize_layout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_no_randomize_layout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_no_randomize_layout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_no_randomize_layout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_no_randomize_layout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoRandomizeLayoutAttr *NoRandomizeLayoutAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_randomize_layout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_randomize_layout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_no_randomize_layout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_no_randomize_layout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_no_randomize_layout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_no_randomize_layout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoRandomizeLayoutAttr::NoRandomizeLayoutAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoRandomizeLayout, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoRandomizeLayoutAttr *NoRandomizeLayoutAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoRandomizeLayoutAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoRandomizeLayoutAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((no_randomize_layout";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::no_randomize_layout";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::no_randomize_layout";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoRandomizeLayoutAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "no_randomize_layout";
|
|
case 1:
|
|
return "no_randomize_layout";
|
|
case 2:
|
|
return "no_randomize_layout";
|
|
}
|
|
}
|
|
|
|
|
|
// NoReturnAttr implementation
|
|
|
|
NoReturnAttr *NoReturnAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoReturnAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoReturnAttr *NoReturnAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoReturnAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoReturnAttr *NoReturnAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoReturnAttr *NoReturnAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_noreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_noreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoReturnAttr::NoReturnAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoReturn, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoReturnAttr *NoReturnAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoReturnAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoReturnAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((noreturn";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::noreturn";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::noreturn";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__declspec(noreturn";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoReturnAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "noreturn";
|
|
case 1:
|
|
return "noreturn";
|
|
case 2:
|
|
return "noreturn";
|
|
case 3:
|
|
return "noreturn";
|
|
}
|
|
}
|
|
|
|
|
|
// NoSanitizeAttr implementation
|
|
|
|
NoSanitizeAttr *NoSanitizeAttr::CreateImplicit(ASTContext &Ctx, StringRef *Sanitizers, unsigned SanitizersSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoSanitizeAttr(Ctx, CommonInfo, Sanitizers, SanitizersSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoSanitizeAttr *NoSanitizeAttr::Create(ASTContext &Ctx, StringRef *Sanitizers, unsigned SanitizersSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoSanitizeAttr(Ctx, CommonInfo, Sanitizers, SanitizersSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoSanitizeAttr *NoSanitizeAttr::CreateImplicit(ASTContext &Ctx, StringRef *Sanitizers, unsigned SanitizersSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_sanitize:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_sanitize, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_no_sanitize:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_no_sanitize, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_no_sanitize:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_no_sanitize, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Sanitizers, SanitizersSize, I);
|
|
}
|
|
|
|
NoSanitizeAttr *NoSanitizeAttr::Create(ASTContext &Ctx, StringRef *Sanitizers, unsigned SanitizersSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_sanitize:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_sanitize, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_no_sanitize:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_no_sanitize, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_no_sanitize:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_no_sanitize, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Sanitizers, SanitizersSize, I);
|
|
}
|
|
|
|
NoSanitizeAttr::NoSanitizeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, StringRef *Sanitizers, unsigned SanitizersSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoSanitize, /*IsLateParsed=*/false, false)
|
|
, sanitizers_Size(SanitizersSize), sanitizers_(new (Ctx, 16) StringRef[sanitizers_Size])
|
|
{
|
|
for (size_t I = 0, E = sanitizers_Size; I != E;
|
|
++I) {
|
|
StringRef Ref = Sanitizers[I];
|
|
if (!Ref.empty()) {
|
|
char *Mem = new (Ctx, 1) char[Ref.size()];
|
|
std::memcpy(Mem, Ref.data(), Ref.size());
|
|
sanitizers_[I] = StringRef(Mem, Ref.size());
|
|
}
|
|
}
|
|
}
|
|
|
|
NoSanitizeAttr::NoSanitizeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoSanitize, /*IsLateParsed=*/false, false)
|
|
, sanitizers_Size(0), sanitizers_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
NoSanitizeAttr *NoSanitizeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoSanitizeAttr(C, *this, sanitizers_, sanitizers_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoSanitizeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((no_sanitize";
|
|
OS << "";
|
|
for (const auto &Val : sanitizers()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::no_sanitize";
|
|
OS << "";
|
|
for (const auto &Val : sanitizers()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::no_sanitize";
|
|
OS << "";
|
|
for (const auto &Val : sanitizers()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoSanitizeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "no_sanitize";
|
|
case 1:
|
|
return "no_sanitize";
|
|
case 2:
|
|
return "no_sanitize";
|
|
}
|
|
}
|
|
|
|
|
|
// NoSpeculativeLoadHardeningAttr implementation
|
|
|
|
NoSpeculativeLoadHardeningAttr *NoSpeculativeLoadHardeningAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoSpeculativeLoadHardeningAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoSpeculativeLoadHardeningAttr *NoSpeculativeLoadHardeningAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoSpeculativeLoadHardeningAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoSpeculativeLoadHardeningAttr *NoSpeculativeLoadHardeningAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_speculative_load_hardening:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_speculative_load_hardening, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_no_speculative_load_hardening:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_no_speculative_load_hardening, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_no_speculative_load_hardening:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_no_speculative_load_hardening, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoSpeculativeLoadHardeningAttr *NoSpeculativeLoadHardeningAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_speculative_load_hardening:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_speculative_load_hardening, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_no_speculative_load_hardening:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_no_speculative_load_hardening, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_no_speculative_load_hardening:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_no_speculative_load_hardening, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoSpeculativeLoadHardeningAttr::NoSpeculativeLoadHardeningAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoSpeculativeLoadHardening, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoSpeculativeLoadHardeningAttr *NoSpeculativeLoadHardeningAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoSpeculativeLoadHardeningAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoSpeculativeLoadHardeningAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((no_speculative_load_hardening";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::no_speculative_load_hardening";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::no_speculative_load_hardening";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoSpeculativeLoadHardeningAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "no_speculative_load_hardening";
|
|
case 1:
|
|
return "no_speculative_load_hardening";
|
|
case 2:
|
|
return "no_speculative_load_hardening";
|
|
}
|
|
}
|
|
|
|
|
|
// NoSplitStackAttr implementation
|
|
|
|
NoSplitStackAttr *NoSplitStackAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoSplitStackAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoSplitStackAttr *NoSplitStackAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoSplitStackAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoSplitStackAttr *NoSplitStackAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_split_stack:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_split_stack, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_no_split_stack:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_no_split_stack, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_no_split_stack:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_no_split_stack, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoSplitStackAttr *NoSplitStackAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_split_stack:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_split_stack, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_no_split_stack:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_no_split_stack, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_no_split_stack:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_no_split_stack, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoSplitStackAttr::NoSplitStackAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoSplitStack, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoSplitStackAttr *NoSplitStackAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoSplitStackAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoSplitStackAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((no_split_stack";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::no_split_stack";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::no_split_stack";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoSplitStackAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "no_split_stack";
|
|
case 1:
|
|
return "no_split_stack";
|
|
case 2:
|
|
return "no_split_stack";
|
|
}
|
|
}
|
|
|
|
|
|
// NoStackProtectorAttr implementation
|
|
|
|
NoStackProtectorAttr *NoStackProtectorAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoStackProtectorAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoStackProtectorAttr *NoStackProtectorAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoStackProtectorAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
NoStackProtectorAttr *NoStackProtectorAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_stack_protector:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_stack_protector, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_no_stack_protector:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_no_stack_protector, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_no_stack_protector:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_no_stack_protector, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_no_stack_protector:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_no_stack_protector, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_no_stack_protector:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_no_stack_protector, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_safebuffers:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_safebuffers, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoStackProtectorAttr *NoStackProtectorAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_stack_protector:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_stack_protector, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_no_stack_protector:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_no_stack_protector, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_no_stack_protector:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_no_stack_protector, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_no_stack_protector:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_no_stack_protector, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_no_stack_protector:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_no_stack_protector, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_safebuffers:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_safebuffers, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoStackProtectorAttr::NoStackProtectorAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoStackProtector, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoStackProtectorAttr::Spelling NoStackProtectorAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_no_stack_protector;
|
|
case 1: return CXX11_clang_no_stack_protector;
|
|
case 2: return C23_clang_no_stack_protector;
|
|
case 3: return CXX11_gnu_no_stack_protector;
|
|
case 4: return C23_gnu_no_stack_protector;
|
|
case 5: return Declspec_safebuffers;
|
|
}
|
|
}
|
|
NoStackProtectorAttr *NoStackProtectorAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoStackProtectorAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoStackProtectorAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((no_stack_protector";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::no_stack_protector";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::no_stack_protector";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[gnu::no_stack_protector";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[gnu::no_stack_protector";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "__declspec(safebuffers";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoStackProtectorAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "no_stack_protector";
|
|
case 1:
|
|
return "no_stack_protector";
|
|
case 2:
|
|
return "no_stack_protector";
|
|
case 3:
|
|
return "no_stack_protector";
|
|
case 4:
|
|
return "no_stack_protector";
|
|
case 5:
|
|
return "safebuffers";
|
|
}
|
|
}
|
|
|
|
|
|
// NoThreadSafetyAnalysisAttr implementation
|
|
|
|
NoThreadSafetyAnalysisAttr *NoThreadSafetyAnalysisAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoThreadSafetyAnalysisAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoThreadSafetyAnalysisAttr *NoThreadSafetyAnalysisAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoThreadSafetyAnalysisAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoThreadSafetyAnalysisAttr *NoThreadSafetyAnalysisAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_thread_safety_analysis:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_thread_safety_analysis, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_no_thread_safety_analysis:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_no_thread_safety_analysis, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_no_thread_safety_analysis:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_no_thread_safety_analysis, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoThreadSafetyAnalysisAttr *NoThreadSafetyAnalysisAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_no_thread_safety_analysis:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_no_thread_safety_analysis, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_no_thread_safety_analysis:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_no_thread_safety_analysis, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_no_thread_safety_analysis:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_no_thread_safety_analysis, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoThreadSafetyAnalysisAttr::NoThreadSafetyAnalysisAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoThreadSafetyAnalysis, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoThreadSafetyAnalysisAttr *NoThreadSafetyAnalysisAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoThreadSafetyAnalysisAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoThreadSafetyAnalysisAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((no_thread_safety_analysis";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::no_thread_safety_analysis";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::no_thread_safety_analysis";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoThreadSafetyAnalysisAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "no_thread_safety_analysis";
|
|
case 1:
|
|
return "no_thread_safety_analysis";
|
|
case 2:
|
|
return "no_thread_safety_analysis";
|
|
}
|
|
}
|
|
|
|
|
|
// NoThrowAttr implementation
|
|
|
|
NoThrowAttr *NoThrowAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoThrowAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoThrowAttr *NoThrowAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoThrowAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoThrowAttr *NoThrowAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nothrow:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nothrow, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nothrow:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nothrow, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nothrow:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nothrow, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_nothrow:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_nothrow, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoThrowAttr *NoThrowAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nothrow:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nothrow, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nothrow:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nothrow, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nothrow:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nothrow, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_nothrow:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_nothrow, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoThrowAttr::NoThrowAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoThrow, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoThrowAttr *NoThrowAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoThrowAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoThrowAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((nothrow";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::nothrow";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::nothrow";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__declspec(nothrow";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoThrowAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nothrow";
|
|
case 1:
|
|
return "nothrow";
|
|
case 2:
|
|
return "nothrow";
|
|
case 3:
|
|
return "nothrow";
|
|
}
|
|
}
|
|
|
|
|
|
// NoUniqueAddressAttr implementation
|
|
|
|
NoUniqueAddressAttr *NoUniqueAddressAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoUniqueAddressAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoUniqueAddressAttr *NoUniqueAddressAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoUniqueAddressAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoUniqueAddressAttr *NoUniqueAddressAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_no_unique_address:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_no_unique_address, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_msvc_no_unique_address:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_msvc_no_unique_address, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoUniqueAddressAttr *NoUniqueAddressAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_no_unique_address:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_no_unique_address, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_msvc_no_unique_address:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_msvc_no_unique_address, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoUniqueAddressAttr::NoUniqueAddressAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoUniqueAddress, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoUniqueAddressAttr *NoUniqueAddressAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoUniqueAddressAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoUniqueAddressAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[no_unique_address";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[msvc::no_unique_address";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoUniqueAddressAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "no_unique_address";
|
|
case 1:
|
|
return "no_unique_address";
|
|
}
|
|
}
|
|
|
|
|
|
// NoUwtableAttr implementation
|
|
|
|
NoUwtableAttr *NoUwtableAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoUwtableAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoUwtableAttr *NoUwtableAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NoUwtableAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NoUwtableAttr *NoUwtableAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nouwtable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nouwtable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_nouwtable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_nouwtable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_nouwtable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_nouwtable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NoUwtableAttr *NoUwtableAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nouwtable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nouwtable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_nouwtable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_nouwtable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_nouwtable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_nouwtable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NoUwtableAttr::NoUwtableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NoUwtable, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NoUwtableAttr *NoUwtableAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NoUwtableAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NoUwtableAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((nouwtable";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::nouwtable";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::nouwtable";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NoUwtableAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nouwtable";
|
|
case 1:
|
|
return "nouwtable";
|
|
case 2:
|
|
return "nouwtable";
|
|
}
|
|
}
|
|
|
|
|
|
// NonAllocatingAttr implementation
|
|
|
|
NonAllocatingAttr *NonAllocatingAttr::CreateImplicit(ASTContext &Ctx, Expr * Cond, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NonAllocatingAttr(Ctx, CommonInfo, Cond);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NonAllocatingAttr *NonAllocatingAttr::Create(ASTContext &Ctx, Expr * Cond, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NonAllocatingAttr(Ctx, CommonInfo, Cond);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NonAllocatingAttr *NonAllocatingAttr::CreateImplicit(ASTContext &Ctx, Expr * Cond, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nonallocating:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nonallocating, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_nonallocating:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_nonallocating, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_nonallocating:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_nonallocating, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Cond, I);
|
|
}
|
|
|
|
NonAllocatingAttr *NonAllocatingAttr::Create(ASTContext &Ctx, Expr * Cond, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nonallocating:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nonallocating, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_nonallocating:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_nonallocating, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_nonallocating:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_nonallocating, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Cond, I);
|
|
}
|
|
|
|
NonAllocatingAttr::NonAllocatingAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Cond
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::NonAllocating, /*IsLateParsed=*/false)
|
|
, cond(Cond)
|
|
{
|
|
}
|
|
|
|
NonAllocatingAttr::NonAllocatingAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::NonAllocating, /*IsLateParsed=*/false)
|
|
, cond()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
NonAllocatingAttr *NonAllocatingAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NonAllocatingAttr(C, *this, cond);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NonAllocatingAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((nonallocating";
|
|
if (!getCond())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getCond())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCond()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::nonallocating";
|
|
if (!getCond())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getCond())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCond()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::nonallocating";
|
|
if (!getCond())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getCond())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCond()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NonAllocatingAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nonallocating";
|
|
case 1:
|
|
return "nonallocating";
|
|
case 2:
|
|
return "nonallocating";
|
|
}
|
|
}
|
|
|
|
|
|
// NonBlockingAttr implementation
|
|
|
|
NonBlockingAttr *NonBlockingAttr::CreateImplicit(ASTContext &Ctx, Expr * Cond, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NonBlockingAttr(Ctx, CommonInfo, Cond);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NonBlockingAttr *NonBlockingAttr::Create(ASTContext &Ctx, Expr * Cond, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NonBlockingAttr(Ctx, CommonInfo, Cond);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NonBlockingAttr *NonBlockingAttr::CreateImplicit(ASTContext &Ctx, Expr * Cond, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nonblocking:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nonblocking, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_nonblocking:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_nonblocking, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_nonblocking:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_nonblocking, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Cond, I);
|
|
}
|
|
|
|
NonBlockingAttr *NonBlockingAttr::Create(ASTContext &Ctx, Expr * Cond, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nonblocking:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nonblocking, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_nonblocking:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_nonblocking, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_nonblocking:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_nonblocking, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Cond, I);
|
|
}
|
|
|
|
NonBlockingAttr::NonBlockingAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Cond
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::NonBlocking, /*IsLateParsed=*/false)
|
|
, cond(Cond)
|
|
{
|
|
}
|
|
|
|
NonBlockingAttr::NonBlockingAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::NonBlocking, /*IsLateParsed=*/false)
|
|
, cond()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
NonBlockingAttr *NonBlockingAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NonBlockingAttr(C, *this, cond);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NonBlockingAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((nonblocking";
|
|
if (!getCond())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getCond())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCond()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::nonblocking";
|
|
if (!getCond())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getCond())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCond()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::nonblocking";
|
|
if (!getCond())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getCond())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getCond()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NonBlockingAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nonblocking";
|
|
case 1:
|
|
return "nonblocking";
|
|
case 2:
|
|
return "nonblocking";
|
|
}
|
|
}
|
|
|
|
|
|
// NonNullAttr implementation
|
|
|
|
NonNullAttr *NonNullAttr::CreateImplicit(ASTContext &Ctx, ParamIdx *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NonNullAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NonNullAttr *NonNullAttr::Create(ASTContext &Ctx, ParamIdx *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NonNullAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NonNullAttr *NonNullAttr::CreateImplicit(ASTContext &Ctx, ParamIdx *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nonnull:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nonnull, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nonnull:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nonnull, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nonnull:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nonnull, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
NonNullAttr *NonNullAttr::Create(ASTContext &Ctx, ParamIdx *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_nonnull:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_nonnull, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_nonnull:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_nonnull, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_nonnull:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_nonnull, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
NonNullAttr::NonNullAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, ParamIdx *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableParamAttr(Ctx, CommonInfo, attr::NonNull, /*IsLateParsed=*/false, true)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) ParamIdx[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
NonNullAttr::NonNullAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableParamAttr(Ctx, CommonInfo, attr::NonNull, /*IsLateParsed=*/false, true)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
NonNullAttr *NonNullAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NonNullAttr(C, *this, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NonNullAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((nonnull";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val.getSourceIndex();
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::nonnull";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val.getSourceIndex();
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::nonnull";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val.getSourceIndex();
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NonNullAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nonnull";
|
|
case 1:
|
|
return "nonnull";
|
|
case 2:
|
|
return "nonnull";
|
|
}
|
|
}
|
|
|
|
|
|
// NotTailCalledAttr implementation
|
|
|
|
NotTailCalledAttr *NotTailCalledAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NotTailCalledAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NotTailCalledAttr *NotTailCalledAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) NotTailCalledAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
NotTailCalledAttr *NotTailCalledAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_not_tail_called:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_not_tail_called, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_not_tail_called:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_not_tail_called, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_not_tail_called:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_not_tail_called, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
NotTailCalledAttr *NotTailCalledAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_not_tail_called:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_not_tail_called, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_not_tail_called:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_not_tail_called, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_not_tail_called:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_not_tail_called, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
NotTailCalledAttr::NotTailCalledAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::NotTailCalled, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
NotTailCalledAttr *NotTailCalledAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) NotTailCalledAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void NotTailCalledAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((not_tail_called";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::not_tail_called";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::not_tail_called";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *NotTailCalledAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "not_tail_called";
|
|
case 1:
|
|
return "not_tail_called";
|
|
case 2:
|
|
return "not_tail_called";
|
|
}
|
|
}
|
|
|
|
|
|
// OMPAllocateDeclAttr implementation
|
|
|
|
OMPAllocateDeclAttr *OMPAllocateDeclAttr::CreateImplicit(ASTContext &Ctx, OMPAllocateDeclAttr::AllocatorTypeTy AllocatorType, Expr * Allocator, Expr * Alignment, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPAllocateDeclAttr(Ctx, CommonInfo, AllocatorType, Allocator, Alignment);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPAllocateDeclAttr *OMPAllocateDeclAttr::Create(ASTContext &Ctx, OMPAllocateDeclAttr::AllocatorTypeTy AllocatorType, Expr * Allocator, Expr * Alignment, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPAllocateDeclAttr(Ctx, CommonInfo, AllocatorType, Allocator, Alignment);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPAllocateDeclAttr *OMPAllocateDeclAttr::CreateImplicit(ASTContext &Ctx, OMPAllocateDeclAttr::AllocatorTypeTy AllocatorType, Expr * Allocator, Expr * Alignment, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, AllocatorType, Allocator, Alignment, I);
|
|
}
|
|
|
|
OMPAllocateDeclAttr *OMPAllocateDeclAttr::Create(ASTContext &Ctx, OMPAllocateDeclAttr::AllocatorTypeTy AllocatorType, Expr * Allocator, Expr * Alignment, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, AllocatorType, Allocator, Alignment, I);
|
|
}
|
|
|
|
OMPAllocateDeclAttr::OMPAllocateDeclAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, OMPAllocateDeclAttr::AllocatorTypeTy AllocatorType
|
|
, Expr * Allocator
|
|
, Expr * Alignment
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OMPAllocateDecl, /*IsLateParsed=*/false, false)
|
|
, allocatorType(AllocatorType)
|
|
, allocator(Allocator)
|
|
, alignment(Alignment)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool OMPAllocateDeclAttr::ConvertStrToAllocatorTypeTy(StringRef Val, OMPAllocateDeclAttr::AllocatorTypeTy &Out) {
|
|
std::optional<OMPAllocateDeclAttr::AllocatorTypeTy> R = llvm::StringSwitch<std::optional<OMPAllocateDeclAttr::AllocatorTypeTy>>(Val)
|
|
.Case("omp_null_allocator", OMPAllocateDeclAttr::AllocatorTypeTy::OMPNullMemAlloc)
|
|
.Case("omp_default_mem_alloc", OMPAllocateDeclAttr::AllocatorTypeTy::OMPDefaultMemAlloc)
|
|
.Case("omp_large_cap_mem_alloc", OMPAllocateDeclAttr::AllocatorTypeTy::OMPLargeCapMemAlloc)
|
|
.Case("omp_const_mem_alloc", OMPAllocateDeclAttr::AllocatorTypeTy::OMPConstMemAlloc)
|
|
.Case("omp_high_bw_mem_alloc", OMPAllocateDeclAttr::AllocatorTypeTy::OMPHighBWMemAlloc)
|
|
.Case("omp_low_lat_mem_alloc", OMPAllocateDeclAttr::AllocatorTypeTy::OMPLowLatMemAlloc)
|
|
.Case("omp_cgroup_mem_alloc", OMPAllocateDeclAttr::AllocatorTypeTy::OMPCGroupMemAlloc)
|
|
.Case("omp_pteam_mem_alloc", OMPAllocateDeclAttr::AllocatorTypeTy::OMPPTeamMemAlloc)
|
|
.Case("omp_thread_mem_alloc", OMPAllocateDeclAttr::AllocatorTypeTy::OMPThreadMemAlloc)
|
|
.Case("", OMPAllocateDeclAttr::AllocatorTypeTy::OMPUserDefinedMemAlloc)
|
|
.Default(std::optional<OMPAllocateDeclAttr::AllocatorTypeTy>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *OMPAllocateDeclAttr::ConvertAllocatorTypeTyToStr(OMPAllocateDeclAttr::AllocatorTypeTy Val) {
|
|
switch(Val) {
|
|
case OMPAllocateDeclAttr::AllocatorTypeTy::OMPNullMemAlloc: return "omp_null_allocator";
|
|
case OMPAllocateDeclAttr::AllocatorTypeTy::OMPDefaultMemAlloc: return "omp_default_mem_alloc";
|
|
case OMPAllocateDeclAttr::AllocatorTypeTy::OMPLargeCapMemAlloc: return "omp_large_cap_mem_alloc";
|
|
case OMPAllocateDeclAttr::AllocatorTypeTy::OMPConstMemAlloc: return "omp_const_mem_alloc";
|
|
case OMPAllocateDeclAttr::AllocatorTypeTy::OMPHighBWMemAlloc: return "omp_high_bw_mem_alloc";
|
|
case OMPAllocateDeclAttr::AllocatorTypeTy::OMPLowLatMemAlloc: return "omp_low_lat_mem_alloc";
|
|
case OMPAllocateDeclAttr::AllocatorTypeTy::OMPCGroupMemAlloc: return "omp_cgroup_mem_alloc";
|
|
case OMPAllocateDeclAttr::AllocatorTypeTy::OMPPTeamMemAlloc: return "omp_pteam_mem_alloc";
|
|
case OMPAllocateDeclAttr::AllocatorTypeTy::OMPThreadMemAlloc: return "omp_thread_mem_alloc";
|
|
case OMPAllocateDeclAttr::AllocatorTypeTy::OMPUserDefinedMemAlloc: return "";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
|
|
|
|
|
|
|
|
OMPAllocateDeclAttr *OMPAllocateDeclAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OMPAllocateDeclAttr(C, *this, allocatorType, allocator, alignment);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OMPAllocateDeclAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *OMPAllocateDeclAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// OMPAssumeAttr implementation
|
|
|
|
OMPAssumeAttr *OMPAssumeAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Assumption, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPAssumeAttr(Ctx, CommonInfo, Assumption);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPAssumeAttr *OMPAssumeAttr::Create(ASTContext &Ctx, llvm::StringRef Assumption, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPAssumeAttr(Ctx, CommonInfo, Assumption);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPAssumeAttr *OMPAssumeAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Assumption, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Assumption, I);
|
|
}
|
|
|
|
OMPAssumeAttr *OMPAssumeAttr::Create(ASTContext &Ctx, llvm::StringRef Assumption, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Assumption, I);
|
|
}
|
|
|
|
OMPAssumeAttr::OMPAssumeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Assumption
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OMPAssume, /*IsLateParsed=*/false, true)
|
|
, assumptionLength(Assumption.size()),assumption(new (Ctx, 1) char[assumptionLength])
|
|
{
|
|
if (!Assumption.empty())
|
|
std::memcpy(assumption, Assumption.data(), assumptionLength);
|
|
}
|
|
|
|
|
|
|
|
OMPAssumeAttr *OMPAssumeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OMPAssumeAttr(C, *this, getAssumption());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OMPAssumeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[omp::assume";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAssumption() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OMPAssumeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "assume";
|
|
}
|
|
}
|
|
|
|
|
|
// OMPCaptureKindAttr implementation
|
|
|
|
OMPCaptureKindAttr *OMPCaptureKindAttr::CreateImplicit(ASTContext &Ctx, unsigned CaptureKindVal, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPCaptureKindAttr(Ctx, CommonInfo, CaptureKindVal);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPCaptureKindAttr *OMPCaptureKindAttr::Create(ASTContext &Ctx, unsigned CaptureKindVal, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPCaptureKindAttr(Ctx, CommonInfo, CaptureKindVal);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPCaptureKindAttr *OMPCaptureKindAttr::CreateImplicit(ASTContext &Ctx, unsigned CaptureKindVal, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, CaptureKindVal, I);
|
|
}
|
|
|
|
OMPCaptureKindAttr *OMPCaptureKindAttr::Create(ASTContext &Ctx, unsigned CaptureKindVal, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, CaptureKindVal, I);
|
|
}
|
|
|
|
OMPCaptureKindAttr::OMPCaptureKindAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned CaptureKindVal
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::OMPCaptureKind, /*IsLateParsed=*/false)
|
|
, captureKindVal(CaptureKindVal)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
OMPCaptureKindAttr *OMPCaptureKindAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OMPCaptureKindAttr(C, *this, captureKindVal);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OMPCaptureKindAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *OMPCaptureKindAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// OMPCaptureNoInitAttr implementation
|
|
|
|
OMPCaptureNoInitAttr *OMPCaptureNoInitAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPCaptureNoInitAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPCaptureNoInitAttr *OMPCaptureNoInitAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPCaptureNoInitAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPCaptureNoInitAttr *OMPCaptureNoInitAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OMPCaptureNoInitAttr *OMPCaptureNoInitAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OMPCaptureNoInitAttr::OMPCaptureNoInitAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OMPCaptureNoInit, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
OMPCaptureNoInitAttr *OMPCaptureNoInitAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OMPCaptureNoInitAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OMPCaptureNoInitAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *OMPCaptureNoInitAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// OMPDeclareSimdDeclAttr implementation
|
|
|
|
OMPDeclareSimdDeclAttr *OMPDeclareSimdDeclAttr::CreateImplicit(ASTContext &Ctx, OMPDeclareSimdDeclAttr::BranchStateTy BranchState, Expr * Simdlen, Expr * *Uniforms, unsigned UniformsSize, Expr * *Aligneds, unsigned AlignedsSize, Expr * *Alignments, unsigned AlignmentsSize, Expr * *Linears, unsigned LinearsSize, unsigned *Modifiers, unsigned ModifiersSize, Expr * *Steps, unsigned StepsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPDeclareSimdDeclAttr(Ctx, CommonInfo, BranchState, Simdlen, Uniforms, UniformsSize, Aligneds, AlignedsSize, Alignments, AlignmentsSize, Linears, LinearsSize, Modifiers, ModifiersSize, Steps, StepsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPDeclareSimdDeclAttr *OMPDeclareSimdDeclAttr::Create(ASTContext &Ctx, OMPDeclareSimdDeclAttr::BranchStateTy BranchState, Expr * Simdlen, Expr * *Uniforms, unsigned UniformsSize, Expr * *Aligneds, unsigned AlignedsSize, Expr * *Alignments, unsigned AlignmentsSize, Expr * *Linears, unsigned LinearsSize, unsigned *Modifiers, unsigned ModifiersSize, Expr * *Steps, unsigned StepsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPDeclareSimdDeclAttr(Ctx, CommonInfo, BranchState, Simdlen, Uniforms, UniformsSize, Aligneds, AlignedsSize, Alignments, AlignmentsSize, Linears, LinearsSize, Modifiers, ModifiersSize, Steps, StepsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPDeclareSimdDeclAttr *OMPDeclareSimdDeclAttr::CreateImplicit(ASTContext &Ctx, OMPDeclareSimdDeclAttr::BranchStateTy BranchState, Expr * Simdlen, Expr * *Uniforms, unsigned UniformsSize, Expr * *Aligneds, unsigned AlignedsSize, Expr * *Alignments, unsigned AlignmentsSize, Expr * *Linears, unsigned LinearsSize, unsigned *Modifiers, unsigned ModifiersSize, Expr * *Steps, unsigned StepsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Pragma, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, BranchState, Simdlen, Uniforms, UniformsSize, Aligneds, AlignedsSize, Alignments, AlignmentsSize, Linears, LinearsSize, Modifiers, ModifiersSize, Steps, StepsSize, I);
|
|
}
|
|
|
|
OMPDeclareSimdDeclAttr *OMPDeclareSimdDeclAttr::Create(ASTContext &Ctx, OMPDeclareSimdDeclAttr::BranchStateTy BranchState, Expr * Simdlen, Expr * *Uniforms, unsigned UniformsSize, Expr * *Aligneds, unsigned AlignedsSize, Expr * *Alignments, unsigned AlignmentsSize, Expr * *Linears, unsigned LinearsSize, unsigned *Modifiers, unsigned ModifiersSize, Expr * *Steps, unsigned StepsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Pragma, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, BranchState, Simdlen, Uniforms, UniformsSize, Aligneds, AlignedsSize, Alignments, AlignmentsSize, Linears, LinearsSize, Modifiers, ModifiersSize, Steps, StepsSize, I);
|
|
}
|
|
|
|
OMPDeclareSimdDeclAttr::OMPDeclareSimdDeclAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, OMPDeclareSimdDeclAttr::BranchStateTy BranchState
|
|
, Expr * Simdlen
|
|
, Expr * *Uniforms, unsigned UniformsSize
|
|
, Expr * *Aligneds, unsigned AlignedsSize
|
|
, Expr * *Alignments, unsigned AlignmentsSize
|
|
, Expr * *Linears, unsigned LinearsSize
|
|
, unsigned *Modifiers, unsigned ModifiersSize
|
|
, Expr * *Steps, unsigned StepsSize
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::OMPDeclareSimdDecl, /*IsLateParsed=*/false)
|
|
, branchState(BranchState)
|
|
, simdlen(Simdlen)
|
|
, uniforms_Size(UniformsSize), uniforms_(new (Ctx, 16) Expr *[uniforms_Size])
|
|
, aligneds_Size(AlignedsSize), aligneds_(new (Ctx, 16) Expr *[aligneds_Size])
|
|
, alignments_Size(AlignmentsSize), alignments_(new (Ctx, 16) Expr *[alignments_Size])
|
|
, linears_Size(LinearsSize), linears_(new (Ctx, 16) Expr *[linears_Size])
|
|
, modifiers_Size(ModifiersSize), modifiers_(new (Ctx, 16) unsigned[modifiers_Size])
|
|
, steps_Size(StepsSize), steps_(new (Ctx, 16) Expr *[steps_Size])
|
|
{
|
|
std::copy(Uniforms, Uniforms + uniforms_Size, uniforms_);
|
|
std::copy(Aligneds, Aligneds + aligneds_Size, aligneds_);
|
|
std::copy(Alignments, Alignments + alignments_Size, alignments_);
|
|
std::copy(Linears, Linears + linears_Size, linears_);
|
|
std::copy(Modifiers, Modifiers + modifiers_Size, modifiers_);
|
|
std::copy(Steps, Steps + steps_Size, steps_);
|
|
}
|
|
|
|
OMPDeclareSimdDeclAttr::OMPDeclareSimdDeclAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, OMPDeclareSimdDeclAttr::BranchStateTy BranchState
|
|
, Expr * Simdlen
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::OMPDeclareSimdDecl, /*IsLateParsed=*/false)
|
|
, branchState(BranchState)
|
|
, simdlen(Simdlen)
|
|
, uniforms_Size(0), uniforms_(nullptr)
|
|
, aligneds_Size(0), aligneds_(nullptr)
|
|
, alignments_Size(0), alignments_(nullptr)
|
|
, linears_Size(0), linears_(nullptr)
|
|
, modifiers_Size(0), modifiers_(nullptr)
|
|
, steps_Size(0), steps_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool OMPDeclareSimdDeclAttr::ConvertStrToBranchStateTy(StringRef Val, OMPDeclareSimdDeclAttr::BranchStateTy &Out) {
|
|
std::optional<OMPDeclareSimdDeclAttr::BranchStateTy> R = llvm::StringSwitch<std::optional<OMPDeclareSimdDeclAttr::BranchStateTy>>(Val)
|
|
.Case("", OMPDeclareSimdDeclAttr::BranchStateTy::BS_Undefined)
|
|
.Case("inbranch", OMPDeclareSimdDeclAttr::BranchStateTy::BS_Inbranch)
|
|
.Case("notinbranch", OMPDeclareSimdDeclAttr::BranchStateTy::BS_Notinbranch)
|
|
.Default(std::optional<OMPDeclareSimdDeclAttr::BranchStateTy>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *OMPDeclareSimdDeclAttr::ConvertBranchStateTyToStr(OMPDeclareSimdDeclAttr::BranchStateTy Val) {
|
|
switch(Val) {
|
|
case OMPDeclareSimdDeclAttr::BranchStateTy::BS_Undefined: return "";
|
|
case OMPDeclareSimdDeclAttr::BranchStateTy::BS_Inbranch: return "inbranch";
|
|
case OMPDeclareSimdDeclAttr::BranchStateTy::BS_Notinbranch: return "notinbranch";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OMPDeclareSimdDeclAttr *OMPDeclareSimdDeclAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OMPDeclareSimdDeclAttr(C, *this, branchState, simdlen, uniforms_, uniforms_Size, aligneds_, aligneds_Size, alignments_, alignments_Size, linears_, linears_Size, modifiers_, modifiers_Size, steps_, steps_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OMPDeclareSimdDeclAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "#pragma omp declare simd";
|
|
printPrettyPragma(OS, Policy);
|
|
OS << "\n"; break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OMPDeclareSimdDeclAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "declare simd";
|
|
}
|
|
}
|
|
|
|
|
|
// OMPDeclareTargetDeclAttr implementation
|
|
|
|
OMPDeclareTargetDeclAttr *OMPDeclareTargetDeclAttr::CreateImplicit(ASTContext &Ctx, OMPDeclareTargetDeclAttr::MapTypeTy MapType, OMPDeclareTargetDeclAttr::DevTypeTy DevType, Expr * IndirectExpr, bool Indirect, unsigned Level, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPDeclareTargetDeclAttr(Ctx, CommonInfo, MapType, DevType, IndirectExpr, Indirect, Level);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPDeclareTargetDeclAttr *OMPDeclareTargetDeclAttr::Create(ASTContext &Ctx, OMPDeclareTargetDeclAttr::MapTypeTy MapType, OMPDeclareTargetDeclAttr::DevTypeTy DevType, Expr * IndirectExpr, bool Indirect, unsigned Level, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPDeclareTargetDeclAttr(Ctx, CommonInfo, MapType, DevType, IndirectExpr, Indirect, Level);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPDeclareTargetDeclAttr *OMPDeclareTargetDeclAttr::CreateImplicit(ASTContext &Ctx, OMPDeclareTargetDeclAttr::MapTypeTy MapType, OMPDeclareTargetDeclAttr::DevTypeTy DevType, Expr * IndirectExpr, bool Indirect, unsigned Level, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Pragma, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, MapType, DevType, IndirectExpr, Indirect, Level, I);
|
|
}
|
|
|
|
OMPDeclareTargetDeclAttr *OMPDeclareTargetDeclAttr::Create(ASTContext &Ctx, OMPDeclareTargetDeclAttr::MapTypeTy MapType, OMPDeclareTargetDeclAttr::DevTypeTy DevType, Expr * IndirectExpr, bool Indirect, unsigned Level, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Pragma, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, MapType, DevType, IndirectExpr, Indirect, Level, I);
|
|
}
|
|
|
|
OMPDeclareTargetDeclAttr::OMPDeclareTargetDeclAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, OMPDeclareTargetDeclAttr::MapTypeTy MapType
|
|
, OMPDeclareTargetDeclAttr::DevTypeTy DevType
|
|
, Expr * IndirectExpr
|
|
, bool Indirect
|
|
, unsigned Level
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OMPDeclareTargetDecl, /*IsLateParsed=*/false, false)
|
|
, mapType(MapType)
|
|
, devType(DevType)
|
|
, indirectExpr(IndirectExpr)
|
|
, indirect(Indirect)
|
|
, level(Level)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool OMPDeclareTargetDeclAttr::ConvertStrToMapTypeTy(StringRef Val, OMPDeclareTargetDeclAttr::MapTypeTy &Out) {
|
|
std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> R = llvm::StringSwitch<std::optional<OMPDeclareTargetDeclAttr::MapTypeTy>>(Val)
|
|
.Case("to", OMPDeclareTargetDeclAttr::MapTypeTy::MT_To)
|
|
.Case("enter", OMPDeclareTargetDeclAttr::MapTypeTy::MT_Enter)
|
|
.Case("link", OMPDeclareTargetDeclAttr::MapTypeTy::MT_Link)
|
|
.Default(std::optional<OMPDeclareTargetDeclAttr::MapTypeTy>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *OMPDeclareTargetDeclAttr::ConvertMapTypeTyToStr(OMPDeclareTargetDeclAttr::MapTypeTy Val) {
|
|
switch(Val) {
|
|
case OMPDeclareTargetDeclAttr::MapTypeTy::MT_To: return "to";
|
|
case OMPDeclareTargetDeclAttr::MapTypeTy::MT_Enter: return "enter";
|
|
case OMPDeclareTargetDeclAttr::MapTypeTy::MT_Link: return "link";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
|
|
|
|
bool OMPDeclareTargetDeclAttr::ConvertStrToDevTypeTy(StringRef Val, OMPDeclareTargetDeclAttr::DevTypeTy &Out) {
|
|
std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> R = llvm::StringSwitch<std::optional<OMPDeclareTargetDeclAttr::DevTypeTy>>(Val)
|
|
.Case("host", OMPDeclareTargetDeclAttr::DevTypeTy::DT_Host)
|
|
.Case("nohost", OMPDeclareTargetDeclAttr::DevTypeTy::DT_NoHost)
|
|
.Case("any", OMPDeclareTargetDeclAttr::DevTypeTy::DT_Any)
|
|
.Default(std::optional<OMPDeclareTargetDeclAttr::DevTypeTy>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *OMPDeclareTargetDeclAttr::ConvertDevTypeTyToStr(OMPDeclareTargetDeclAttr::DevTypeTy Val) {
|
|
switch(Val) {
|
|
case OMPDeclareTargetDeclAttr::DevTypeTy::DT_Host: return "host";
|
|
case OMPDeclareTargetDeclAttr::DevTypeTy::DT_NoHost: return "nohost";
|
|
case OMPDeclareTargetDeclAttr::DevTypeTy::DT_Any: return "any";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OMPDeclareTargetDeclAttr *OMPDeclareTargetDeclAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OMPDeclareTargetDeclAttr(C, *this, mapType, devType, indirectExpr, indirect, level);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OMPDeclareTargetDeclAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "#pragma omp declare target";
|
|
printPrettyPragma(OS, Policy);
|
|
OS << "\n"; break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OMPDeclareTargetDeclAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "declare target";
|
|
}
|
|
}
|
|
|
|
|
|
// OMPDeclareVariantAttr implementation
|
|
|
|
OMPDeclareVariantAttr *OMPDeclareVariantAttr::CreateImplicit(ASTContext &Ctx, Expr * VariantFuncRef, OMPTraitInfo * TraitInfos, Expr * *AdjustArgsNothing, unsigned AdjustArgsNothingSize, Expr * *AdjustArgsNeedDevicePtr, unsigned AdjustArgsNeedDevicePtrSize, OMPInteropInfo *AppendArgs, unsigned AppendArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPDeclareVariantAttr(Ctx, CommonInfo, VariantFuncRef, TraitInfos, AdjustArgsNothing, AdjustArgsNothingSize, AdjustArgsNeedDevicePtr, AdjustArgsNeedDevicePtrSize, AppendArgs, AppendArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPDeclareVariantAttr *OMPDeclareVariantAttr::Create(ASTContext &Ctx, Expr * VariantFuncRef, OMPTraitInfo * TraitInfos, Expr * *AdjustArgsNothing, unsigned AdjustArgsNothingSize, Expr * *AdjustArgsNeedDevicePtr, unsigned AdjustArgsNeedDevicePtrSize, OMPInteropInfo *AppendArgs, unsigned AppendArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPDeclareVariantAttr(Ctx, CommonInfo, VariantFuncRef, TraitInfos, AdjustArgsNothing, AdjustArgsNothingSize, AdjustArgsNeedDevicePtr, AdjustArgsNeedDevicePtrSize, AppendArgs, AppendArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPDeclareVariantAttr *OMPDeclareVariantAttr::CreateImplicit(ASTContext &Ctx, Expr * VariantFuncRef, OMPTraitInfo * TraitInfos, Expr * *AdjustArgsNothing, unsigned AdjustArgsNothingSize, Expr * *AdjustArgsNeedDevicePtr, unsigned AdjustArgsNeedDevicePtrSize, OMPInteropInfo *AppendArgs, unsigned AppendArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Pragma, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, VariantFuncRef, TraitInfos, AdjustArgsNothing, AdjustArgsNothingSize, AdjustArgsNeedDevicePtr, AdjustArgsNeedDevicePtrSize, AppendArgs, AppendArgsSize, I);
|
|
}
|
|
|
|
OMPDeclareVariantAttr *OMPDeclareVariantAttr::Create(ASTContext &Ctx, Expr * VariantFuncRef, OMPTraitInfo * TraitInfos, Expr * *AdjustArgsNothing, unsigned AdjustArgsNothingSize, Expr * *AdjustArgsNeedDevicePtr, unsigned AdjustArgsNeedDevicePtrSize, OMPInteropInfo *AppendArgs, unsigned AppendArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Pragma, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, VariantFuncRef, TraitInfos, AdjustArgsNothing, AdjustArgsNothingSize, AdjustArgsNeedDevicePtr, AdjustArgsNeedDevicePtrSize, AppendArgs, AppendArgsSize, I);
|
|
}
|
|
|
|
OMPDeclareVariantAttr::OMPDeclareVariantAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * VariantFuncRef
|
|
, OMPTraitInfo * TraitInfos
|
|
, Expr * *AdjustArgsNothing, unsigned AdjustArgsNothingSize
|
|
, Expr * *AdjustArgsNeedDevicePtr, unsigned AdjustArgsNeedDevicePtrSize
|
|
, OMPInteropInfo *AppendArgs, unsigned AppendArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OMPDeclareVariant, /*IsLateParsed=*/false, true)
|
|
, variantFuncRef(VariantFuncRef)
|
|
, traitInfos(TraitInfos)
|
|
, adjustArgsNothing_Size(AdjustArgsNothingSize), adjustArgsNothing_(new (Ctx, 16) Expr *[adjustArgsNothing_Size])
|
|
, adjustArgsNeedDevicePtr_Size(AdjustArgsNeedDevicePtrSize), adjustArgsNeedDevicePtr_(new (Ctx, 16) Expr *[adjustArgsNeedDevicePtr_Size])
|
|
, appendArgs_Size(AppendArgsSize), appendArgs_(new (Ctx, 16) OMPInteropInfo[appendArgs_Size])
|
|
{
|
|
std::copy(AdjustArgsNothing, AdjustArgsNothing + adjustArgsNothing_Size, adjustArgsNothing_);
|
|
std::copy(AdjustArgsNeedDevicePtr, AdjustArgsNeedDevicePtr + adjustArgsNeedDevicePtr_Size, adjustArgsNeedDevicePtr_);
|
|
std::copy(AppendArgs, AppendArgs + appendArgs_Size, appendArgs_);
|
|
}
|
|
|
|
OMPDeclareVariantAttr::OMPDeclareVariantAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * VariantFuncRef
|
|
, OMPTraitInfo * TraitInfos
|
|
, OMPInteropInfo *AppendArgs, unsigned AppendArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OMPDeclareVariant, /*IsLateParsed=*/false, true)
|
|
, variantFuncRef(VariantFuncRef)
|
|
, traitInfos(TraitInfos)
|
|
, adjustArgsNothing_Size(0), adjustArgsNothing_(nullptr)
|
|
, adjustArgsNeedDevicePtr_Size(0), adjustArgsNeedDevicePtr_(nullptr)
|
|
, appendArgs_Size(AppendArgsSize), appendArgs_(new (Ctx, 16) OMPInteropInfo[appendArgs_Size])
|
|
{
|
|
std::copy(AppendArgs, AppendArgs + appendArgs_Size, appendArgs_);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OMPDeclareVariantAttr *OMPDeclareVariantAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OMPDeclareVariantAttr(C, *this, variantFuncRef, traitInfos, adjustArgsNothing_, adjustArgsNothing_Size, adjustArgsNeedDevicePtr_, adjustArgsNeedDevicePtr_Size, appendArgs_, appendArgs_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OMPDeclareVariantAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "#pragma omp declare variant";
|
|
printPrettyPragma(OS, Policy);
|
|
OS << "\n"; break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OMPDeclareVariantAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "declare variant";
|
|
}
|
|
}
|
|
|
|
|
|
// OMPReferencedVarAttr implementation
|
|
|
|
OMPReferencedVarAttr *OMPReferencedVarAttr::CreateImplicit(ASTContext &Ctx, Expr * Ref, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPReferencedVarAttr(Ctx, CommonInfo, Ref);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPReferencedVarAttr *OMPReferencedVarAttr::Create(ASTContext &Ctx, Expr * Ref, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPReferencedVarAttr(Ctx, CommonInfo, Ref);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPReferencedVarAttr *OMPReferencedVarAttr::CreateImplicit(ASTContext &Ctx, Expr * Ref, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, Ref, I);
|
|
}
|
|
|
|
OMPReferencedVarAttr *OMPReferencedVarAttr::Create(ASTContext &Ctx, Expr * Ref, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, Ref, I);
|
|
}
|
|
|
|
OMPReferencedVarAttr::OMPReferencedVarAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Ref
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::OMPReferencedVar, /*IsLateParsed=*/false)
|
|
, ref(Ref)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
OMPReferencedVarAttr *OMPReferencedVarAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OMPReferencedVarAttr(C, *this, ref);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OMPReferencedVarAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *OMPReferencedVarAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// OMPThreadPrivateDeclAttr implementation
|
|
|
|
OMPThreadPrivateDeclAttr *OMPThreadPrivateDeclAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPThreadPrivateDeclAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPThreadPrivateDeclAttr *OMPThreadPrivateDeclAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OMPThreadPrivateDeclAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OMPThreadPrivateDeclAttr *OMPThreadPrivateDeclAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OMPThreadPrivateDeclAttr *OMPThreadPrivateDeclAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OMPThreadPrivateDeclAttr::OMPThreadPrivateDeclAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OMPThreadPrivateDecl, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
OMPThreadPrivateDeclAttr *OMPThreadPrivateDeclAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OMPThreadPrivateDeclAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OMPThreadPrivateDeclAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *OMPThreadPrivateDeclAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// OSConsumedAttr implementation
|
|
|
|
OSConsumedAttr *OSConsumedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OSConsumedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OSConsumedAttr *OSConsumedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OSConsumedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OSConsumedAttr *OSConsumedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_os_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_os_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_os_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_os_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_os_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_os_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OSConsumedAttr *OSConsumedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_os_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_os_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_os_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_os_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_os_consumed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_os_consumed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OSConsumedAttr::OSConsumedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableParamAttr(Ctx, CommonInfo, attr::OSConsumed, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
OSConsumedAttr *OSConsumedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OSConsumedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OSConsumedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((os_consumed";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::os_consumed";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::os_consumed";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OSConsumedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "os_consumed";
|
|
case 1:
|
|
return "os_consumed";
|
|
case 2:
|
|
return "os_consumed";
|
|
}
|
|
}
|
|
|
|
|
|
// OSConsumesThisAttr implementation
|
|
|
|
OSConsumesThisAttr *OSConsumesThisAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OSConsumesThisAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OSConsumesThisAttr *OSConsumesThisAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OSConsumesThisAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OSConsumesThisAttr *OSConsumesThisAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_os_consumes_this:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_os_consumes_this, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_os_consumes_this:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_os_consumes_this, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_os_consumes_this:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_os_consumes_this, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OSConsumesThisAttr *OSConsumesThisAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_os_consumes_this:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_os_consumes_this, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_os_consumes_this:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_os_consumes_this, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_os_consumes_this:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_os_consumes_this, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OSConsumesThisAttr::OSConsumesThisAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OSConsumesThis, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
OSConsumesThisAttr *OSConsumesThisAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OSConsumesThisAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OSConsumesThisAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((os_consumes_this";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::os_consumes_this";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::os_consumes_this";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OSConsumesThisAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "os_consumes_this";
|
|
case 1:
|
|
return "os_consumes_this";
|
|
case 2:
|
|
return "os_consumes_this";
|
|
}
|
|
}
|
|
|
|
|
|
// OSReturnsNotRetainedAttr implementation
|
|
|
|
OSReturnsNotRetainedAttr *OSReturnsNotRetainedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OSReturnsNotRetainedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OSReturnsNotRetainedAttr *OSReturnsNotRetainedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OSReturnsNotRetainedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OSReturnsNotRetainedAttr *OSReturnsNotRetainedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_os_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_os_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_os_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_os_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_os_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_os_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OSReturnsNotRetainedAttr *OSReturnsNotRetainedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_os_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_os_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_os_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_os_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_os_returns_not_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_os_returns_not_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OSReturnsNotRetainedAttr::OSReturnsNotRetainedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OSReturnsNotRetained, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
OSReturnsNotRetainedAttr *OSReturnsNotRetainedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OSReturnsNotRetainedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OSReturnsNotRetainedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((os_returns_not_retained";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::os_returns_not_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::os_returns_not_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OSReturnsNotRetainedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "os_returns_not_retained";
|
|
case 1:
|
|
return "os_returns_not_retained";
|
|
case 2:
|
|
return "os_returns_not_retained";
|
|
}
|
|
}
|
|
|
|
|
|
// OSReturnsRetainedAttr implementation
|
|
|
|
OSReturnsRetainedAttr *OSReturnsRetainedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OSReturnsRetainedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OSReturnsRetainedAttr *OSReturnsRetainedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OSReturnsRetainedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OSReturnsRetainedAttr *OSReturnsRetainedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_os_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_os_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_os_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_os_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_os_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_os_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OSReturnsRetainedAttr *OSReturnsRetainedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_os_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_os_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_os_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_os_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_os_returns_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_os_returns_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OSReturnsRetainedAttr::OSReturnsRetainedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OSReturnsRetained, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
OSReturnsRetainedAttr *OSReturnsRetainedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OSReturnsRetainedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OSReturnsRetainedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((os_returns_retained";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::os_returns_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::os_returns_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OSReturnsRetainedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "os_returns_retained";
|
|
case 1:
|
|
return "os_returns_retained";
|
|
case 2:
|
|
return "os_returns_retained";
|
|
}
|
|
}
|
|
|
|
|
|
// OSReturnsRetainedOnNonZeroAttr implementation
|
|
|
|
OSReturnsRetainedOnNonZeroAttr *OSReturnsRetainedOnNonZeroAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OSReturnsRetainedOnNonZeroAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OSReturnsRetainedOnNonZeroAttr *OSReturnsRetainedOnNonZeroAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OSReturnsRetainedOnNonZeroAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OSReturnsRetainedOnNonZeroAttr *OSReturnsRetainedOnNonZeroAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_os_returns_retained_on_non_zero:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_os_returns_retained_on_non_zero, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_os_returns_retained_on_non_zero:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_os_returns_retained_on_non_zero, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_os_returns_retained_on_non_zero:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_os_returns_retained_on_non_zero, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OSReturnsRetainedOnNonZeroAttr *OSReturnsRetainedOnNonZeroAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_os_returns_retained_on_non_zero:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_os_returns_retained_on_non_zero, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_os_returns_retained_on_non_zero:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_os_returns_retained_on_non_zero, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_os_returns_retained_on_non_zero:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_os_returns_retained_on_non_zero, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OSReturnsRetainedOnNonZeroAttr::OSReturnsRetainedOnNonZeroAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OSReturnsRetainedOnNonZero, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
OSReturnsRetainedOnNonZeroAttr *OSReturnsRetainedOnNonZeroAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OSReturnsRetainedOnNonZeroAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OSReturnsRetainedOnNonZeroAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((os_returns_retained_on_non_zero";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::os_returns_retained_on_non_zero";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::os_returns_retained_on_non_zero";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OSReturnsRetainedOnNonZeroAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "os_returns_retained_on_non_zero";
|
|
case 1:
|
|
return "os_returns_retained_on_non_zero";
|
|
case 2:
|
|
return "os_returns_retained_on_non_zero";
|
|
}
|
|
}
|
|
|
|
|
|
// OSReturnsRetainedOnZeroAttr implementation
|
|
|
|
OSReturnsRetainedOnZeroAttr *OSReturnsRetainedOnZeroAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OSReturnsRetainedOnZeroAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OSReturnsRetainedOnZeroAttr *OSReturnsRetainedOnZeroAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OSReturnsRetainedOnZeroAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OSReturnsRetainedOnZeroAttr *OSReturnsRetainedOnZeroAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_os_returns_retained_on_zero:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_os_returns_retained_on_zero, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_os_returns_retained_on_zero:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_os_returns_retained_on_zero, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_os_returns_retained_on_zero:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_os_returns_retained_on_zero, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OSReturnsRetainedOnZeroAttr *OSReturnsRetainedOnZeroAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_os_returns_retained_on_zero:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_os_returns_retained_on_zero, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_os_returns_retained_on_zero:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_os_returns_retained_on_zero, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_os_returns_retained_on_zero:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_os_returns_retained_on_zero, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OSReturnsRetainedOnZeroAttr::OSReturnsRetainedOnZeroAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OSReturnsRetainedOnZero, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
OSReturnsRetainedOnZeroAttr *OSReturnsRetainedOnZeroAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OSReturnsRetainedOnZeroAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OSReturnsRetainedOnZeroAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((os_returns_retained_on_zero";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::os_returns_retained_on_zero";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::os_returns_retained_on_zero";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OSReturnsRetainedOnZeroAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "os_returns_retained_on_zero";
|
|
case 1:
|
|
return "os_returns_retained_on_zero";
|
|
case 2:
|
|
return "os_returns_retained_on_zero";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCBoxableAttr implementation
|
|
|
|
ObjCBoxableAttr *ObjCBoxableAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCBoxableAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCBoxableAttr *ObjCBoxableAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCBoxableAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCBoxableAttr *ObjCBoxableAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_boxable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_boxable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_boxable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_boxable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_boxable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_boxable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCBoxableAttr *ObjCBoxableAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_boxable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_boxable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_boxable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_boxable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_boxable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_boxable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCBoxableAttr::ObjCBoxableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::ObjCBoxable, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ObjCBoxableAttr *ObjCBoxableAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCBoxableAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCBoxableAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_boxable";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_boxable";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_boxable";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCBoxableAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_boxable";
|
|
case 1:
|
|
return "objc_boxable";
|
|
case 2:
|
|
return "objc_boxable";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCBridgeAttr implementation
|
|
|
|
ObjCBridgeAttr *ObjCBridgeAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * BridgedType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCBridgeAttr(Ctx, CommonInfo, BridgedType);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCBridgeAttr *ObjCBridgeAttr::Create(ASTContext &Ctx, IdentifierInfo * BridgedType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCBridgeAttr(Ctx, CommonInfo, BridgedType);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCBridgeAttr *ObjCBridgeAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * BridgedType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_bridge:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_bridge, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_bridge:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_bridge, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_bridge:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_bridge, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, BridgedType, I);
|
|
}
|
|
|
|
ObjCBridgeAttr *ObjCBridgeAttr::Create(ASTContext &Ctx, IdentifierInfo * BridgedType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_bridge:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_bridge, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_bridge:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_bridge, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_bridge:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_bridge, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, BridgedType, I);
|
|
}
|
|
|
|
ObjCBridgeAttr::ObjCBridgeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * BridgedType
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCBridge, /*IsLateParsed=*/false, false)
|
|
, bridgedType(BridgedType)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
ObjCBridgeAttr *ObjCBridgeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCBridgeAttr(C, *this, bridgedType);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCBridgeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_bridge";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getBridgedType() ? getBridgedType()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_bridge";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getBridgedType() ? getBridgedType()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_bridge";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getBridgedType() ? getBridgedType()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCBridgeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_bridge";
|
|
case 1:
|
|
return "objc_bridge";
|
|
case 2:
|
|
return "objc_bridge";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCBridgeMutableAttr implementation
|
|
|
|
ObjCBridgeMutableAttr *ObjCBridgeMutableAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * BridgedType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCBridgeMutableAttr(Ctx, CommonInfo, BridgedType);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCBridgeMutableAttr *ObjCBridgeMutableAttr::Create(ASTContext &Ctx, IdentifierInfo * BridgedType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCBridgeMutableAttr(Ctx, CommonInfo, BridgedType);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCBridgeMutableAttr *ObjCBridgeMutableAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * BridgedType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_bridge_mutable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_bridge_mutable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_bridge_mutable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_bridge_mutable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_bridge_mutable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_bridge_mutable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, BridgedType, I);
|
|
}
|
|
|
|
ObjCBridgeMutableAttr *ObjCBridgeMutableAttr::Create(ASTContext &Ctx, IdentifierInfo * BridgedType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_bridge_mutable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_bridge_mutable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_bridge_mutable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_bridge_mutable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_bridge_mutable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_bridge_mutable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, BridgedType, I);
|
|
}
|
|
|
|
ObjCBridgeMutableAttr::ObjCBridgeMutableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * BridgedType
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCBridgeMutable, /*IsLateParsed=*/false, false)
|
|
, bridgedType(BridgedType)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
ObjCBridgeMutableAttr *ObjCBridgeMutableAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCBridgeMutableAttr(C, *this, bridgedType);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCBridgeMutableAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_bridge_mutable";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getBridgedType() ? getBridgedType()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_bridge_mutable";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getBridgedType() ? getBridgedType()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_bridge_mutable";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getBridgedType() ? getBridgedType()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCBridgeMutableAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_bridge_mutable";
|
|
case 1:
|
|
return "objc_bridge_mutable";
|
|
case 2:
|
|
return "objc_bridge_mutable";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCBridgeRelatedAttr implementation
|
|
|
|
ObjCBridgeRelatedAttr *ObjCBridgeRelatedAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * RelatedClass, IdentifierInfo * ClassMethod, IdentifierInfo * InstanceMethod, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCBridgeRelatedAttr(Ctx, CommonInfo, RelatedClass, ClassMethod, InstanceMethod);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCBridgeRelatedAttr *ObjCBridgeRelatedAttr::Create(ASTContext &Ctx, IdentifierInfo * RelatedClass, IdentifierInfo * ClassMethod, IdentifierInfo * InstanceMethod, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCBridgeRelatedAttr(Ctx, CommonInfo, RelatedClass, ClassMethod, InstanceMethod);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCBridgeRelatedAttr *ObjCBridgeRelatedAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * RelatedClass, IdentifierInfo * ClassMethod, IdentifierInfo * InstanceMethod, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_bridge_related:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_bridge_related, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_bridge_related:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_bridge_related, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_bridge_related:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_bridge_related, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, RelatedClass, ClassMethod, InstanceMethod, I);
|
|
}
|
|
|
|
ObjCBridgeRelatedAttr *ObjCBridgeRelatedAttr::Create(ASTContext &Ctx, IdentifierInfo * RelatedClass, IdentifierInfo * ClassMethod, IdentifierInfo * InstanceMethod, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_bridge_related:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_bridge_related, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_bridge_related:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_bridge_related, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_bridge_related:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_bridge_related, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, RelatedClass, ClassMethod, InstanceMethod, I);
|
|
}
|
|
|
|
ObjCBridgeRelatedAttr::ObjCBridgeRelatedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * RelatedClass
|
|
, IdentifierInfo * ClassMethod
|
|
, IdentifierInfo * InstanceMethod
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCBridgeRelated, /*IsLateParsed=*/false, false)
|
|
, relatedClass(RelatedClass)
|
|
, classMethod(ClassMethod)
|
|
, instanceMethod(InstanceMethod)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ObjCBridgeRelatedAttr *ObjCBridgeRelatedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCBridgeRelatedAttr(C, *this, relatedClass, classMethod, instanceMethod);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCBridgeRelatedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_bridge_related";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getRelatedClass() ? getRelatedClass()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getClassMethod() ? getClassMethod()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getInstanceMethod() ? getInstanceMethod()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_bridge_related";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getRelatedClass() ? getRelatedClass()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getClassMethod() ? getClassMethod()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getInstanceMethod() ? getInstanceMethod()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_bridge_related";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getRelatedClass() ? getRelatedClass()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getClassMethod() ? getClassMethod()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getInstanceMethod() ? getInstanceMethod()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCBridgeRelatedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_bridge_related";
|
|
case 1:
|
|
return "objc_bridge_related";
|
|
case 2:
|
|
return "objc_bridge_related";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCClassStubAttr implementation
|
|
|
|
ObjCClassStubAttr *ObjCClassStubAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCClassStubAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCClassStubAttr *ObjCClassStubAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCClassStubAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCClassStubAttr *ObjCClassStubAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_class_stub:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_class_stub, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_class_stub:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_class_stub, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_class_stub:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_class_stub, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCClassStubAttr *ObjCClassStubAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_class_stub:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_class_stub, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_class_stub:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_class_stub, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_class_stub:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_class_stub, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCClassStubAttr::ObjCClassStubAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::ObjCClassStub, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ObjCClassStubAttr *ObjCClassStubAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCClassStubAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCClassStubAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_class_stub";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_class_stub";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_class_stub";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCClassStubAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_class_stub";
|
|
case 1:
|
|
return "objc_class_stub";
|
|
case 2:
|
|
return "objc_class_stub";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCDesignatedInitializerAttr implementation
|
|
|
|
ObjCDesignatedInitializerAttr *ObjCDesignatedInitializerAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCDesignatedInitializerAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCDesignatedInitializerAttr *ObjCDesignatedInitializerAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCDesignatedInitializerAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCDesignatedInitializerAttr *ObjCDesignatedInitializerAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_designated_initializer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_designated_initializer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_designated_initializer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_designated_initializer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_designated_initializer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_designated_initializer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCDesignatedInitializerAttr *ObjCDesignatedInitializerAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_designated_initializer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_designated_initializer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_designated_initializer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_designated_initializer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_designated_initializer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_designated_initializer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCDesignatedInitializerAttr::ObjCDesignatedInitializerAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::ObjCDesignatedInitializer, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ObjCDesignatedInitializerAttr *ObjCDesignatedInitializerAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCDesignatedInitializerAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCDesignatedInitializerAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_designated_initializer";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_designated_initializer";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_designated_initializer";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCDesignatedInitializerAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_designated_initializer";
|
|
case 1:
|
|
return "objc_designated_initializer";
|
|
case 2:
|
|
return "objc_designated_initializer";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCDirectAttr implementation
|
|
|
|
ObjCDirectAttr *ObjCDirectAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCDirectAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCDirectAttr *ObjCDirectAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCDirectAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCDirectAttr *ObjCDirectAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_direct:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_direct, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_direct:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_direct, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_direct:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_direct, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCDirectAttr *ObjCDirectAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_direct:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_direct, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_direct:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_direct, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_direct:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_direct, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCDirectAttr::ObjCDirectAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::ObjCDirect, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ObjCDirectAttr *ObjCDirectAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCDirectAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCDirectAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_direct";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_direct";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_direct";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCDirectAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_direct";
|
|
case 1:
|
|
return "objc_direct";
|
|
case 2:
|
|
return "objc_direct";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCDirectMembersAttr implementation
|
|
|
|
ObjCDirectMembersAttr *ObjCDirectMembersAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCDirectMembersAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCDirectMembersAttr *ObjCDirectMembersAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCDirectMembersAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCDirectMembersAttr *ObjCDirectMembersAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_direct_members:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_direct_members, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_direct_members:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_direct_members, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_direct_members:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_direct_members, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCDirectMembersAttr *ObjCDirectMembersAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_direct_members:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_direct_members, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_direct_members:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_direct_members, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_direct_members:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_direct_members, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCDirectMembersAttr::ObjCDirectMembersAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::ObjCDirectMembers, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ObjCDirectMembersAttr *ObjCDirectMembersAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCDirectMembersAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCDirectMembersAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_direct_members";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_direct_members";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_direct_members";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCDirectMembersAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_direct_members";
|
|
case 1:
|
|
return "objc_direct_members";
|
|
case 2:
|
|
return "objc_direct_members";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCExceptionAttr implementation
|
|
|
|
ObjCExceptionAttr *ObjCExceptionAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCExceptionAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCExceptionAttr *ObjCExceptionAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCExceptionAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCExceptionAttr *ObjCExceptionAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_exception:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_exception, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_exception:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_exception, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_exception:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_exception, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCExceptionAttr *ObjCExceptionAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_exception:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_exception, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_exception:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_exception, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_exception:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_exception, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCExceptionAttr::ObjCExceptionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCException, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ObjCExceptionAttr *ObjCExceptionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCExceptionAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCExceptionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_exception";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_exception";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_exception";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCExceptionAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_exception";
|
|
case 1:
|
|
return "objc_exception";
|
|
case 2:
|
|
return "objc_exception";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCExplicitProtocolImplAttr implementation
|
|
|
|
ObjCExplicitProtocolImplAttr *ObjCExplicitProtocolImplAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCExplicitProtocolImplAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCExplicitProtocolImplAttr *ObjCExplicitProtocolImplAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCExplicitProtocolImplAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCExplicitProtocolImplAttr *ObjCExplicitProtocolImplAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_protocol_requires_explicit_implementation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_protocol_requires_explicit_implementation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_protocol_requires_explicit_implementation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_protocol_requires_explicit_implementation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_protocol_requires_explicit_implementation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_protocol_requires_explicit_implementation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCExplicitProtocolImplAttr *ObjCExplicitProtocolImplAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_protocol_requires_explicit_implementation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_protocol_requires_explicit_implementation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_protocol_requires_explicit_implementation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_protocol_requires_explicit_implementation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_protocol_requires_explicit_implementation:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_protocol_requires_explicit_implementation, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCExplicitProtocolImplAttr::ObjCExplicitProtocolImplAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCExplicitProtocolImpl, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ObjCExplicitProtocolImplAttr *ObjCExplicitProtocolImplAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCExplicitProtocolImplAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCExplicitProtocolImplAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_protocol_requires_explicit_implementation";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_protocol_requires_explicit_implementation";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_protocol_requires_explicit_implementation";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCExplicitProtocolImplAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_protocol_requires_explicit_implementation";
|
|
case 1:
|
|
return "objc_protocol_requires_explicit_implementation";
|
|
case 2:
|
|
return "objc_protocol_requires_explicit_implementation";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCExternallyRetainedAttr implementation
|
|
|
|
ObjCExternallyRetainedAttr *ObjCExternallyRetainedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCExternallyRetainedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCExternallyRetainedAttr *ObjCExternallyRetainedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCExternallyRetainedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCExternallyRetainedAttr *ObjCExternallyRetainedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_externally_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_externally_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_externally_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_externally_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_externally_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_externally_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCExternallyRetainedAttr *ObjCExternallyRetainedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_externally_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_externally_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_externally_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_externally_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_externally_retained:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_externally_retained, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCExternallyRetainedAttr::ObjCExternallyRetainedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCExternallyRetained, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ObjCExternallyRetainedAttr *ObjCExternallyRetainedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCExternallyRetainedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCExternallyRetainedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_externally_retained";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_externally_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_externally_retained";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCExternallyRetainedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_externally_retained";
|
|
case 1:
|
|
return "objc_externally_retained";
|
|
case 2:
|
|
return "objc_externally_retained";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCGCAttr implementation
|
|
|
|
ObjCGCAttr *ObjCGCAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * Kind, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCGCAttr(Ctx, CommonInfo, Kind);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCGCAttr *ObjCGCAttr::Create(ASTContext &Ctx, IdentifierInfo * Kind, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCGCAttr(Ctx, CommonInfo, Kind);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCGCAttr *ObjCGCAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * Kind, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_gc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_gc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_gc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_gc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_gc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_gc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Kind, I);
|
|
}
|
|
|
|
ObjCGCAttr *ObjCGCAttr::Create(ASTContext &Ctx, IdentifierInfo * Kind, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_gc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_gc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_gc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_gc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_gc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_gc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Kind, I);
|
|
}
|
|
|
|
ObjCGCAttr::ObjCGCAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * Kind
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ObjCGC, /*IsLateParsed=*/false)
|
|
, kind(Kind)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
ObjCGCAttr *ObjCGCAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCGCAttr(C, *this, kind);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCGCAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_gc";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getKind() ? getKind()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_gc";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getKind() ? getKind()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_gc";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getKind() ? getKind()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCGCAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_gc";
|
|
case 1:
|
|
return "objc_gc";
|
|
case 2:
|
|
return "objc_gc";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCIndependentClassAttr implementation
|
|
|
|
ObjCIndependentClassAttr *ObjCIndependentClassAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCIndependentClassAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCIndependentClassAttr *ObjCIndependentClassAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCIndependentClassAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCIndependentClassAttr *ObjCIndependentClassAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_independent_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_independent_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_independent_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_independent_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_independent_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_independent_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCIndependentClassAttr *ObjCIndependentClassAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_independent_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_independent_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_independent_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_independent_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_independent_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_independent_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCIndependentClassAttr::ObjCIndependentClassAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCIndependentClass, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ObjCIndependentClassAttr *ObjCIndependentClassAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCIndependentClassAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCIndependentClassAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_independent_class";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_independent_class";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_independent_class";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCIndependentClassAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_independent_class";
|
|
case 1:
|
|
return "objc_independent_class";
|
|
case 2:
|
|
return "objc_independent_class";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCInertUnsafeUnretainedAttr implementation
|
|
|
|
ObjCInertUnsafeUnretainedAttr *ObjCInertUnsafeUnretainedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCInertUnsafeUnretainedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCInertUnsafeUnretainedAttr *ObjCInertUnsafeUnretainedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCInertUnsafeUnretainedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCInertUnsafeUnretainedAttr *ObjCInertUnsafeUnretainedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCInertUnsafeUnretainedAttr *ObjCInertUnsafeUnretainedAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCInertUnsafeUnretainedAttr::ObjCInertUnsafeUnretainedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ObjCInertUnsafeUnretained, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ObjCInertUnsafeUnretainedAttr *ObjCInertUnsafeUnretainedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCInertUnsafeUnretainedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCInertUnsafeUnretainedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__unsafe_unretained";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCInertUnsafeUnretainedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__unsafe_unretained";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCKindOfAttr implementation
|
|
|
|
ObjCKindOfAttr *ObjCKindOfAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCKindOfAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCKindOfAttr *ObjCKindOfAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCKindOfAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCKindOfAttr *ObjCKindOfAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCKindOfAttr *ObjCKindOfAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCKindOfAttr::ObjCKindOfAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::ObjCKindOf, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ObjCKindOfAttr *ObjCKindOfAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCKindOfAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCKindOfAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__kindof";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCKindOfAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__kindof";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCMethodFamilyAttr implementation
|
|
|
|
ObjCMethodFamilyAttr *ObjCMethodFamilyAttr::CreateImplicit(ASTContext &Ctx, ObjCMethodFamilyAttr::FamilyKind Family, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCMethodFamilyAttr(Ctx, CommonInfo, Family);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCMethodFamilyAttr *ObjCMethodFamilyAttr::Create(ASTContext &Ctx, ObjCMethodFamilyAttr::FamilyKind Family, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCMethodFamilyAttr(Ctx, CommonInfo, Family);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCMethodFamilyAttr *ObjCMethodFamilyAttr::CreateImplicit(ASTContext &Ctx, ObjCMethodFamilyAttr::FamilyKind Family, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_method_family:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_method_family, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_method_family:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_method_family, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_method_family:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_method_family, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Family, I);
|
|
}
|
|
|
|
ObjCMethodFamilyAttr *ObjCMethodFamilyAttr::Create(ASTContext &Ctx, ObjCMethodFamilyAttr::FamilyKind Family, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_method_family:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_method_family, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_method_family:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_method_family, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_method_family:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_method_family, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Family, I);
|
|
}
|
|
|
|
ObjCMethodFamilyAttr::ObjCMethodFamilyAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, ObjCMethodFamilyAttr::FamilyKind Family
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCMethodFamily, /*IsLateParsed=*/false, false)
|
|
, family(Family)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool ObjCMethodFamilyAttr::ConvertStrToFamilyKind(StringRef Val, ObjCMethodFamilyAttr::FamilyKind &Out) {
|
|
std::optional<ObjCMethodFamilyAttr::FamilyKind> R = llvm::StringSwitch<std::optional<ObjCMethodFamilyAttr::FamilyKind>>(Val)
|
|
.Case("none", ObjCMethodFamilyAttr::FamilyKind::OMF_None)
|
|
.Case("alloc", ObjCMethodFamilyAttr::FamilyKind::OMF_alloc)
|
|
.Case("copy", ObjCMethodFamilyAttr::FamilyKind::OMF_copy)
|
|
.Case("init", ObjCMethodFamilyAttr::FamilyKind::OMF_init)
|
|
.Case("mutableCopy", ObjCMethodFamilyAttr::FamilyKind::OMF_mutableCopy)
|
|
.Case("new", ObjCMethodFamilyAttr::FamilyKind::OMF_new)
|
|
.Default(std::optional<ObjCMethodFamilyAttr::FamilyKind>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *ObjCMethodFamilyAttr::ConvertFamilyKindToStr(ObjCMethodFamilyAttr::FamilyKind Val) {
|
|
switch(Val) {
|
|
case ObjCMethodFamilyAttr::FamilyKind::OMF_None: return "none";
|
|
case ObjCMethodFamilyAttr::FamilyKind::OMF_alloc: return "alloc";
|
|
case ObjCMethodFamilyAttr::FamilyKind::OMF_copy: return "copy";
|
|
case ObjCMethodFamilyAttr::FamilyKind::OMF_init: return "init";
|
|
case ObjCMethodFamilyAttr::FamilyKind::OMF_mutableCopy: return "mutableCopy";
|
|
case ObjCMethodFamilyAttr::FamilyKind::OMF_new: return "new";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
ObjCMethodFamilyAttr *ObjCMethodFamilyAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCMethodFamilyAttr(C, *this, family);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCMethodFamilyAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_method_family";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ObjCMethodFamilyAttr::ConvertFamilyKindToStr(getFamily()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_method_family";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ObjCMethodFamilyAttr::ConvertFamilyKindToStr(getFamily()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_method_family";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ObjCMethodFamilyAttr::ConvertFamilyKindToStr(getFamily()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCMethodFamilyAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_method_family";
|
|
case 1:
|
|
return "objc_method_family";
|
|
case 2:
|
|
return "objc_method_family";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCNSObjectAttr implementation
|
|
|
|
ObjCNSObjectAttr *ObjCNSObjectAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCNSObjectAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCNSObjectAttr *ObjCNSObjectAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCNSObjectAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCNSObjectAttr *ObjCNSObjectAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_NSObject:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_NSObject, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_NSObject:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_NSObject, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_NSObject:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_NSObject, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCNSObjectAttr *ObjCNSObjectAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_NSObject:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_NSObject, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_NSObject:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_NSObject, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_NSObject:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_NSObject, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCNSObjectAttr::ObjCNSObjectAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCNSObject, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ObjCNSObjectAttr *ObjCNSObjectAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCNSObjectAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCNSObjectAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((NSObject";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::NSObject";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::NSObject";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCNSObjectAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "NSObject";
|
|
case 1:
|
|
return "NSObject";
|
|
case 2:
|
|
return "NSObject";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCNonLazyClassAttr implementation
|
|
|
|
ObjCNonLazyClassAttr *ObjCNonLazyClassAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCNonLazyClassAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCNonLazyClassAttr *ObjCNonLazyClassAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCNonLazyClassAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCNonLazyClassAttr *ObjCNonLazyClassAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_nonlazy_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_nonlazy_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_nonlazy_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_nonlazy_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_nonlazy_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_nonlazy_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCNonLazyClassAttr *ObjCNonLazyClassAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_nonlazy_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_nonlazy_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_nonlazy_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_nonlazy_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_nonlazy_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_nonlazy_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCNonLazyClassAttr::ObjCNonLazyClassAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::ObjCNonLazyClass, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ObjCNonLazyClassAttr *ObjCNonLazyClassAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCNonLazyClassAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCNonLazyClassAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_nonlazy_class";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_nonlazy_class";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_nonlazy_class";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCNonLazyClassAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_nonlazy_class";
|
|
case 1:
|
|
return "objc_nonlazy_class";
|
|
case 2:
|
|
return "objc_nonlazy_class";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCNonRuntimeProtocolAttr implementation
|
|
|
|
ObjCNonRuntimeProtocolAttr *ObjCNonRuntimeProtocolAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCNonRuntimeProtocolAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCNonRuntimeProtocolAttr *ObjCNonRuntimeProtocolAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCNonRuntimeProtocolAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCNonRuntimeProtocolAttr *ObjCNonRuntimeProtocolAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_non_runtime_protocol:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_non_runtime_protocol, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_non_runtime_protocol:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_non_runtime_protocol, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_non_runtime_protocol:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_non_runtime_protocol, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCNonRuntimeProtocolAttr *ObjCNonRuntimeProtocolAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_non_runtime_protocol:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_non_runtime_protocol, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_non_runtime_protocol:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_non_runtime_protocol, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_non_runtime_protocol:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_non_runtime_protocol, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCNonRuntimeProtocolAttr::ObjCNonRuntimeProtocolAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::ObjCNonRuntimeProtocol, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ObjCNonRuntimeProtocolAttr *ObjCNonRuntimeProtocolAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCNonRuntimeProtocolAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCNonRuntimeProtocolAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_non_runtime_protocol";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_non_runtime_protocol";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_non_runtime_protocol";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCNonRuntimeProtocolAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_non_runtime_protocol";
|
|
case 1:
|
|
return "objc_non_runtime_protocol";
|
|
case 2:
|
|
return "objc_non_runtime_protocol";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCOwnershipAttr implementation
|
|
|
|
ObjCOwnershipAttr *ObjCOwnershipAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * Kind, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCOwnershipAttr(Ctx, CommonInfo, Kind);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCOwnershipAttr *ObjCOwnershipAttr::Create(ASTContext &Ctx, IdentifierInfo * Kind, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCOwnershipAttr(Ctx, CommonInfo, Kind);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCOwnershipAttr *ObjCOwnershipAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * Kind, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_ownership:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_ownership, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_ownership:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_ownership, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_ownership:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_ownership, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Kind, I);
|
|
}
|
|
|
|
ObjCOwnershipAttr *ObjCOwnershipAttr::Create(ASTContext &Ctx, IdentifierInfo * Kind, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_ownership:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_ownership, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_ownership:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_ownership, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_ownership:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_ownership, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Kind, I);
|
|
}
|
|
|
|
ObjCOwnershipAttr::ObjCOwnershipAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * Kind
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCOwnership, /*IsLateParsed=*/false, false)
|
|
, kind(Kind)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
ObjCOwnershipAttr *ObjCOwnershipAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCOwnershipAttr(C, *this, kind);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCOwnershipAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_ownership";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getKind() ? getKind()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_ownership";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getKind() ? getKind()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_ownership";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getKind() ? getKind()->getName() : "") << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCOwnershipAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_ownership";
|
|
case 1:
|
|
return "objc_ownership";
|
|
case 2:
|
|
return "objc_ownership";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCPreciseLifetimeAttr implementation
|
|
|
|
ObjCPreciseLifetimeAttr *ObjCPreciseLifetimeAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCPreciseLifetimeAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCPreciseLifetimeAttr *ObjCPreciseLifetimeAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCPreciseLifetimeAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCPreciseLifetimeAttr *ObjCPreciseLifetimeAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_precise_lifetime:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_precise_lifetime, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_precise_lifetime:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_precise_lifetime, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_precise_lifetime:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_precise_lifetime, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCPreciseLifetimeAttr *ObjCPreciseLifetimeAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_precise_lifetime:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_precise_lifetime, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_precise_lifetime:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_precise_lifetime, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_precise_lifetime:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_precise_lifetime, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCPreciseLifetimeAttr::ObjCPreciseLifetimeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCPreciseLifetime, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ObjCPreciseLifetimeAttr *ObjCPreciseLifetimeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCPreciseLifetimeAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCPreciseLifetimeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_precise_lifetime";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_precise_lifetime";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_precise_lifetime";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCPreciseLifetimeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_precise_lifetime";
|
|
case 1:
|
|
return "objc_precise_lifetime";
|
|
case 2:
|
|
return "objc_precise_lifetime";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCRequiresPropertyDefsAttr implementation
|
|
|
|
ObjCRequiresPropertyDefsAttr *ObjCRequiresPropertyDefsAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCRequiresPropertyDefsAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCRequiresPropertyDefsAttr *ObjCRequiresPropertyDefsAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCRequiresPropertyDefsAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCRequiresPropertyDefsAttr *ObjCRequiresPropertyDefsAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_requires_property_definitions:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_requires_property_definitions, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_requires_property_definitions:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_requires_property_definitions, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_requires_property_definitions:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_requires_property_definitions, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCRequiresPropertyDefsAttr *ObjCRequiresPropertyDefsAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_requires_property_definitions:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_requires_property_definitions, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_requires_property_definitions:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_requires_property_definitions, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_requires_property_definitions:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_requires_property_definitions, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCRequiresPropertyDefsAttr::ObjCRequiresPropertyDefsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCRequiresPropertyDefs, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ObjCRequiresPropertyDefsAttr *ObjCRequiresPropertyDefsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCRequiresPropertyDefsAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCRequiresPropertyDefsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_requires_property_definitions";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_requires_property_definitions";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_requires_property_definitions";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCRequiresPropertyDefsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_requires_property_definitions";
|
|
case 1:
|
|
return "objc_requires_property_definitions";
|
|
case 2:
|
|
return "objc_requires_property_definitions";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCRequiresSuperAttr implementation
|
|
|
|
ObjCRequiresSuperAttr *ObjCRequiresSuperAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCRequiresSuperAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCRequiresSuperAttr *ObjCRequiresSuperAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCRequiresSuperAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCRequiresSuperAttr *ObjCRequiresSuperAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_requires_super:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_requires_super, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_requires_super:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_requires_super, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_requires_super:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_requires_super, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCRequiresSuperAttr *ObjCRequiresSuperAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_requires_super:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_requires_super, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_requires_super:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_requires_super, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_requires_super:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_requires_super, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCRequiresSuperAttr::ObjCRequiresSuperAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCRequiresSuper, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ObjCRequiresSuperAttr *ObjCRequiresSuperAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCRequiresSuperAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCRequiresSuperAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_requires_super";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_requires_super";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_requires_super";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCRequiresSuperAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_requires_super";
|
|
case 1:
|
|
return "objc_requires_super";
|
|
case 2:
|
|
return "objc_requires_super";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCReturnsInnerPointerAttr implementation
|
|
|
|
ObjCReturnsInnerPointerAttr *ObjCReturnsInnerPointerAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCReturnsInnerPointerAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCReturnsInnerPointerAttr *ObjCReturnsInnerPointerAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCReturnsInnerPointerAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCReturnsInnerPointerAttr *ObjCReturnsInnerPointerAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_returns_inner_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_returns_inner_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_returns_inner_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_returns_inner_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_returns_inner_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_returns_inner_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCReturnsInnerPointerAttr *ObjCReturnsInnerPointerAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_returns_inner_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_returns_inner_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_returns_inner_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_returns_inner_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_returns_inner_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_returns_inner_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCReturnsInnerPointerAttr::ObjCReturnsInnerPointerAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCReturnsInnerPointer, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ObjCReturnsInnerPointerAttr *ObjCReturnsInnerPointerAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCReturnsInnerPointerAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCReturnsInnerPointerAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_returns_inner_pointer";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_returns_inner_pointer";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_returns_inner_pointer";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCReturnsInnerPointerAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_returns_inner_pointer";
|
|
case 1:
|
|
return "objc_returns_inner_pointer";
|
|
case 2:
|
|
return "objc_returns_inner_pointer";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCRootClassAttr implementation
|
|
|
|
ObjCRootClassAttr *ObjCRootClassAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCRootClassAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCRootClassAttr *ObjCRootClassAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCRootClassAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCRootClassAttr *ObjCRootClassAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_root_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_root_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_root_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_root_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_root_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_root_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCRootClassAttr *ObjCRootClassAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_root_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_root_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_root_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_root_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_root_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_root_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCRootClassAttr::ObjCRootClassAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCRootClass, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ObjCRootClassAttr *ObjCRootClassAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCRootClassAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCRootClassAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_root_class";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_root_class";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_root_class";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCRootClassAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_root_class";
|
|
case 1:
|
|
return "objc_root_class";
|
|
case 2:
|
|
return "objc_root_class";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCRuntimeNameAttr implementation
|
|
|
|
ObjCRuntimeNameAttr *ObjCRuntimeNameAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef MetadataName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCRuntimeNameAttr(Ctx, CommonInfo, MetadataName);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCRuntimeNameAttr *ObjCRuntimeNameAttr::Create(ASTContext &Ctx, llvm::StringRef MetadataName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCRuntimeNameAttr(Ctx, CommonInfo, MetadataName);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCRuntimeNameAttr *ObjCRuntimeNameAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef MetadataName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_runtime_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_runtime_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_runtime_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_runtime_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_runtime_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_runtime_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, MetadataName, I);
|
|
}
|
|
|
|
ObjCRuntimeNameAttr *ObjCRuntimeNameAttr::Create(ASTContext &Ctx, llvm::StringRef MetadataName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_runtime_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_runtime_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_runtime_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_runtime_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_runtime_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_runtime_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, MetadataName, I);
|
|
}
|
|
|
|
ObjCRuntimeNameAttr::ObjCRuntimeNameAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef MetadataName
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::ObjCRuntimeName, /*IsLateParsed=*/false)
|
|
, metadataNameLength(MetadataName.size()),metadataName(new (Ctx, 1) char[metadataNameLength])
|
|
{
|
|
if (!MetadataName.empty())
|
|
std::memcpy(metadataName, MetadataName.data(), metadataNameLength);
|
|
}
|
|
|
|
|
|
|
|
ObjCRuntimeNameAttr *ObjCRuntimeNameAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCRuntimeNameAttr(C, *this, getMetadataName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCRuntimeNameAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_runtime_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMetadataName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_runtime_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMetadataName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_runtime_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMetadataName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCRuntimeNameAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_runtime_name";
|
|
case 1:
|
|
return "objc_runtime_name";
|
|
case 2:
|
|
return "objc_runtime_name";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCRuntimeVisibleAttr implementation
|
|
|
|
ObjCRuntimeVisibleAttr *ObjCRuntimeVisibleAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCRuntimeVisibleAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCRuntimeVisibleAttr *ObjCRuntimeVisibleAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCRuntimeVisibleAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCRuntimeVisibleAttr *ObjCRuntimeVisibleAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_runtime_visible:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_runtime_visible, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_runtime_visible:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_runtime_visible, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_runtime_visible:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_runtime_visible, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCRuntimeVisibleAttr *ObjCRuntimeVisibleAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_runtime_visible:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_runtime_visible, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_runtime_visible:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_runtime_visible, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_runtime_visible:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_runtime_visible, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCRuntimeVisibleAttr::ObjCRuntimeVisibleAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::ObjCRuntimeVisible, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ObjCRuntimeVisibleAttr *ObjCRuntimeVisibleAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCRuntimeVisibleAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCRuntimeVisibleAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_runtime_visible";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_runtime_visible";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_runtime_visible";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCRuntimeVisibleAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_runtime_visible";
|
|
case 1:
|
|
return "objc_runtime_visible";
|
|
case 2:
|
|
return "objc_runtime_visible";
|
|
}
|
|
}
|
|
|
|
|
|
// ObjCSubclassingRestrictedAttr implementation
|
|
|
|
ObjCSubclassingRestrictedAttr *ObjCSubclassingRestrictedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCSubclassingRestrictedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCSubclassingRestrictedAttr *ObjCSubclassingRestrictedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ObjCSubclassingRestrictedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ObjCSubclassingRestrictedAttr *ObjCSubclassingRestrictedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_subclassing_restricted:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_subclassing_restricted, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_subclassing_restricted:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_subclassing_restricted, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_subclassing_restricted:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_subclassing_restricted, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ObjCSubclassingRestrictedAttr *ObjCSubclassingRestrictedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_objc_subclassing_restricted:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_objc_subclassing_restricted, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_objc_subclassing_restricted:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_objc_subclassing_restricted, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_objc_subclassing_restricted:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_objc_subclassing_restricted, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ObjCSubclassingRestrictedAttr::ObjCSubclassingRestrictedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ObjCSubclassingRestricted, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ObjCSubclassingRestrictedAttr *ObjCSubclassingRestrictedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ObjCSubclassingRestrictedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ObjCSubclassingRestrictedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((objc_subclassing_restricted";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::objc_subclassing_restricted";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::objc_subclassing_restricted";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ObjCSubclassingRestrictedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "objc_subclassing_restricted";
|
|
case 1:
|
|
return "objc_subclassing_restricted";
|
|
case 2:
|
|
return "objc_subclassing_restricted";
|
|
}
|
|
}
|
|
|
|
|
|
// OpenCLAccessAttr implementation
|
|
|
|
OpenCLAccessAttr *OpenCLAccessAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLAccessAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLAccessAttr *OpenCLAccessAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLAccessAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
OpenCLAccessAttr *OpenCLAccessAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_read_only:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_read_only, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_write_only:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_write_only, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_read_write:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_read_write, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OpenCLAccessAttr *OpenCLAccessAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_read_only:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_read_only, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_write_only:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_write_only, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_read_write:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_read_write, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OpenCLAccessAttr::OpenCLAccessAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::OpenCLAccess, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
OpenCLAccessAttr::Spelling OpenCLAccessAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Keyword_read_only;
|
|
case 1: return Keyword_read_only;
|
|
case 2: return Keyword_write_only;
|
|
case 3: return Keyword_write_only;
|
|
case 4: return Keyword_read_write;
|
|
case 5: return Keyword_read_write;
|
|
}
|
|
}
|
|
OpenCLAccessAttr *OpenCLAccessAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OpenCLAccessAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OpenCLAccessAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__read_only";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "read_only";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__write_only";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "write_only";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "__read_write";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "read_write";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OpenCLAccessAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__read_only";
|
|
case 1:
|
|
return "read_only";
|
|
case 2:
|
|
return "__write_only";
|
|
case 3:
|
|
return "write_only";
|
|
case 4:
|
|
return "__read_write";
|
|
case 5:
|
|
return "read_write";
|
|
}
|
|
}
|
|
|
|
|
|
// OpenCLConstantAddressSpaceAttr implementation
|
|
|
|
OpenCLConstantAddressSpaceAttr *OpenCLConstantAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLConstantAddressSpaceAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLConstantAddressSpaceAttr *OpenCLConstantAddressSpaceAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLConstantAddressSpaceAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
OpenCLConstantAddressSpaceAttr *OpenCLConstantAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_constant:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_constant, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_opencl_constant:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_constant, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_constant:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_constant, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_constant:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_constant, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OpenCLConstantAddressSpaceAttr *OpenCLConstantAddressSpaceAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_constant:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_constant, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_opencl_constant:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_constant, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_constant:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_constant, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_constant:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_constant, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OpenCLConstantAddressSpaceAttr::OpenCLConstantAddressSpaceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::OpenCLConstantAddressSpace, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
OpenCLConstantAddressSpaceAttr::Spelling OpenCLConstantAddressSpaceAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Keyword_constant;
|
|
case 1: return Keyword_constant;
|
|
case 2: return GNU_opencl_constant;
|
|
case 3: return CXX11_clang_opencl_constant;
|
|
case 4: return C23_clang_opencl_constant;
|
|
}
|
|
}
|
|
OpenCLConstantAddressSpaceAttr *OpenCLConstantAddressSpaceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OpenCLConstantAddressSpaceAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OpenCLConstantAddressSpaceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__constant";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "constant";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((opencl_constant";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::opencl_constant";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[clang::opencl_constant";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OpenCLConstantAddressSpaceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__constant";
|
|
case 1:
|
|
return "constant";
|
|
case 2:
|
|
return "opencl_constant";
|
|
case 3:
|
|
return "opencl_constant";
|
|
case 4:
|
|
return "opencl_constant";
|
|
}
|
|
}
|
|
|
|
|
|
// OpenCLGenericAddressSpaceAttr implementation
|
|
|
|
OpenCLGenericAddressSpaceAttr *OpenCLGenericAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLGenericAddressSpaceAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLGenericAddressSpaceAttr *OpenCLGenericAddressSpaceAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLGenericAddressSpaceAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
OpenCLGenericAddressSpaceAttr *OpenCLGenericAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_generic:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_generic, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_opencl_generic:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_generic, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_generic:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_generic, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_generic:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_generic, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OpenCLGenericAddressSpaceAttr *OpenCLGenericAddressSpaceAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_generic:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_generic, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_opencl_generic:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_generic, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_generic:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_generic, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_generic:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_generic, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OpenCLGenericAddressSpaceAttr::OpenCLGenericAddressSpaceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::OpenCLGenericAddressSpace, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
OpenCLGenericAddressSpaceAttr::Spelling OpenCLGenericAddressSpaceAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Keyword_generic;
|
|
case 1: return Keyword_generic;
|
|
case 2: return GNU_opencl_generic;
|
|
case 3: return CXX11_clang_opencl_generic;
|
|
case 4: return C23_clang_opencl_generic;
|
|
}
|
|
}
|
|
OpenCLGenericAddressSpaceAttr *OpenCLGenericAddressSpaceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OpenCLGenericAddressSpaceAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OpenCLGenericAddressSpaceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__generic";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "generic";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((opencl_generic";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::opencl_generic";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[clang::opencl_generic";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OpenCLGenericAddressSpaceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__generic";
|
|
case 1:
|
|
return "generic";
|
|
case 2:
|
|
return "opencl_generic";
|
|
case 3:
|
|
return "opencl_generic";
|
|
case 4:
|
|
return "opencl_generic";
|
|
}
|
|
}
|
|
|
|
|
|
// OpenCLGlobalAddressSpaceAttr implementation
|
|
|
|
OpenCLGlobalAddressSpaceAttr *OpenCLGlobalAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLGlobalAddressSpaceAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLGlobalAddressSpaceAttr *OpenCLGlobalAddressSpaceAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLGlobalAddressSpaceAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
OpenCLGlobalAddressSpaceAttr *OpenCLGlobalAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_global:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_global, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_opencl_global:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_global, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_global:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_global, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_global:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_global, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OpenCLGlobalAddressSpaceAttr *OpenCLGlobalAddressSpaceAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_global:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_global, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_opencl_global:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_global, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_global:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_global, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_global:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_global, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OpenCLGlobalAddressSpaceAttr::OpenCLGlobalAddressSpaceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::OpenCLGlobalAddressSpace, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
OpenCLGlobalAddressSpaceAttr::Spelling OpenCLGlobalAddressSpaceAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Keyword_global;
|
|
case 1: return Keyword_global;
|
|
case 2: return GNU_opencl_global;
|
|
case 3: return CXX11_clang_opencl_global;
|
|
case 4: return C23_clang_opencl_global;
|
|
}
|
|
}
|
|
OpenCLGlobalAddressSpaceAttr *OpenCLGlobalAddressSpaceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OpenCLGlobalAddressSpaceAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OpenCLGlobalAddressSpaceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__global";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "global";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((opencl_global";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::opencl_global";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[clang::opencl_global";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OpenCLGlobalAddressSpaceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__global";
|
|
case 1:
|
|
return "global";
|
|
case 2:
|
|
return "opencl_global";
|
|
case 3:
|
|
return "opencl_global";
|
|
case 4:
|
|
return "opencl_global";
|
|
}
|
|
}
|
|
|
|
|
|
// OpenCLGlobalDeviceAddressSpaceAttr implementation
|
|
|
|
OpenCLGlobalDeviceAddressSpaceAttr *OpenCLGlobalDeviceAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLGlobalDeviceAddressSpaceAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLGlobalDeviceAddressSpaceAttr *OpenCLGlobalDeviceAddressSpaceAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLGlobalDeviceAddressSpaceAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLGlobalDeviceAddressSpaceAttr *OpenCLGlobalDeviceAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_opencl_global_device:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_global_device, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_global_device:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_global_device, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_global_device:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_global_device, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OpenCLGlobalDeviceAddressSpaceAttr *OpenCLGlobalDeviceAddressSpaceAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_opencl_global_device:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_global_device, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_global_device:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_global_device, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_global_device:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_global_device, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OpenCLGlobalDeviceAddressSpaceAttr::OpenCLGlobalDeviceAddressSpaceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::OpenCLGlobalDeviceAddressSpace, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
OpenCLGlobalDeviceAddressSpaceAttr *OpenCLGlobalDeviceAddressSpaceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OpenCLGlobalDeviceAddressSpaceAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OpenCLGlobalDeviceAddressSpaceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((opencl_global_device";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::opencl_global_device";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::opencl_global_device";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OpenCLGlobalDeviceAddressSpaceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "opencl_global_device";
|
|
case 1:
|
|
return "opencl_global_device";
|
|
case 2:
|
|
return "opencl_global_device";
|
|
}
|
|
}
|
|
|
|
|
|
// OpenCLGlobalHostAddressSpaceAttr implementation
|
|
|
|
OpenCLGlobalHostAddressSpaceAttr *OpenCLGlobalHostAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLGlobalHostAddressSpaceAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLGlobalHostAddressSpaceAttr *OpenCLGlobalHostAddressSpaceAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLGlobalHostAddressSpaceAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLGlobalHostAddressSpaceAttr *OpenCLGlobalHostAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_opencl_global_host:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_global_host, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_global_host:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_global_host, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_global_host:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_global_host, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OpenCLGlobalHostAddressSpaceAttr *OpenCLGlobalHostAddressSpaceAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_opencl_global_host:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_global_host, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_global_host:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_global_host, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_global_host:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_global_host, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OpenCLGlobalHostAddressSpaceAttr::OpenCLGlobalHostAddressSpaceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::OpenCLGlobalHostAddressSpace, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
OpenCLGlobalHostAddressSpaceAttr *OpenCLGlobalHostAddressSpaceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OpenCLGlobalHostAddressSpaceAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OpenCLGlobalHostAddressSpaceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((opencl_global_host";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::opencl_global_host";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::opencl_global_host";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OpenCLGlobalHostAddressSpaceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "opencl_global_host";
|
|
case 1:
|
|
return "opencl_global_host";
|
|
case 2:
|
|
return "opencl_global_host";
|
|
}
|
|
}
|
|
|
|
|
|
// OpenCLIntelReqdSubGroupSizeAttr implementation
|
|
|
|
OpenCLIntelReqdSubGroupSizeAttr *OpenCLIntelReqdSubGroupSizeAttr::CreateImplicit(ASTContext &Ctx, unsigned SubGroupSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLIntelReqdSubGroupSizeAttr(Ctx, CommonInfo, SubGroupSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLIntelReqdSubGroupSizeAttr *OpenCLIntelReqdSubGroupSizeAttr::Create(ASTContext &Ctx, unsigned SubGroupSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLIntelReqdSubGroupSizeAttr(Ctx, CommonInfo, SubGroupSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLIntelReqdSubGroupSizeAttr *OpenCLIntelReqdSubGroupSizeAttr::CreateImplicit(ASTContext &Ctx, unsigned SubGroupSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, SubGroupSize, I);
|
|
}
|
|
|
|
OpenCLIntelReqdSubGroupSizeAttr *OpenCLIntelReqdSubGroupSizeAttr::Create(ASTContext &Ctx, unsigned SubGroupSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, SubGroupSize, I);
|
|
}
|
|
|
|
OpenCLIntelReqdSubGroupSizeAttr::OpenCLIntelReqdSubGroupSizeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned SubGroupSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OpenCLIntelReqdSubGroupSize, /*IsLateParsed=*/false, false)
|
|
, subGroupSize(SubGroupSize)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
OpenCLIntelReqdSubGroupSizeAttr *OpenCLIntelReqdSubGroupSizeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OpenCLIntelReqdSubGroupSizeAttr(C, *this, subGroupSize);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OpenCLIntelReqdSubGroupSizeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((intel_reqd_sub_group_size";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getSubGroupSize() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OpenCLIntelReqdSubGroupSizeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "intel_reqd_sub_group_size";
|
|
}
|
|
}
|
|
|
|
|
|
// OpenCLKernelAttr implementation
|
|
|
|
OpenCLKernelAttr *OpenCLKernelAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLKernelAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLKernelAttr *OpenCLKernelAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLKernelAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLKernelAttr *OpenCLKernelAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OpenCLKernelAttr *OpenCLKernelAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OpenCLKernelAttr::OpenCLKernelAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OpenCLKernel, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
OpenCLKernelAttr *OpenCLKernelAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OpenCLKernelAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OpenCLKernelAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__kernel";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "kernel";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OpenCLKernelAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__kernel";
|
|
case 1:
|
|
return "kernel";
|
|
}
|
|
}
|
|
|
|
|
|
// OpenCLLocalAddressSpaceAttr implementation
|
|
|
|
OpenCLLocalAddressSpaceAttr *OpenCLLocalAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLLocalAddressSpaceAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLLocalAddressSpaceAttr *OpenCLLocalAddressSpaceAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLLocalAddressSpaceAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
OpenCLLocalAddressSpaceAttr *OpenCLLocalAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_local:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_local, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_opencl_local:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_local, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_local:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_local, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_local:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_local, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OpenCLLocalAddressSpaceAttr *OpenCLLocalAddressSpaceAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_local:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_local, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_opencl_local:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_local, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_local:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_local, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_local:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_local, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OpenCLLocalAddressSpaceAttr::OpenCLLocalAddressSpaceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::OpenCLLocalAddressSpace, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
OpenCLLocalAddressSpaceAttr::Spelling OpenCLLocalAddressSpaceAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Keyword_local;
|
|
case 1: return Keyword_local;
|
|
case 2: return GNU_opencl_local;
|
|
case 3: return CXX11_clang_opencl_local;
|
|
case 4: return C23_clang_opencl_local;
|
|
}
|
|
}
|
|
OpenCLLocalAddressSpaceAttr *OpenCLLocalAddressSpaceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OpenCLLocalAddressSpaceAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OpenCLLocalAddressSpaceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__local";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "local";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((opencl_local";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::opencl_local";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[clang::opencl_local";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OpenCLLocalAddressSpaceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__local";
|
|
case 1:
|
|
return "local";
|
|
case 2:
|
|
return "opencl_local";
|
|
case 3:
|
|
return "opencl_local";
|
|
case 4:
|
|
return "opencl_local";
|
|
}
|
|
}
|
|
|
|
|
|
// OpenCLPrivateAddressSpaceAttr implementation
|
|
|
|
OpenCLPrivateAddressSpaceAttr *OpenCLPrivateAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLPrivateAddressSpaceAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLPrivateAddressSpaceAttr *OpenCLPrivateAddressSpaceAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLPrivateAddressSpaceAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
OpenCLPrivateAddressSpaceAttr *OpenCLPrivateAddressSpaceAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_private:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_private, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_opencl_private:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_private, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_private:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_private, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_private:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_private, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OpenCLPrivateAddressSpaceAttr *OpenCLPrivateAddressSpaceAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Keyword_private:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_private, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_opencl_private:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_opencl_private, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_opencl_private:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_opencl_private, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_opencl_private:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_opencl_private, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OpenCLPrivateAddressSpaceAttr::OpenCLPrivateAddressSpaceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::OpenCLPrivateAddressSpace, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
OpenCLPrivateAddressSpaceAttr::Spelling OpenCLPrivateAddressSpaceAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Keyword_private;
|
|
case 1: return Keyword_private;
|
|
case 2: return GNU_opencl_private;
|
|
case 3: return CXX11_clang_opencl_private;
|
|
case 4: return C23_clang_opencl_private;
|
|
}
|
|
}
|
|
OpenCLPrivateAddressSpaceAttr *OpenCLPrivateAddressSpaceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OpenCLPrivateAddressSpaceAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OpenCLPrivateAddressSpaceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__private";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "private";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((opencl_private";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::opencl_private";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[clang::opencl_private";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OpenCLPrivateAddressSpaceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__private";
|
|
case 1:
|
|
return "private";
|
|
case 2:
|
|
return "opencl_private";
|
|
case 3:
|
|
return "opencl_private";
|
|
case 4:
|
|
return "opencl_private";
|
|
}
|
|
}
|
|
|
|
|
|
// OpenCLUnrollHintAttr implementation
|
|
|
|
OpenCLUnrollHintAttr *OpenCLUnrollHintAttr::CreateImplicit(ASTContext &Ctx, unsigned UnrollHint, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLUnrollHintAttr(Ctx, CommonInfo, UnrollHint);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLUnrollHintAttr *OpenCLUnrollHintAttr::Create(ASTContext &Ctx, unsigned UnrollHint, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OpenCLUnrollHintAttr(Ctx, CommonInfo, UnrollHint);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OpenCLUnrollHintAttr *OpenCLUnrollHintAttr::CreateImplicit(ASTContext &Ctx, unsigned UnrollHint, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, UnrollHint, I);
|
|
}
|
|
|
|
OpenCLUnrollHintAttr *OpenCLUnrollHintAttr::Create(ASTContext &Ctx, unsigned UnrollHint, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, UnrollHint, I);
|
|
}
|
|
|
|
OpenCLUnrollHintAttr::OpenCLUnrollHintAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned UnrollHint
|
|
)
|
|
: StmtAttr(Ctx, CommonInfo, attr::OpenCLUnrollHint, /*IsLateParsed=*/false)
|
|
, unrollHint(UnrollHint)
|
|
{
|
|
}
|
|
|
|
OpenCLUnrollHintAttr::OpenCLUnrollHintAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: StmtAttr(Ctx, CommonInfo, attr::OpenCLUnrollHint, /*IsLateParsed=*/false)
|
|
, unrollHint()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
OpenCLUnrollHintAttr *OpenCLUnrollHintAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OpenCLUnrollHintAttr(C, *this, unrollHint);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OpenCLUnrollHintAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((opencl_unroll_hint";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getUnrollHint() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OpenCLUnrollHintAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "opencl_unroll_hint";
|
|
}
|
|
}
|
|
|
|
|
|
// OptimizeNoneAttr implementation
|
|
|
|
OptimizeNoneAttr *OptimizeNoneAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OptimizeNoneAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OptimizeNoneAttr *OptimizeNoneAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OptimizeNoneAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OptimizeNoneAttr *OptimizeNoneAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_optnone:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_optnone, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_optnone:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_optnone, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_optnone:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_optnone, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OptimizeNoneAttr *OptimizeNoneAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_optnone:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_optnone, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_optnone:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_optnone, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_optnone:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_optnone, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OptimizeNoneAttr::OptimizeNoneAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::OptimizeNone, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
OptimizeNoneAttr *OptimizeNoneAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OptimizeNoneAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OptimizeNoneAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((optnone";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::optnone";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::optnone";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OptimizeNoneAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "optnone";
|
|
case 1:
|
|
return "optnone";
|
|
case 2:
|
|
return "optnone";
|
|
}
|
|
}
|
|
|
|
|
|
// OverloadableAttr implementation
|
|
|
|
OverloadableAttr *OverloadableAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OverloadableAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OverloadableAttr *OverloadableAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OverloadableAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OverloadableAttr *OverloadableAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_overloadable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_overloadable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_overloadable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_overloadable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_overloadable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_overloadable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OverloadableAttr *OverloadableAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_overloadable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_overloadable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_overloadable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_overloadable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_overloadable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_overloadable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OverloadableAttr::OverloadableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::Overloadable, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
OverloadableAttr *OverloadableAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OverloadableAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OverloadableAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((overloadable";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::overloadable";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::overloadable";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OverloadableAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "overloadable";
|
|
case 1:
|
|
return "overloadable";
|
|
case 2:
|
|
return "overloadable";
|
|
}
|
|
}
|
|
|
|
|
|
// OverrideAttr implementation
|
|
|
|
OverrideAttr *OverrideAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OverrideAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OverrideAttr *OverrideAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OverrideAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OverrideAttr *OverrideAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
OverrideAttr *OverrideAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
OverrideAttr::OverrideAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Override, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
OverrideAttr *OverrideAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OverrideAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OverrideAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "override";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OverrideAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "override";
|
|
}
|
|
}
|
|
|
|
|
|
// OwnerAttr implementation
|
|
|
|
OwnerAttr *OwnerAttr::CreateImplicit(ASTContext &Ctx, TypeSourceInfo * DerefType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OwnerAttr(Ctx, CommonInfo, DerefType);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OwnerAttr *OwnerAttr::Create(ASTContext &Ctx, TypeSourceInfo * DerefType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OwnerAttr(Ctx, CommonInfo, DerefType);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OwnerAttr *OwnerAttr::CreateImplicit(ASTContext &Ctx, TypeSourceInfo * DerefType, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, DerefType, I);
|
|
}
|
|
|
|
OwnerAttr *OwnerAttr::Create(ASTContext &Ctx, TypeSourceInfo * DerefType, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, DerefType, I);
|
|
}
|
|
|
|
OwnerAttr::OwnerAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, TypeSourceInfo * DerefType
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Owner, /*IsLateParsed=*/false, false)
|
|
, derefType(DerefType)
|
|
{
|
|
}
|
|
|
|
OwnerAttr::OwnerAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Owner, /*IsLateParsed=*/false, false)
|
|
, derefType()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
OwnerAttr *OwnerAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OwnerAttr(C, *this, derefType);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OwnerAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[gsl::Owner";
|
|
if (!getDerefTypeLoc())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getDerefTypeLoc())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getDerefType().getAsString() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OwnerAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "Owner";
|
|
}
|
|
}
|
|
|
|
|
|
// OwnershipAttr implementation
|
|
|
|
OwnershipAttr *OwnershipAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * Module, ParamIdx *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OwnershipAttr(Ctx, CommonInfo, Module, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
OwnershipAttr *OwnershipAttr::Create(ASTContext &Ctx, IdentifierInfo * Module, ParamIdx *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) OwnershipAttr(Ctx, CommonInfo, Module, Args, ArgsSize);
|
|
return A;
|
|
}
|
|
|
|
OwnershipAttr *OwnershipAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * Module, ParamIdx *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ownership_holds:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ownership_holds, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ownership_holds:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ownership_holds, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ownership_holds:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ownership_holds, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_ownership_returns:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ownership_returns, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ownership_returns:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ownership_returns, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ownership_returns:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ownership_returns, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_ownership_takes:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ownership_takes, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ownership_takes:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ownership_takes, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ownership_takes:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ownership_takes, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Module, Args, ArgsSize, I);
|
|
}
|
|
|
|
OwnershipAttr *OwnershipAttr::Create(ASTContext &Ctx, IdentifierInfo * Module, ParamIdx *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ownership_holds:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ownership_holds, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ownership_holds:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ownership_holds, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ownership_holds:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ownership_holds, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_ownership_returns:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ownership_returns, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ownership_returns:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ownership_returns, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ownership_returns:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ownership_returns, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_ownership_takes:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ownership_takes, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ownership_takes:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ownership_takes, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ownership_takes:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ownership_takes, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Module, Args, ArgsSize, I);
|
|
}
|
|
|
|
OwnershipAttr::OwnershipAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * Module
|
|
, ParamIdx *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Ownership, /*IsLateParsed=*/false, false)
|
|
, module(Module)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) ParamIdx[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
OwnershipAttr::OwnershipAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * Module
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Ownership, /*IsLateParsed=*/false, false)
|
|
, module(Module)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
OwnershipAttr::Spelling OwnershipAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_ownership_holds;
|
|
case 1: return CXX11_clang_ownership_holds;
|
|
case 2: return C23_clang_ownership_holds;
|
|
case 3: return GNU_ownership_returns;
|
|
case 4: return CXX11_clang_ownership_returns;
|
|
case 5: return C23_clang_ownership_returns;
|
|
case 6: return GNU_ownership_takes;
|
|
case 7: return CXX11_clang_ownership_takes;
|
|
case 8: return C23_clang_ownership_takes;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
OwnershipAttr *OwnershipAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) OwnershipAttr(C, *this, module, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void OwnershipAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((ownership_holds";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getModule() ? getModule()->getName() : "") << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val.getSourceIndex();
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::ownership_holds";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getModule() ? getModule()->getName() : "") << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val.getSourceIndex();
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::ownership_holds";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getModule() ? getModule()->getName() : "") << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val.getSourceIndex();
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__attribute__((ownership_returns";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getModule() ? getModule()->getName() : "") << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val.getSourceIndex();
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[clang::ownership_returns";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getModule() ? getModule()->getName() : "") << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val.getSourceIndex();
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[clang::ownership_returns";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getModule() ? getModule()->getName() : "") << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val.getSourceIndex();
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 6 : {
|
|
OS << "__attribute__((ownership_takes";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getModule() ? getModule()->getName() : "") << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val.getSourceIndex();
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 7 : {
|
|
OS << "[[clang::ownership_takes";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getModule() ? getModule()->getName() : "") << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val.getSourceIndex();
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 8 : {
|
|
OS << "[[clang::ownership_takes";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getModule() ? getModule()->getName() : "") << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val.getSourceIndex();
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *OwnershipAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "ownership_holds";
|
|
case 1:
|
|
return "ownership_holds";
|
|
case 2:
|
|
return "ownership_holds";
|
|
case 3:
|
|
return "ownership_returns";
|
|
case 4:
|
|
return "ownership_returns";
|
|
case 5:
|
|
return "ownership_returns";
|
|
case 6:
|
|
return "ownership_takes";
|
|
case 7:
|
|
return "ownership_takes";
|
|
case 8:
|
|
return "ownership_takes";
|
|
}
|
|
}
|
|
|
|
|
|
// PackedAttr implementation
|
|
|
|
PackedAttr *PackedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PackedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PackedAttr *PackedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PackedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PackedAttr *PackedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_packed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_packed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_packed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_packed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_packed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_packed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
PackedAttr *PackedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_packed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_packed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_packed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_packed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_packed:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_packed, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
PackedAttr::PackedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Packed, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
PackedAttr *PackedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PackedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PackedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((packed";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::packed";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::packed";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PackedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "packed";
|
|
case 1:
|
|
return "packed";
|
|
case 2:
|
|
return "packed";
|
|
}
|
|
}
|
|
|
|
|
|
// ParamTypestateAttr implementation
|
|
|
|
ParamTypestateAttr *ParamTypestateAttr::CreateImplicit(ASTContext &Ctx, ParamTypestateAttr::ConsumedState ParamState, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ParamTypestateAttr(Ctx, CommonInfo, ParamState);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ParamTypestateAttr *ParamTypestateAttr::Create(ASTContext &Ctx, ParamTypestateAttr::ConsumedState ParamState, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ParamTypestateAttr(Ctx, CommonInfo, ParamState);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ParamTypestateAttr *ParamTypestateAttr::CreateImplicit(ASTContext &Ctx, ParamTypestateAttr::ConsumedState ParamState, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_param_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_param_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_param_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_param_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, ParamState, I);
|
|
}
|
|
|
|
ParamTypestateAttr *ParamTypestateAttr::Create(ASTContext &Ctx, ParamTypestateAttr::ConsumedState ParamState, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_param_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_param_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_param_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_param_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, ParamState, I);
|
|
}
|
|
|
|
ParamTypestateAttr::ParamTypestateAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, ParamTypestateAttr::ConsumedState ParamState
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ParamTypestate, /*IsLateParsed=*/false, false)
|
|
, paramState(ParamState)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool ParamTypestateAttr::ConvertStrToConsumedState(StringRef Val, ParamTypestateAttr::ConsumedState &Out) {
|
|
std::optional<ParamTypestateAttr::ConsumedState> R = llvm::StringSwitch<std::optional<ParamTypestateAttr::ConsumedState>>(Val)
|
|
.Case("unknown", ParamTypestateAttr::ConsumedState::Unknown)
|
|
.Case("consumed", ParamTypestateAttr::ConsumedState::Consumed)
|
|
.Case("unconsumed", ParamTypestateAttr::ConsumedState::Unconsumed)
|
|
.Default(std::optional<ParamTypestateAttr::ConsumedState>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *ParamTypestateAttr::ConvertConsumedStateToStr(ParamTypestateAttr::ConsumedState Val) {
|
|
switch(Val) {
|
|
case ParamTypestateAttr::ConsumedState::Unknown: return "unknown";
|
|
case ParamTypestateAttr::ConsumedState::Consumed: return "consumed";
|
|
case ParamTypestateAttr::ConsumedState::Unconsumed: return "unconsumed";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
ParamTypestateAttr *ParamTypestateAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ParamTypestateAttr(C, *this, paramState);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ParamTypestateAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((param_typestate";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ParamTypestateAttr::ConvertConsumedStateToStr(getParamState()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::param_typestate";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ParamTypestateAttr::ConvertConsumedStateToStr(getParamState()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ParamTypestateAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "param_typestate";
|
|
case 1:
|
|
return "param_typestate";
|
|
}
|
|
}
|
|
|
|
|
|
// PascalAttr implementation
|
|
|
|
PascalAttr *PascalAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PascalAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PascalAttr *PascalAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PascalAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PascalAttr *PascalAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_pascal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pascal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_pascal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_pascal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_pascal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_pascal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_pascal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_pascal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
PascalAttr *PascalAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_pascal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pascal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_pascal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_pascal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_pascal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_pascal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_pascal:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_pascal, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
PascalAttr::PascalAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Pascal, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
PascalAttr *PascalAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PascalAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PascalAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((pascal";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::pascal";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::pascal";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__pascal";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "_pascal";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PascalAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "pascal";
|
|
case 1:
|
|
return "pascal";
|
|
case 2:
|
|
return "pascal";
|
|
case 3:
|
|
return "__pascal";
|
|
case 4:
|
|
return "_pascal";
|
|
}
|
|
}
|
|
|
|
|
|
// PassObjectSizeAttr implementation
|
|
|
|
PassObjectSizeAttr *PassObjectSizeAttr::CreateImplicit(ASTContext &Ctx, int Type, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PassObjectSizeAttr(Ctx, CommonInfo, Type);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PassObjectSizeAttr *PassObjectSizeAttr::Create(ASTContext &Ctx, int Type, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PassObjectSizeAttr(Ctx, CommonInfo, Type);
|
|
return A;
|
|
}
|
|
|
|
PassObjectSizeAttr *PassObjectSizeAttr::CreateImplicit(ASTContext &Ctx, int Type, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_pass_object_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pass_object_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_pass_object_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_pass_object_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_pass_object_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_pass_object_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_pass_dynamic_object_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pass_dynamic_object_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_pass_dynamic_object_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_pass_dynamic_object_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_pass_dynamic_object_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_pass_dynamic_object_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Type, I);
|
|
}
|
|
|
|
PassObjectSizeAttr *PassObjectSizeAttr::Create(ASTContext &Ctx, int Type, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_pass_object_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pass_object_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_pass_object_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_pass_object_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_pass_object_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_pass_object_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_pass_dynamic_object_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pass_dynamic_object_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_pass_dynamic_object_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_pass_dynamic_object_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_pass_dynamic_object_size:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_pass_dynamic_object_size, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Type, I);
|
|
}
|
|
|
|
PassObjectSizeAttr::PassObjectSizeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, int Type
|
|
)
|
|
: InheritableParamAttr(Ctx, CommonInfo, attr::PassObjectSize, /*IsLateParsed=*/false, false)
|
|
, type(Type)
|
|
{
|
|
}
|
|
|
|
PassObjectSizeAttr::Spelling PassObjectSizeAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_pass_object_size;
|
|
case 1: return CXX11_clang_pass_object_size;
|
|
case 2: return C23_clang_pass_object_size;
|
|
case 3: return GNU_pass_dynamic_object_size;
|
|
case 4: return CXX11_clang_pass_dynamic_object_size;
|
|
case 5: return C23_clang_pass_dynamic_object_size;
|
|
}
|
|
}
|
|
|
|
|
|
PassObjectSizeAttr *PassObjectSizeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PassObjectSizeAttr(C, *this, type);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PassObjectSizeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((pass_object_size";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getType() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::pass_object_size";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getType() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::pass_object_size";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getType() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__attribute__((pass_dynamic_object_size";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getType() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[clang::pass_dynamic_object_size";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getType() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[clang::pass_dynamic_object_size";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getType() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PassObjectSizeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "pass_object_size";
|
|
case 1:
|
|
return "pass_object_size";
|
|
case 2:
|
|
return "pass_object_size";
|
|
case 3:
|
|
return "pass_dynamic_object_size";
|
|
case 4:
|
|
return "pass_dynamic_object_size";
|
|
case 5:
|
|
return "pass_dynamic_object_size";
|
|
}
|
|
}
|
|
|
|
|
|
// PatchableFunctionEntryAttr implementation
|
|
|
|
PatchableFunctionEntryAttr *PatchableFunctionEntryAttr::CreateImplicit(ASTContext &Ctx, unsigned Count, int Offset, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PatchableFunctionEntryAttr(Ctx, CommonInfo, Count, Offset);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PatchableFunctionEntryAttr *PatchableFunctionEntryAttr::Create(ASTContext &Ctx, unsigned Count, int Offset, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PatchableFunctionEntryAttr(Ctx, CommonInfo, Count, Offset);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PatchableFunctionEntryAttr *PatchableFunctionEntryAttr::CreateImplicit(ASTContext &Ctx, unsigned Count, int Offset, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_patchable_function_entry:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_patchable_function_entry, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_patchable_function_entry:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_patchable_function_entry, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_patchable_function_entry:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_patchable_function_entry, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Count, Offset, I);
|
|
}
|
|
|
|
PatchableFunctionEntryAttr *PatchableFunctionEntryAttr::Create(ASTContext &Ctx, unsigned Count, int Offset, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_patchable_function_entry:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_patchable_function_entry, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_patchable_function_entry:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_patchable_function_entry, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_patchable_function_entry:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_patchable_function_entry, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Count, Offset, I);
|
|
}
|
|
|
|
PatchableFunctionEntryAttr::PatchableFunctionEntryAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned Count
|
|
, int Offset
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PatchableFunctionEntry, /*IsLateParsed=*/false, false)
|
|
, count(Count)
|
|
, offset(Offset)
|
|
{
|
|
}
|
|
|
|
PatchableFunctionEntryAttr::PatchableFunctionEntryAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned Count
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PatchableFunctionEntry, /*IsLateParsed=*/false, false)
|
|
, count(Count)
|
|
, offset()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
PatchableFunctionEntryAttr *PatchableFunctionEntryAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PatchableFunctionEntryAttr(C, *this, count, offset);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PatchableFunctionEntryAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((patchable_function_entry";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getCount() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getOffset() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::patchable_function_entry";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getCount() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getOffset() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::patchable_function_entry";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getCount() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getOffset() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PatchableFunctionEntryAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "patchable_function_entry";
|
|
case 1:
|
|
return "patchable_function_entry";
|
|
case 2:
|
|
return "patchable_function_entry";
|
|
}
|
|
}
|
|
|
|
|
|
// PcsAttr implementation
|
|
|
|
PcsAttr *PcsAttr::CreateImplicit(ASTContext &Ctx, PcsAttr::PCSType PCS, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PcsAttr(Ctx, CommonInfo, PCS);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PcsAttr *PcsAttr::Create(ASTContext &Ctx, PcsAttr::PCSType PCS, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PcsAttr(Ctx, CommonInfo, PCS);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PcsAttr *PcsAttr::CreateImplicit(ASTContext &Ctx, PcsAttr::PCSType PCS, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, PCS, I);
|
|
}
|
|
|
|
PcsAttr *PcsAttr::Create(ASTContext &Ctx, PcsAttr::PCSType PCS, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_pcs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_pcs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, PCS, I);
|
|
}
|
|
|
|
PcsAttr::PcsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, PcsAttr::PCSType PCS
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Pcs, /*IsLateParsed=*/false, false)
|
|
, pCS(PCS)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool PcsAttr::ConvertStrToPCSType(StringRef Val, PcsAttr::PCSType &Out) {
|
|
std::optional<PcsAttr::PCSType> R = llvm::StringSwitch<std::optional<PcsAttr::PCSType>>(Val)
|
|
.Case("aapcs", PcsAttr::PCSType::AAPCS)
|
|
.Case("aapcs-vfp", PcsAttr::PCSType::AAPCS_VFP)
|
|
.Default(std::optional<PcsAttr::PCSType>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *PcsAttr::ConvertPCSTypeToStr(PcsAttr::PCSType Val) {
|
|
switch(Val) {
|
|
case PcsAttr::PCSType::AAPCS: return "aapcs";
|
|
case PcsAttr::PCSType::AAPCS_VFP: return "aapcs-vfp";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
PcsAttr *PcsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PcsAttr(C, *this, pCS);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PcsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((pcs";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << PcsAttr::ConvertPCSTypeToStr(getPCS()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::pcs";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << PcsAttr::ConvertPCSTypeToStr(getPCS()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::pcs";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << PcsAttr::ConvertPCSTypeToStr(getPCS()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PcsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "pcs";
|
|
case 1:
|
|
return "pcs";
|
|
case 2:
|
|
return "pcs";
|
|
}
|
|
}
|
|
|
|
|
|
// PointerAttr implementation
|
|
|
|
PointerAttr *PointerAttr::CreateImplicit(ASTContext &Ctx, TypeSourceInfo * DerefType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PointerAttr(Ctx, CommonInfo, DerefType);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PointerAttr *PointerAttr::Create(ASTContext &Ctx, TypeSourceInfo * DerefType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PointerAttr(Ctx, CommonInfo, DerefType);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PointerAttr *PointerAttr::CreateImplicit(ASTContext &Ctx, TypeSourceInfo * DerefType, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, DerefType, I);
|
|
}
|
|
|
|
PointerAttr *PointerAttr::Create(ASTContext &Ctx, TypeSourceInfo * DerefType, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, DerefType, I);
|
|
}
|
|
|
|
PointerAttr::PointerAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, TypeSourceInfo * DerefType
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Pointer, /*IsLateParsed=*/false, false)
|
|
, derefType(DerefType)
|
|
{
|
|
}
|
|
|
|
PointerAttr::PointerAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Pointer, /*IsLateParsed=*/false, false)
|
|
, derefType()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
PointerAttr *PointerAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PointerAttr(C, *this, derefType);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PointerAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[gsl::Pointer";
|
|
if (!getDerefTypeLoc())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getDerefTypeLoc())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getDerefType().getAsString() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PointerAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "Pointer";
|
|
}
|
|
}
|
|
|
|
|
|
// PragmaClangBSSSectionAttr implementation
|
|
|
|
PragmaClangBSSSectionAttr *PragmaClangBSSSectionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PragmaClangBSSSectionAttr(Ctx, CommonInfo, Name);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PragmaClangBSSSectionAttr *PragmaClangBSSSectionAttr::Create(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PragmaClangBSSSectionAttr(Ctx, CommonInfo, Name);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PragmaClangBSSSectionAttr *PragmaClangBSSSectionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, Name, I);
|
|
}
|
|
|
|
PragmaClangBSSSectionAttr *PragmaClangBSSSectionAttr::Create(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, Name, I);
|
|
}
|
|
|
|
PragmaClangBSSSectionAttr::PragmaClangBSSSectionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Name
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PragmaClangBSSSection, /*IsLateParsed=*/false, false)
|
|
, nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
|
|
{
|
|
if (!Name.empty())
|
|
std::memcpy(name, Name.data(), nameLength);
|
|
}
|
|
|
|
|
|
|
|
PragmaClangBSSSectionAttr *PragmaClangBSSSectionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PragmaClangBSSSectionAttr(C, *this, getName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PragmaClangBSSSectionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *PragmaClangBSSSectionAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// PragmaClangDataSectionAttr implementation
|
|
|
|
PragmaClangDataSectionAttr *PragmaClangDataSectionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PragmaClangDataSectionAttr(Ctx, CommonInfo, Name);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PragmaClangDataSectionAttr *PragmaClangDataSectionAttr::Create(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PragmaClangDataSectionAttr(Ctx, CommonInfo, Name);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PragmaClangDataSectionAttr *PragmaClangDataSectionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, Name, I);
|
|
}
|
|
|
|
PragmaClangDataSectionAttr *PragmaClangDataSectionAttr::Create(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, Name, I);
|
|
}
|
|
|
|
PragmaClangDataSectionAttr::PragmaClangDataSectionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Name
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PragmaClangDataSection, /*IsLateParsed=*/false, false)
|
|
, nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
|
|
{
|
|
if (!Name.empty())
|
|
std::memcpy(name, Name.data(), nameLength);
|
|
}
|
|
|
|
|
|
|
|
PragmaClangDataSectionAttr *PragmaClangDataSectionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PragmaClangDataSectionAttr(C, *this, getName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PragmaClangDataSectionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *PragmaClangDataSectionAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// PragmaClangRelroSectionAttr implementation
|
|
|
|
PragmaClangRelroSectionAttr *PragmaClangRelroSectionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PragmaClangRelroSectionAttr(Ctx, CommonInfo, Name);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PragmaClangRelroSectionAttr *PragmaClangRelroSectionAttr::Create(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PragmaClangRelroSectionAttr(Ctx, CommonInfo, Name);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PragmaClangRelroSectionAttr *PragmaClangRelroSectionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, Name, I);
|
|
}
|
|
|
|
PragmaClangRelroSectionAttr *PragmaClangRelroSectionAttr::Create(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, Name, I);
|
|
}
|
|
|
|
PragmaClangRelroSectionAttr::PragmaClangRelroSectionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Name
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PragmaClangRelroSection, /*IsLateParsed=*/false, false)
|
|
, nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
|
|
{
|
|
if (!Name.empty())
|
|
std::memcpy(name, Name.data(), nameLength);
|
|
}
|
|
|
|
|
|
|
|
PragmaClangRelroSectionAttr *PragmaClangRelroSectionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PragmaClangRelroSectionAttr(C, *this, getName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PragmaClangRelroSectionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *PragmaClangRelroSectionAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// PragmaClangRodataSectionAttr implementation
|
|
|
|
PragmaClangRodataSectionAttr *PragmaClangRodataSectionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PragmaClangRodataSectionAttr(Ctx, CommonInfo, Name);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PragmaClangRodataSectionAttr *PragmaClangRodataSectionAttr::Create(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PragmaClangRodataSectionAttr(Ctx, CommonInfo, Name);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PragmaClangRodataSectionAttr *PragmaClangRodataSectionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, Name, I);
|
|
}
|
|
|
|
PragmaClangRodataSectionAttr *PragmaClangRodataSectionAttr::Create(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, Name, I);
|
|
}
|
|
|
|
PragmaClangRodataSectionAttr::PragmaClangRodataSectionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Name
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PragmaClangRodataSection, /*IsLateParsed=*/false, false)
|
|
, nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
|
|
{
|
|
if (!Name.empty())
|
|
std::memcpy(name, Name.data(), nameLength);
|
|
}
|
|
|
|
|
|
|
|
PragmaClangRodataSectionAttr *PragmaClangRodataSectionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PragmaClangRodataSectionAttr(C, *this, getName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PragmaClangRodataSectionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *PragmaClangRodataSectionAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// PragmaClangTextSectionAttr implementation
|
|
|
|
PragmaClangTextSectionAttr *PragmaClangTextSectionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PragmaClangTextSectionAttr(Ctx, CommonInfo, Name);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PragmaClangTextSectionAttr *PragmaClangTextSectionAttr::Create(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PragmaClangTextSectionAttr(Ctx, CommonInfo, Name);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PragmaClangTextSectionAttr *PragmaClangTextSectionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, Name, I);
|
|
}
|
|
|
|
PragmaClangTextSectionAttr *PragmaClangTextSectionAttr::Create(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, Name, I);
|
|
}
|
|
|
|
PragmaClangTextSectionAttr::PragmaClangTextSectionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Name
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PragmaClangTextSection, /*IsLateParsed=*/false, false)
|
|
, nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
|
|
{
|
|
if (!Name.empty())
|
|
std::memcpy(name, Name.data(), nameLength);
|
|
}
|
|
|
|
|
|
|
|
PragmaClangTextSectionAttr *PragmaClangTextSectionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PragmaClangTextSectionAttr(C, *this, getName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PragmaClangTextSectionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *PragmaClangTextSectionAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// PreferredNameAttr implementation
|
|
|
|
PreferredNameAttr *PreferredNameAttr::CreateImplicit(ASTContext &Ctx, TypeSourceInfo * TypedefType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PreferredNameAttr(Ctx, CommonInfo, TypedefType);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PreferredNameAttr *PreferredNameAttr::Create(ASTContext &Ctx, TypeSourceInfo * TypedefType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PreferredNameAttr(Ctx, CommonInfo, TypedefType);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PreferredNameAttr *PreferredNameAttr::CreateImplicit(ASTContext &Ctx, TypeSourceInfo * TypedefType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preferred_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preferred_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preferred_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preferred_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, TypedefType, I);
|
|
}
|
|
|
|
PreferredNameAttr *PreferredNameAttr::Create(ASTContext &Ctx, TypeSourceInfo * TypedefType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preferred_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preferred_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preferred_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preferred_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, TypedefType, I);
|
|
}
|
|
|
|
PreferredNameAttr::PreferredNameAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, TypeSourceInfo * TypedefType
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PreferredName, /*IsLateParsed=*/false, true)
|
|
, typedefType(TypedefType)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
PreferredNameAttr *PreferredNameAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PreferredNameAttr(C, *this, typedefType);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PreferredNameAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((preferred_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getTypedefType().getAsString() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::preferred_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getTypedefType().getAsString() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PreferredNameAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "preferred_name";
|
|
case 1:
|
|
return "preferred_name";
|
|
}
|
|
}
|
|
|
|
|
|
// PreferredTypeAttr implementation
|
|
|
|
PreferredTypeAttr *PreferredTypeAttr::CreateImplicit(ASTContext &Ctx, TypeSourceInfo * Type, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PreferredTypeAttr(Ctx, CommonInfo, Type);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PreferredTypeAttr *PreferredTypeAttr::Create(ASTContext &Ctx, TypeSourceInfo * Type, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PreferredTypeAttr(Ctx, CommonInfo, Type);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PreferredTypeAttr *PreferredTypeAttr::CreateImplicit(ASTContext &Ctx, TypeSourceInfo * Type, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preferred_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preferred_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preferred_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preferred_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_preferred_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_preferred_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Type, I);
|
|
}
|
|
|
|
PreferredTypeAttr *PreferredTypeAttr::Create(ASTContext &Ctx, TypeSourceInfo * Type, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preferred_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preferred_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preferred_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preferred_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_preferred_type:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_preferred_type, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Type, I);
|
|
}
|
|
|
|
PreferredTypeAttr::PreferredTypeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, TypeSourceInfo * Type
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PreferredType, /*IsLateParsed=*/false, false)
|
|
, type(Type)
|
|
{
|
|
}
|
|
|
|
PreferredTypeAttr::PreferredTypeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PreferredType, /*IsLateParsed=*/false, false)
|
|
, type()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
PreferredTypeAttr *PreferredTypeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PreferredTypeAttr(C, *this, type);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PreferredTypeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((preferred_type";
|
|
if (!getTypeLoc())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getTypeLoc())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getType().getAsString() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::preferred_type";
|
|
if (!getTypeLoc())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getTypeLoc())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getType().getAsString() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::preferred_type";
|
|
if (!getTypeLoc())
|
|
++TrailingOmittedArgs;
|
|
if (!(!getTypeLoc())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getType().getAsString() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PreferredTypeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "preferred_type";
|
|
case 1:
|
|
return "preferred_type";
|
|
case 2:
|
|
return "preferred_type";
|
|
}
|
|
}
|
|
|
|
|
|
// PreserveAllAttr implementation
|
|
|
|
PreserveAllAttr *PreserveAllAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PreserveAllAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PreserveAllAttr *PreserveAllAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PreserveAllAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PreserveAllAttr *PreserveAllAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preserve_all:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preserve_all, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preserve_all:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preserve_all, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_preserve_all:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_preserve_all, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
PreserveAllAttr *PreserveAllAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preserve_all:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preserve_all, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preserve_all:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preserve_all, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_preserve_all:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_preserve_all, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
PreserveAllAttr::PreserveAllAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PreserveAll, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
PreserveAllAttr *PreserveAllAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PreserveAllAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PreserveAllAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((preserve_all";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::preserve_all";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::preserve_all";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PreserveAllAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "preserve_all";
|
|
case 1:
|
|
return "preserve_all";
|
|
case 2:
|
|
return "preserve_all";
|
|
}
|
|
}
|
|
|
|
|
|
// PreserveMostAttr implementation
|
|
|
|
PreserveMostAttr *PreserveMostAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PreserveMostAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PreserveMostAttr *PreserveMostAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PreserveMostAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PreserveMostAttr *PreserveMostAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preserve_most:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preserve_most, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preserve_most:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preserve_most, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_preserve_most:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_preserve_most, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
PreserveMostAttr *PreserveMostAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preserve_most:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preserve_most, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preserve_most:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preserve_most, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_preserve_most:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_preserve_most, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
PreserveMostAttr::PreserveMostAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PreserveMost, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
PreserveMostAttr *PreserveMostAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PreserveMostAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PreserveMostAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((preserve_most";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::preserve_most";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::preserve_most";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PreserveMostAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "preserve_most";
|
|
case 1:
|
|
return "preserve_most";
|
|
case 2:
|
|
return "preserve_most";
|
|
}
|
|
}
|
|
|
|
|
|
// PreserveNoneAttr implementation
|
|
|
|
PreserveNoneAttr *PreserveNoneAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PreserveNoneAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PreserveNoneAttr *PreserveNoneAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PreserveNoneAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PreserveNoneAttr *PreserveNoneAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preserve_none:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preserve_none, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preserve_none:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preserve_none, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_preserve_none:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_preserve_none, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
PreserveNoneAttr *PreserveNoneAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_preserve_none:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_preserve_none, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_preserve_none:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_preserve_none, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_preserve_none:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_preserve_none, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
PreserveNoneAttr::PreserveNoneAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PreserveNone, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
PreserveNoneAttr *PreserveNoneAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PreserveNoneAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PreserveNoneAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((preserve_none";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::preserve_none";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::preserve_none";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PreserveNoneAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "preserve_none";
|
|
case 1:
|
|
return "preserve_none";
|
|
case 2:
|
|
return "preserve_none";
|
|
}
|
|
}
|
|
|
|
|
|
// PtGuardedByAttr implementation
|
|
|
|
PtGuardedByAttr *PtGuardedByAttr::CreateImplicit(ASTContext &Ctx, Expr * Arg, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PtGuardedByAttr(Ctx, CommonInfo, Arg);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PtGuardedByAttr *PtGuardedByAttr::Create(ASTContext &Ctx, Expr * Arg, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PtGuardedByAttr(Ctx, CommonInfo, Arg);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PtGuardedByAttr *PtGuardedByAttr::CreateImplicit(ASTContext &Ctx, Expr * Arg, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Arg, I);
|
|
}
|
|
|
|
PtGuardedByAttr *PtGuardedByAttr::Create(ASTContext &Ctx, Expr * Arg, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Arg, I);
|
|
}
|
|
|
|
PtGuardedByAttr::PtGuardedByAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Arg
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PtGuardedBy, /*IsLateParsed=*/true, true)
|
|
, arg(Arg)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
PtGuardedByAttr *PtGuardedByAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PtGuardedByAttr(C, *this, arg);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PtGuardedByAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((pt_guarded_by";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getArg()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PtGuardedByAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "pt_guarded_by";
|
|
}
|
|
}
|
|
|
|
|
|
// PtGuardedVarAttr implementation
|
|
|
|
PtGuardedVarAttr *PtGuardedVarAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PtGuardedVarAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PtGuardedVarAttr *PtGuardedVarAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PtGuardedVarAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PtGuardedVarAttr *PtGuardedVarAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_pt_guarded_var:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pt_guarded_var, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_pt_guarded_var:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_pt_guarded_var, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
PtGuardedVarAttr *PtGuardedVarAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_pt_guarded_var:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pt_guarded_var, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_pt_guarded_var:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_pt_guarded_var, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
PtGuardedVarAttr::PtGuardedVarAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::PtGuardedVar, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
PtGuardedVarAttr *PtGuardedVarAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PtGuardedVarAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PtGuardedVarAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((pt_guarded_var";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::pt_guarded_var";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PtGuardedVarAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "pt_guarded_var";
|
|
case 1:
|
|
return "pt_guarded_var";
|
|
}
|
|
}
|
|
|
|
|
|
// Ptr32Attr implementation
|
|
|
|
Ptr32Attr *Ptr32Attr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) Ptr32Attr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
Ptr32Attr *Ptr32Attr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) Ptr32Attr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
Ptr32Attr *Ptr32Attr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
Ptr32Attr *Ptr32Attr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
Ptr32Attr::Ptr32Attr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::Ptr32, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
Ptr32Attr *Ptr32Attr::clone(ASTContext &C) const {
|
|
auto *A = new (C) Ptr32Attr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void Ptr32Attr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__ptr32";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *Ptr32Attr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__ptr32";
|
|
}
|
|
}
|
|
|
|
|
|
// Ptr64Attr implementation
|
|
|
|
Ptr64Attr *Ptr64Attr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) Ptr64Attr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
Ptr64Attr *Ptr64Attr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) Ptr64Attr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
Ptr64Attr *Ptr64Attr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
Ptr64Attr *Ptr64Attr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
Ptr64Attr::Ptr64Attr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::Ptr64, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
Ptr64Attr *Ptr64Attr::clone(ASTContext &C) const {
|
|
auto *A = new (C) Ptr64Attr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void Ptr64Attr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__ptr64";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *Ptr64Attr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__ptr64";
|
|
}
|
|
}
|
|
|
|
|
|
// PureAttr implementation
|
|
|
|
PureAttr *PureAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PureAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PureAttr *PureAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) PureAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
PureAttr *PureAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_pure:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pure, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_pure:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_pure, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_pure:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_pure, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
PureAttr *PureAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_pure:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_pure, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_pure:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_pure, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_pure:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_pure, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
PureAttr::PureAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Pure, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
PureAttr *PureAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) PureAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void PureAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((pure";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::pure";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::pure";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *PureAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "pure";
|
|
case 1:
|
|
return "pure";
|
|
case 2:
|
|
return "pure";
|
|
}
|
|
}
|
|
|
|
|
|
// RISCVInterruptAttr implementation
|
|
|
|
RISCVInterruptAttr *RISCVInterruptAttr::CreateImplicit(ASTContext &Ctx, RISCVInterruptAttr::InterruptType Interrupt, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RISCVInterruptAttr(Ctx, CommonInfo, Interrupt);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RISCVInterruptAttr *RISCVInterruptAttr::Create(ASTContext &Ctx, RISCVInterruptAttr::InterruptType Interrupt, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RISCVInterruptAttr(Ctx, CommonInfo, Interrupt);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RISCVInterruptAttr *RISCVInterruptAttr::CreateImplicit(ASTContext &Ctx, RISCVInterruptAttr::InterruptType Interrupt, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Interrupt, I);
|
|
}
|
|
|
|
RISCVInterruptAttr *RISCVInterruptAttr::Create(ASTContext &Ctx, RISCVInterruptAttr::InterruptType Interrupt, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_interrupt:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_interrupt, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Interrupt, I);
|
|
}
|
|
|
|
RISCVInterruptAttr::RISCVInterruptAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, RISCVInterruptAttr::InterruptType Interrupt
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::RISCVInterrupt, /*IsLateParsed=*/false, false)
|
|
, interrupt(Interrupt)
|
|
{
|
|
}
|
|
|
|
RISCVInterruptAttr::RISCVInterruptAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::RISCVInterrupt, /*IsLateParsed=*/false, false)
|
|
, interrupt(RISCVInterruptAttr::InterruptType(0))
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool RISCVInterruptAttr::ConvertStrToInterruptType(StringRef Val, RISCVInterruptAttr::InterruptType &Out) {
|
|
std::optional<RISCVInterruptAttr::InterruptType> R = llvm::StringSwitch<std::optional<RISCVInterruptAttr::InterruptType>>(Val)
|
|
.Case("supervisor", RISCVInterruptAttr::InterruptType::supervisor)
|
|
.Case("machine", RISCVInterruptAttr::InterruptType::machine)
|
|
.Default(std::optional<RISCVInterruptAttr::InterruptType>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *RISCVInterruptAttr::ConvertInterruptTypeToStr(RISCVInterruptAttr::InterruptType Val) {
|
|
switch(Val) {
|
|
case RISCVInterruptAttr::InterruptType::supervisor: return "supervisor";
|
|
case RISCVInterruptAttr::InterruptType::machine: return "machine";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
RISCVInterruptAttr *RISCVInterruptAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) RISCVInterruptAttr(C, *this, interrupt);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void RISCVInterruptAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << RISCVInterruptAttr::ConvertInterruptTypeToStr(getInterrupt()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << RISCVInterruptAttr::ConvertInterruptTypeToStr(getInterrupt()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::interrupt";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << RISCVInterruptAttr::ConvertInterruptTypeToStr(getInterrupt()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *RISCVInterruptAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "interrupt";
|
|
case 1:
|
|
return "interrupt";
|
|
case 2:
|
|
return "interrupt";
|
|
}
|
|
}
|
|
|
|
|
|
// RISCVVectorCCAttr implementation
|
|
|
|
RISCVVectorCCAttr *RISCVVectorCCAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RISCVVectorCCAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RISCVVectorCCAttr *RISCVVectorCCAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RISCVVectorCCAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
RISCVVectorCCAttr *RISCVVectorCCAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_riscv_vector_cc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_riscv_vector_cc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_riscv_vector_cc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_riscv_vector_cc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_riscv_vector_cc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_riscv_vector_cc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_riscv_vector_cc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_riscv_vector_cc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_riscv_vector_cc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_riscv_vector_cc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
RISCVVectorCCAttr *RISCVVectorCCAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_riscv_vector_cc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_riscv_vector_cc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_riscv_vector_cc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_riscv_vector_cc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_riscv_vector_cc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_riscv_vector_cc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_riscv_vector_cc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_riscv_vector_cc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_riscv_vector_cc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_riscv_vector_cc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
RISCVVectorCCAttr::RISCVVectorCCAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::RISCVVectorCC, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
RISCVVectorCCAttr::Spelling RISCVVectorCCAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return CXX11_riscv_vector_cc;
|
|
case 1: return C23_riscv_vector_cc;
|
|
case 2: return GNU_riscv_vector_cc;
|
|
case 3: return CXX11_clang_riscv_vector_cc;
|
|
case 4: return C23_clang_riscv_vector_cc;
|
|
}
|
|
}
|
|
RISCVVectorCCAttr *RISCVVectorCCAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) RISCVVectorCCAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void RISCVVectorCCAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[riscv::vector_cc";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[riscv::vector_cc";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((riscv_vector_cc";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::riscv_vector_cc";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[clang::riscv_vector_cc";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *RISCVVectorCCAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "vector_cc";
|
|
case 1:
|
|
return "vector_cc";
|
|
case 2:
|
|
return "riscv_vector_cc";
|
|
case 3:
|
|
return "riscv_vector_cc";
|
|
case 4:
|
|
return "riscv_vector_cc";
|
|
}
|
|
}
|
|
|
|
|
|
// RandomizeLayoutAttr implementation
|
|
|
|
RandomizeLayoutAttr *RandomizeLayoutAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RandomizeLayoutAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RandomizeLayoutAttr *RandomizeLayoutAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RandomizeLayoutAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RandomizeLayoutAttr *RandomizeLayoutAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_randomize_layout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_randomize_layout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_randomize_layout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_randomize_layout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_randomize_layout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_randomize_layout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
RandomizeLayoutAttr *RandomizeLayoutAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_randomize_layout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_randomize_layout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_randomize_layout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_randomize_layout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_randomize_layout:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_randomize_layout, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
RandomizeLayoutAttr::RandomizeLayoutAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::RandomizeLayout, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
RandomizeLayoutAttr *RandomizeLayoutAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) RandomizeLayoutAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void RandomizeLayoutAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((randomize_layout";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::randomize_layout";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::randomize_layout";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *RandomizeLayoutAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "randomize_layout";
|
|
case 1:
|
|
return "randomize_layout";
|
|
case 2:
|
|
return "randomize_layout";
|
|
}
|
|
}
|
|
|
|
|
|
// ReadOnlyPlacementAttr implementation
|
|
|
|
ReadOnlyPlacementAttr *ReadOnlyPlacementAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReadOnlyPlacementAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReadOnlyPlacementAttr *ReadOnlyPlacementAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReadOnlyPlacementAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReadOnlyPlacementAttr *ReadOnlyPlacementAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_enforce_read_only_placement:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_enforce_read_only_placement, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_enforce_read_only_placement:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_enforce_read_only_placement, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_enforce_read_only_placement:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_enforce_read_only_placement, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ReadOnlyPlacementAttr *ReadOnlyPlacementAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_enforce_read_only_placement:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_enforce_read_only_placement, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_enforce_read_only_placement:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_enforce_read_only_placement, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_enforce_read_only_placement:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_enforce_read_only_placement, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ReadOnlyPlacementAttr::ReadOnlyPlacementAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ReadOnlyPlacement, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ReadOnlyPlacementAttr *ReadOnlyPlacementAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ReadOnlyPlacementAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ReadOnlyPlacementAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((enforce_read_only_placement";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::enforce_read_only_placement";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::enforce_read_only_placement";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ReadOnlyPlacementAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "enforce_read_only_placement";
|
|
case 1:
|
|
return "enforce_read_only_placement";
|
|
case 2:
|
|
return "enforce_read_only_placement";
|
|
}
|
|
}
|
|
|
|
|
|
// RegCallAttr implementation
|
|
|
|
RegCallAttr *RegCallAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RegCallAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RegCallAttr *RegCallAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RegCallAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RegCallAttr *RegCallAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_regcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_regcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_regcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_regcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_regcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_regcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_regcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_regcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
RegCallAttr *RegCallAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_regcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_regcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_regcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_regcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_regcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_regcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_regcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_regcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
RegCallAttr::RegCallAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::RegCall, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
RegCallAttr *RegCallAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) RegCallAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void RegCallAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((regcall";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::regcall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::regcall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__regcall";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *RegCallAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "regcall";
|
|
case 1:
|
|
return "regcall";
|
|
case 2:
|
|
return "regcall";
|
|
case 3:
|
|
return "__regcall";
|
|
}
|
|
}
|
|
|
|
|
|
// ReinitializesAttr implementation
|
|
|
|
ReinitializesAttr *ReinitializesAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReinitializesAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReinitializesAttr *ReinitializesAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReinitializesAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReinitializesAttr *ReinitializesAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_reinitializes:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_reinitializes, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_reinitializes:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_reinitializes, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ReinitializesAttr *ReinitializesAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_reinitializes:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_reinitializes, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_reinitializes:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_reinitializes, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ReinitializesAttr::ReinitializesAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Reinitializes, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ReinitializesAttr *ReinitializesAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ReinitializesAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ReinitializesAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((reinitializes";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::reinitializes";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ReinitializesAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "reinitializes";
|
|
case 1:
|
|
return "reinitializes";
|
|
}
|
|
}
|
|
|
|
|
|
// ReleaseCapabilityAttr implementation
|
|
|
|
ReleaseCapabilityAttr *ReleaseCapabilityAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReleaseCapabilityAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReleaseCapabilityAttr *ReleaseCapabilityAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReleaseCapabilityAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
return A;
|
|
}
|
|
|
|
ReleaseCapabilityAttr *ReleaseCapabilityAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_release_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_release_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_release_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_release_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_release_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_release_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_release_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_release_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_release_generic_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_release_generic_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_release_generic_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_release_generic_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_unlock_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_unlock_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_unlock_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_unlock_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
ReleaseCapabilityAttr *ReleaseCapabilityAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_release_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_release_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_release_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_release_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_release_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_release_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_release_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_release_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_release_generic_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_release_generic_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_release_generic_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_release_generic_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_unlock_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_unlock_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_unlock_function:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_unlock_function, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
ReleaseCapabilityAttr::ReleaseCapabilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ReleaseCapability, /*IsLateParsed=*/true, true)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
ReleaseCapabilityAttr::ReleaseCapabilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ReleaseCapability, /*IsLateParsed=*/true, true)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
ReleaseCapabilityAttr::Spelling ReleaseCapabilityAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_release_capability;
|
|
case 1: return CXX11_clang_release_capability;
|
|
case 2: return GNU_release_shared_capability;
|
|
case 3: return CXX11_clang_release_shared_capability;
|
|
case 4: return GNU_release_generic_capability;
|
|
case 5: return CXX11_clang_release_generic_capability;
|
|
case 6: return GNU_unlock_function;
|
|
case 7: return CXX11_clang_unlock_function;
|
|
}
|
|
}
|
|
|
|
|
|
ReleaseCapabilityAttr *ReleaseCapabilityAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ReleaseCapabilityAttr(C, *this, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ReleaseCapabilityAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((release_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::release_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((release_shared_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::release_shared_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "__attribute__((release_generic_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[clang::release_generic_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 6 : {
|
|
OS << "__attribute__((unlock_function";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 7 : {
|
|
OS << "[[clang::unlock_function";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ReleaseCapabilityAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "release_capability";
|
|
case 1:
|
|
return "release_capability";
|
|
case 2:
|
|
return "release_shared_capability";
|
|
case 3:
|
|
return "release_shared_capability";
|
|
case 4:
|
|
return "release_generic_capability";
|
|
case 5:
|
|
return "release_generic_capability";
|
|
case 6:
|
|
return "unlock_function";
|
|
case 7:
|
|
return "unlock_function";
|
|
}
|
|
}
|
|
|
|
|
|
// ReleaseHandleAttr implementation
|
|
|
|
ReleaseHandleAttr *ReleaseHandleAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef HandleType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReleaseHandleAttr(Ctx, CommonInfo, HandleType);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReleaseHandleAttr *ReleaseHandleAttr::Create(ASTContext &Ctx, llvm::StringRef HandleType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReleaseHandleAttr(Ctx, CommonInfo, HandleType);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReleaseHandleAttr *ReleaseHandleAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef HandleType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_release_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_release_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_release_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_release_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_release_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_release_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, HandleType, I);
|
|
}
|
|
|
|
ReleaseHandleAttr *ReleaseHandleAttr::Create(ASTContext &Ctx, llvm::StringRef HandleType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_release_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_release_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_release_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_release_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_release_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_release_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, HandleType, I);
|
|
}
|
|
|
|
ReleaseHandleAttr::ReleaseHandleAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef HandleType
|
|
)
|
|
: InheritableParamAttr(Ctx, CommonInfo, attr::ReleaseHandle, /*IsLateParsed=*/false, false)
|
|
, handleTypeLength(HandleType.size()),handleType(new (Ctx, 1) char[handleTypeLength])
|
|
{
|
|
if (!HandleType.empty())
|
|
std::memcpy(handleType, HandleType.data(), handleTypeLength);
|
|
}
|
|
|
|
|
|
|
|
ReleaseHandleAttr *ReleaseHandleAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ReleaseHandleAttr(C, *this, getHandleType());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ReleaseHandleAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((release_handle";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getHandleType() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::release_handle";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getHandleType() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::release_handle";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getHandleType() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ReleaseHandleAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "release_handle";
|
|
case 1:
|
|
return "release_handle";
|
|
case 2:
|
|
return "release_handle";
|
|
}
|
|
}
|
|
|
|
|
|
// RenderScriptKernelAttr implementation
|
|
|
|
RenderScriptKernelAttr *RenderScriptKernelAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RenderScriptKernelAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RenderScriptKernelAttr *RenderScriptKernelAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RenderScriptKernelAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RenderScriptKernelAttr *RenderScriptKernelAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
RenderScriptKernelAttr *RenderScriptKernelAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
RenderScriptKernelAttr::RenderScriptKernelAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::RenderScriptKernel, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
RenderScriptKernelAttr *RenderScriptKernelAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) RenderScriptKernelAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void RenderScriptKernelAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((kernel";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *RenderScriptKernelAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "kernel";
|
|
}
|
|
}
|
|
|
|
|
|
// ReqdWorkGroupSizeAttr implementation
|
|
|
|
ReqdWorkGroupSizeAttr *ReqdWorkGroupSizeAttr::CreateImplicit(ASTContext &Ctx, unsigned XDim, unsigned YDim, unsigned ZDim, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReqdWorkGroupSizeAttr(Ctx, CommonInfo, XDim, YDim, ZDim);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReqdWorkGroupSizeAttr *ReqdWorkGroupSizeAttr::Create(ASTContext &Ctx, unsigned XDim, unsigned YDim, unsigned ZDim, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReqdWorkGroupSizeAttr(Ctx, CommonInfo, XDim, YDim, ZDim);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReqdWorkGroupSizeAttr *ReqdWorkGroupSizeAttr::CreateImplicit(ASTContext &Ctx, unsigned XDim, unsigned YDim, unsigned ZDim, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, XDim, YDim, ZDim, I);
|
|
}
|
|
|
|
ReqdWorkGroupSizeAttr *ReqdWorkGroupSizeAttr::Create(ASTContext &Ctx, unsigned XDim, unsigned YDim, unsigned ZDim, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, XDim, YDim, ZDim, I);
|
|
}
|
|
|
|
ReqdWorkGroupSizeAttr::ReqdWorkGroupSizeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned XDim
|
|
, unsigned YDim
|
|
, unsigned ZDim
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ReqdWorkGroupSize, /*IsLateParsed=*/false, false)
|
|
, xDim(XDim)
|
|
, yDim(YDim)
|
|
, zDim(ZDim)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ReqdWorkGroupSizeAttr *ReqdWorkGroupSizeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ReqdWorkGroupSizeAttr(C, *this, xDim, yDim, zDim);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ReqdWorkGroupSizeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((reqd_work_group_size";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getXDim() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getYDim() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getZDim() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ReqdWorkGroupSizeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "reqd_work_group_size";
|
|
}
|
|
}
|
|
|
|
|
|
// RequiresCapabilityAttr implementation
|
|
|
|
RequiresCapabilityAttr *RequiresCapabilityAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RequiresCapabilityAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RequiresCapabilityAttr *RequiresCapabilityAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RequiresCapabilityAttr(Ctx, CommonInfo, Args, ArgsSize);
|
|
return A;
|
|
}
|
|
|
|
RequiresCapabilityAttr *RequiresCapabilityAttr::CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_requires_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_requires_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_requires_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_requires_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_exclusive_locks_required:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_exclusive_locks_required, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_exclusive_locks_required:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_exclusive_locks_required, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_requires_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_requires_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_requires_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_requires_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_shared_locks_required:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_shared_locks_required, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_shared_locks_required:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_shared_locks_required, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
RequiresCapabilityAttr *RequiresCapabilityAttr::Create(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_requires_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_requires_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_requires_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_requires_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_exclusive_locks_required:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_exclusive_locks_required, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_exclusive_locks_required:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_exclusive_locks_required, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_requires_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_requires_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_requires_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_requires_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_shared_locks_required:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_shared_locks_required, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_shared_locks_required:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_shared_locks_required, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Args, ArgsSize, I);
|
|
}
|
|
|
|
RequiresCapabilityAttr::RequiresCapabilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::RequiresCapability, /*IsLateParsed=*/true, true)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
RequiresCapabilityAttr::RequiresCapabilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::RequiresCapability, /*IsLateParsed=*/true, true)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
RequiresCapabilityAttr::Spelling RequiresCapabilityAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_requires_capability;
|
|
case 1: return CXX11_clang_requires_capability;
|
|
case 2: return GNU_exclusive_locks_required;
|
|
case 3: return CXX11_clang_exclusive_locks_required;
|
|
case 4: return GNU_requires_shared_capability;
|
|
case 5: return CXX11_clang_requires_shared_capability;
|
|
case 6: return GNU_shared_locks_required;
|
|
case 7: return CXX11_clang_shared_locks_required;
|
|
}
|
|
}
|
|
|
|
|
|
RequiresCapabilityAttr *RequiresCapabilityAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) RequiresCapabilityAttr(C, *this, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void RequiresCapabilityAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((requires_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::requires_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((exclusive_locks_required";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::exclusive_locks_required";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "__attribute__((requires_shared_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[clang::requires_shared_capability";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 6 : {
|
|
OS << "__attribute__((shared_locks_required";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 7 : {
|
|
OS << "[[clang::shared_locks_required";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *RequiresCapabilityAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "requires_capability";
|
|
case 1:
|
|
return "requires_capability";
|
|
case 2:
|
|
return "exclusive_locks_required";
|
|
case 3:
|
|
return "exclusive_locks_required";
|
|
case 4:
|
|
return "requires_shared_capability";
|
|
case 5:
|
|
return "requires_shared_capability";
|
|
case 6:
|
|
return "shared_locks_required";
|
|
case 7:
|
|
return "shared_locks_required";
|
|
}
|
|
}
|
|
|
|
|
|
// RestrictAttr implementation
|
|
|
|
RestrictAttr *RestrictAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RestrictAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RestrictAttr *RestrictAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RestrictAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
RestrictAttr *RestrictAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_restrict:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_restrict, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_malloc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_malloc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_malloc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_malloc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_malloc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_malloc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
RestrictAttr *RestrictAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_restrict:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_restrict, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_malloc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_malloc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_malloc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_malloc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_malloc:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_malloc, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
RestrictAttr::RestrictAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Restrict, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
RestrictAttr::Spelling RestrictAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return Declspec_restrict;
|
|
case 1: return GNU_malloc;
|
|
case 2: return CXX11_gnu_malloc;
|
|
case 3: return C23_gnu_malloc;
|
|
}
|
|
}
|
|
RestrictAttr *RestrictAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) RestrictAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void RestrictAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(restrict";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__attribute__((malloc";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::malloc";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[gnu::malloc";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *RestrictAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "restrict";
|
|
case 1:
|
|
return "malloc";
|
|
case 2:
|
|
return "malloc";
|
|
case 3:
|
|
return "malloc";
|
|
}
|
|
}
|
|
|
|
|
|
// RetainAttr implementation
|
|
|
|
RetainAttr *RetainAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RetainAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RetainAttr *RetainAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) RetainAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
RetainAttr *RetainAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_retain:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_retain, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_retain:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_retain, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_retain:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_retain, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
RetainAttr *RetainAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_retain:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_retain, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_retain:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_retain, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_retain:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_retain, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
RetainAttr::RetainAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Retain, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
RetainAttr *RetainAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) RetainAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void RetainAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((retain";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::retain";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::retain";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *RetainAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "retain";
|
|
case 1:
|
|
return "retain";
|
|
case 2:
|
|
return "retain";
|
|
}
|
|
}
|
|
|
|
|
|
// ReturnTypestateAttr implementation
|
|
|
|
ReturnTypestateAttr *ReturnTypestateAttr::CreateImplicit(ASTContext &Ctx, ReturnTypestateAttr::ConsumedState State, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReturnTypestateAttr(Ctx, CommonInfo, State);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReturnTypestateAttr *ReturnTypestateAttr::Create(ASTContext &Ctx, ReturnTypestateAttr::ConsumedState State, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReturnTypestateAttr(Ctx, CommonInfo, State);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReturnTypestateAttr *ReturnTypestateAttr::CreateImplicit(ASTContext &Ctx, ReturnTypestateAttr::ConsumedState State, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_return_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_return_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_return_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_return_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, State, I);
|
|
}
|
|
|
|
ReturnTypestateAttr *ReturnTypestateAttr::Create(ASTContext &Ctx, ReturnTypestateAttr::ConsumedState State, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_return_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_return_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_return_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_return_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, State, I);
|
|
}
|
|
|
|
ReturnTypestateAttr::ReturnTypestateAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, ReturnTypestateAttr::ConsumedState State
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ReturnTypestate, /*IsLateParsed=*/false, false)
|
|
, state(State)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool ReturnTypestateAttr::ConvertStrToConsumedState(StringRef Val, ReturnTypestateAttr::ConsumedState &Out) {
|
|
std::optional<ReturnTypestateAttr::ConsumedState> R = llvm::StringSwitch<std::optional<ReturnTypestateAttr::ConsumedState>>(Val)
|
|
.Case("unknown", ReturnTypestateAttr::ConsumedState::Unknown)
|
|
.Case("consumed", ReturnTypestateAttr::ConsumedState::Consumed)
|
|
.Case("unconsumed", ReturnTypestateAttr::ConsumedState::Unconsumed)
|
|
.Default(std::optional<ReturnTypestateAttr::ConsumedState>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *ReturnTypestateAttr::ConvertConsumedStateToStr(ReturnTypestateAttr::ConsumedState Val) {
|
|
switch(Val) {
|
|
case ReturnTypestateAttr::ConsumedState::Unknown: return "unknown";
|
|
case ReturnTypestateAttr::ConsumedState::Consumed: return "consumed";
|
|
case ReturnTypestateAttr::ConsumedState::Unconsumed: return "unconsumed";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
ReturnTypestateAttr *ReturnTypestateAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ReturnTypestateAttr(C, *this, state);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ReturnTypestateAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((return_typestate";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ReturnTypestateAttr::ConvertConsumedStateToStr(getState()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::return_typestate";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ReturnTypestateAttr::ConvertConsumedStateToStr(getState()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ReturnTypestateAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "return_typestate";
|
|
case 1:
|
|
return "return_typestate";
|
|
}
|
|
}
|
|
|
|
|
|
// ReturnsNonNullAttr implementation
|
|
|
|
ReturnsNonNullAttr *ReturnsNonNullAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReturnsNonNullAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReturnsNonNullAttr *ReturnsNonNullAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReturnsNonNullAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReturnsNonNullAttr *ReturnsNonNullAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_returns_nonnull:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_returns_nonnull, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_returns_nonnull:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_returns_nonnull, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_returns_nonnull:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_returns_nonnull, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ReturnsNonNullAttr *ReturnsNonNullAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_returns_nonnull:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_returns_nonnull, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_returns_nonnull:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_returns_nonnull, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_returns_nonnull:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_returns_nonnull, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ReturnsNonNullAttr::ReturnsNonNullAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ReturnsNonNull, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ReturnsNonNullAttr *ReturnsNonNullAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ReturnsNonNullAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ReturnsNonNullAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((returns_nonnull";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::returns_nonnull";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::returns_nonnull";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ReturnsNonNullAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "returns_nonnull";
|
|
case 1:
|
|
return "returns_nonnull";
|
|
case 2:
|
|
return "returns_nonnull";
|
|
}
|
|
}
|
|
|
|
|
|
// ReturnsTwiceAttr implementation
|
|
|
|
ReturnsTwiceAttr *ReturnsTwiceAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReturnsTwiceAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReturnsTwiceAttr *ReturnsTwiceAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ReturnsTwiceAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ReturnsTwiceAttr *ReturnsTwiceAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_returns_twice:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_returns_twice, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_returns_twice:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_returns_twice, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_returns_twice:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_returns_twice, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ReturnsTwiceAttr *ReturnsTwiceAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_returns_twice:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_returns_twice, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_returns_twice:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_returns_twice, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_returns_twice:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_returns_twice, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ReturnsTwiceAttr::ReturnsTwiceAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ReturnsTwice, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ReturnsTwiceAttr *ReturnsTwiceAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ReturnsTwiceAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ReturnsTwiceAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((returns_twice";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::returns_twice";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::returns_twice";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ReturnsTwiceAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "returns_twice";
|
|
case 1:
|
|
return "returns_twice";
|
|
case 2:
|
|
return "returns_twice";
|
|
}
|
|
}
|
|
|
|
|
|
// SPtrAttr implementation
|
|
|
|
SPtrAttr *SPtrAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SPtrAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SPtrAttr *SPtrAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SPtrAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SPtrAttr *SPtrAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SPtrAttr *SPtrAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SPtrAttr::SPtrAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::SPtr, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
SPtrAttr *SPtrAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SPtrAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SPtrAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__sptr";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SPtrAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__sptr";
|
|
}
|
|
}
|
|
|
|
|
|
// SYCLKernelAttr implementation
|
|
|
|
SYCLKernelAttr *SYCLKernelAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SYCLKernelAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SYCLKernelAttr *SYCLKernelAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SYCLKernelAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SYCLKernelAttr *SYCLKernelAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_sycl_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_sycl_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_sycl_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_sycl_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_sycl_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_sycl_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SYCLKernelAttr *SYCLKernelAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_sycl_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_sycl_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_sycl_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_sycl_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_sycl_kernel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_sycl_kernel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SYCLKernelAttr::SYCLKernelAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SYCLKernel, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SYCLKernelAttr *SYCLKernelAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SYCLKernelAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SYCLKernelAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((sycl_kernel";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::sycl_kernel";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::sycl_kernel";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SYCLKernelAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "sycl_kernel";
|
|
case 1:
|
|
return "sycl_kernel";
|
|
case 2:
|
|
return "sycl_kernel";
|
|
}
|
|
}
|
|
|
|
|
|
// SYCLSpecialClassAttr implementation
|
|
|
|
SYCLSpecialClassAttr *SYCLSpecialClassAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SYCLSpecialClassAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SYCLSpecialClassAttr *SYCLSpecialClassAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SYCLSpecialClassAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SYCLSpecialClassAttr *SYCLSpecialClassAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_sycl_special_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_sycl_special_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_sycl_special_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_sycl_special_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_sycl_special_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_sycl_special_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SYCLSpecialClassAttr *SYCLSpecialClassAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_sycl_special_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_sycl_special_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_sycl_special_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_sycl_special_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_sycl_special_class:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_sycl_special_class, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SYCLSpecialClassAttr::SYCLSpecialClassAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SYCLSpecialClass, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SYCLSpecialClassAttr *SYCLSpecialClassAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SYCLSpecialClassAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SYCLSpecialClassAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((sycl_special_class";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::sycl_special_class";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::sycl_special_class";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SYCLSpecialClassAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "sycl_special_class";
|
|
case 1:
|
|
return "sycl_special_class";
|
|
case 2:
|
|
return "sycl_special_class";
|
|
}
|
|
}
|
|
|
|
|
|
// ScopedLockableAttr implementation
|
|
|
|
ScopedLockableAttr *ScopedLockableAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ScopedLockableAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ScopedLockableAttr *ScopedLockableAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ScopedLockableAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ScopedLockableAttr *ScopedLockableAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_scoped_lockable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_scoped_lockable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_scoped_lockable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_scoped_lockable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ScopedLockableAttr *ScopedLockableAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_scoped_lockable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_scoped_lockable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_scoped_lockable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_scoped_lockable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ScopedLockableAttr::ScopedLockableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ScopedLockable, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ScopedLockableAttr *ScopedLockableAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ScopedLockableAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ScopedLockableAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((scoped_lockable";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::scoped_lockable";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ScopedLockableAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "scoped_lockable";
|
|
case 1:
|
|
return "scoped_lockable";
|
|
}
|
|
}
|
|
|
|
|
|
// SectionAttr implementation
|
|
|
|
SectionAttr *SectionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SectionAttr(Ctx, CommonInfo, Name);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SectionAttr *SectionAttr::Create(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SectionAttr(Ctx, CommonInfo, Name);
|
|
return A;
|
|
}
|
|
|
|
SectionAttr *SectionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_section:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_section, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_section:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_section, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_section:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_section, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_allocate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_allocate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Name, I);
|
|
}
|
|
|
|
SectionAttr *SectionAttr::Create(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_section:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_section, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_section:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_section, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_section:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_section, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Declspec_allocate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_allocate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Name, I);
|
|
}
|
|
|
|
SectionAttr::SectionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Name
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Section, /*IsLateParsed=*/false, false)
|
|
, nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
|
|
{
|
|
if (!Name.empty())
|
|
std::memcpy(name, Name.data(), nameLength);
|
|
}
|
|
|
|
SectionAttr::Spelling SectionAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_section;
|
|
case 1: return CXX11_gnu_section;
|
|
case 2: return C23_gnu_section;
|
|
case 3: return Declspec_allocate;
|
|
}
|
|
}
|
|
|
|
|
|
SectionAttr *SectionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SectionAttr(C, *this, getName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SectionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((section";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::section";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::section";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__declspec(allocate";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SectionAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "section";
|
|
case 1:
|
|
return "section";
|
|
case 2:
|
|
return "section";
|
|
case 3:
|
|
return "allocate";
|
|
}
|
|
}
|
|
|
|
|
|
// SelectAnyAttr implementation
|
|
|
|
SelectAnyAttr *SelectAnyAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SelectAnyAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SelectAnyAttr *SelectAnyAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SelectAnyAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SelectAnyAttr *SelectAnyAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_selectany:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_selectany, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_selectany:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_selectany, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_selectany:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_selectany, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_selectany:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_selectany, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SelectAnyAttr *SelectAnyAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_selectany:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_selectany, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_selectany:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_selectany, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_selectany:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_selectany, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_selectany:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_selectany, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SelectAnyAttr::SelectAnyAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SelectAny, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SelectAnyAttr *SelectAnyAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SelectAnyAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SelectAnyAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(selectany";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__attribute__((selectany";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::selectany";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[gnu::selectany";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SelectAnyAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "selectany";
|
|
case 1:
|
|
return "selectany";
|
|
case 2:
|
|
return "selectany";
|
|
case 3:
|
|
return "selectany";
|
|
}
|
|
}
|
|
|
|
|
|
// SentinelAttr implementation
|
|
|
|
SentinelAttr *SentinelAttr::CreateImplicit(ASTContext &Ctx, int Sentinel, int NullPos, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SentinelAttr(Ctx, CommonInfo, Sentinel, NullPos);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SentinelAttr *SentinelAttr::Create(ASTContext &Ctx, int Sentinel, int NullPos, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SentinelAttr(Ctx, CommonInfo, Sentinel, NullPos);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SentinelAttr *SentinelAttr::CreateImplicit(ASTContext &Ctx, int Sentinel, int NullPos, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_sentinel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_sentinel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_sentinel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_sentinel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_sentinel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_sentinel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Sentinel, NullPos, I);
|
|
}
|
|
|
|
SentinelAttr *SentinelAttr::Create(ASTContext &Ctx, int Sentinel, int NullPos, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_sentinel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_sentinel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_sentinel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_sentinel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_sentinel:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_sentinel, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Sentinel, NullPos, I);
|
|
}
|
|
|
|
SentinelAttr::SentinelAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, int Sentinel
|
|
, int NullPos
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Sentinel, /*IsLateParsed=*/false, false)
|
|
, sentinel(Sentinel)
|
|
, nullPos(NullPos)
|
|
{
|
|
}
|
|
|
|
SentinelAttr::SentinelAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Sentinel, /*IsLateParsed=*/false, false)
|
|
, sentinel()
|
|
, nullPos()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SentinelAttr *SentinelAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SentinelAttr(C, *this, sentinel, nullPos);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SentinelAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((sentinel";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getSentinel() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNullPos() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::sentinel";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getSentinel() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNullPos() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::sentinel";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getSentinel() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNullPos() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SentinelAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "sentinel";
|
|
case 1:
|
|
return "sentinel";
|
|
case 2:
|
|
return "sentinel";
|
|
}
|
|
}
|
|
|
|
|
|
// SetTypestateAttr implementation
|
|
|
|
SetTypestateAttr *SetTypestateAttr::CreateImplicit(ASTContext &Ctx, SetTypestateAttr::ConsumedState NewState, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SetTypestateAttr(Ctx, CommonInfo, NewState);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SetTypestateAttr *SetTypestateAttr::Create(ASTContext &Ctx, SetTypestateAttr::ConsumedState NewState, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SetTypestateAttr(Ctx, CommonInfo, NewState);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SetTypestateAttr *SetTypestateAttr::CreateImplicit(ASTContext &Ctx, SetTypestateAttr::ConsumedState NewState, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_set_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_set_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_set_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_set_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, NewState, I);
|
|
}
|
|
|
|
SetTypestateAttr *SetTypestateAttr::Create(ASTContext &Ctx, SetTypestateAttr::ConsumedState NewState, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_set_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_set_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_set_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_set_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, NewState, I);
|
|
}
|
|
|
|
SetTypestateAttr::SetTypestateAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, SetTypestateAttr::ConsumedState NewState
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SetTypestate, /*IsLateParsed=*/false, false)
|
|
, newState(NewState)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool SetTypestateAttr::ConvertStrToConsumedState(StringRef Val, SetTypestateAttr::ConsumedState &Out) {
|
|
std::optional<SetTypestateAttr::ConsumedState> R = llvm::StringSwitch<std::optional<SetTypestateAttr::ConsumedState>>(Val)
|
|
.Case("unknown", SetTypestateAttr::ConsumedState::Unknown)
|
|
.Case("consumed", SetTypestateAttr::ConsumedState::Consumed)
|
|
.Case("unconsumed", SetTypestateAttr::ConsumedState::Unconsumed)
|
|
.Default(std::optional<SetTypestateAttr::ConsumedState>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *SetTypestateAttr::ConvertConsumedStateToStr(SetTypestateAttr::ConsumedState Val) {
|
|
switch(Val) {
|
|
case SetTypestateAttr::ConsumedState::Unknown: return "unknown";
|
|
case SetTypestateAttr::ConsumedState::Consumed: return "consumed";
|
|
case SetTypestateAttr::ConsumedState::Unconsumed: return "unconsumed";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
SetTypestateAttr *SetTypestateAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SetTypestateAttr(C, *this, newState);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SetTypestateAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((set_typestate";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << SetTypestateAttr::ConvertConsumedStateToStr(getNewState()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::set_typestate";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << SetTypestateAttr::ConvertConsumedStateToStr(getNewState()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SetTypestateAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "set_typestate";
|
|
case 1:
|
|
return "set_typestate";
|
|
}
|
|
}
|
|
|
|
|
|
// SharedTrylockFunctionAttr implementation
|
|
|
|
SharedTrylockFunctionAttr *SharedTrylockFunctionAttr::CreateImplicit(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SharedTrylockFunctionAttr(Ctx, CommonInfo, SuccessValue, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SharedTrylockFunctionAttr *SharedTrylockFunctionAttr::Create(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SharedTrylockFunctionAttr(Ctx, CommonInfo, SuccessValue, Args, ArgsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SharedTrylockFunctionAttr *SharedTrylockFunctionAttr::CreateImplicit(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, SuccessValue, Args, ArgsSize, I);
|
|
}
|
|
|
|
SharedTrylockFunctionAttr *SharedTrylockFunctionAttr::Create(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, SuccessValue, Args, ArgsSize, I);
|
|
}
|
|
|
|
SharedTrylockFunctionAttr::SharedTrylockFunctionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * SuccessValue
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SharedTrylockFunction, /*IsLateParsed=*/true, true)
|
|
, successValue(SuccessValue)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
SharedTrylockFunctionAttr::SharedTrylockFunctionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * SuccessValue
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SharedTrylockFunction, /*IsLateParsed=*/true, true)
|
|
, successValue(SuccessValue)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SharedTrylockFunctionAttr *SharedTrylockFunctionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SharedTrylockFunctionAttr(C, *this, successValue, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SharedTrylockFunctionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((shared_trylock_function";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getSuccessValue()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SharedTrylockFunctionAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "shared_trylock_function";
|
|
}
|
|
}
|
|
|
|
|
|
// SizedByAttr implementation
|
|
|
|
SizedByAttr *SizedByAttr::CreateImplicit(ASTContext &Ctx, Expr * Size, int NestedLevel, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SizedByAttr(Ctx, CommonInfo, Size, NestedLevel);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SizedByAttr *SizedByAttr::Create(ASTContext &Ctx, Expr * Size, int NestedLevel, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SizedByAttr(Ctx, CommonInfo, Size, NestedLevel);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SizedByAttr *SizedByAttr::CreateImplicit(ASTContext &Ctx, Expr * Size, int NestedLevel, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_sized_by:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_sized_by, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_sized_by:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_sized_by, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_sized_by:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_sized_by, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Size, NestedLevel, I);
|
|
}
|
|
|
|
SizedByAttr *SizedByAttr::Create(ASTContext &Ctx, Expr * Size, int NestedLevel, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_sized_by:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_sized_by, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_sized_by:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_sized_by, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_sized_by:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_sized_by, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Size, NestedLevel, I);
|
|
}
|
|
|
|
SizedByAttr::SizedByAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Size
|
|
, int NestedLevel
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SizedBy, /*IsLateParsed=*/true, false)
|
|
, size(Size)
|
|
, nestedLevel(NestedLevel)
|
|
{
|
|
}
|
|
|
|
SizedByAttr::SizedByAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Size
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SizedBy, /*IsLateParsed=*/true, false)
|
|
, size(Size)
|
|
, nestedLevel()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SizedByAttr *SizedByAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SizedByAttr(C, *this, size, nestedLevel);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SizedByAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((sized_by";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getSize()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNestedLevel() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::sized_by";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getSize()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNestedLevel() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::sized_by";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getSize()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNestedLevel() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SizedByAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "sized_by";
|
|
case 1:
|
|
return "sized_by";
|
|
case 2:
|
|
return "sized_by";
|
|
}
|
|
}
|
|
|
|
|
|
// SizedByOrNullAttr implementation
|
|
|
|
SizedByOrNullAttr *SizedByOrNullAttr::CreateImplicit(ASTContext &Ctx, Expr * Size, int NestedLevel, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SizedByOrNullAttr(Ctx, CommonInfo, Size, NestedLevel);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SizedByOrNullAttr *SizedByOrNullAttr::Create(ASTContext &Ctx, Expr * Size, int NestedLevel, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SizedByOrNullAttr(Ctx, CommonInfo, Size, NestedLevel);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SizedByOrNullAttr *SizedByOrNullAttr::CreateImplicit(ASTContext &Ctx, Expr * Size, int NestedLevel, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_sized_by_or_null:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_sized_by_or_null, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_sized_by_or_null:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_sized_by_or_null, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_sized_by_or_null:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_sized_by_or_null, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Size, NestedLevel, I);
|
|
}
|
|
|
|
SizedByOrNullAttr *SizedByOrNullAttr::Create(ASTContext &Ctx, Expr * Size, int NestedLevel, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_sized_by_or_null:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_sized_by_or_null, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_sized_by_or_null:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_sized_by_or_null, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_sized_by_or_null:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_sized_by_or_null, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Size, NestedLevel, I);
|
|
}
|
|
|
|
SizedByOrNullAttr::SizedByOrNullAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Size
|
|
, int NestedLevel
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SizedByOrNull, /*IsLateParsed=*/true, false)
|
|
, size(Size)
|
|
, nestedLevel(NestedLevel)
|
|
{
|
|
}
|
|
|
|
SizedByOrNullAttr::SizedByOrNullAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * Size
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SizedByOrNull, /*IsLateParsed=*/true, false)
|
|
, size(Size)
|
|
, nestedLevel()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SizedByOrNullAttr *SizedByOrNullAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SizedByOrNullAttr(C, *this, size, nestedLevel);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SizedByOrNullAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((sized_by_or_null";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getSize()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNestedLevel() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::sized_by_or_null";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getSize()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNestedLevel() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::sized_by_or_null";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getSize()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getNestedLevel() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SizedByOrNullAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "sized_by_or_null";
|
|
case 1:
|
|
return "sized_by_or_null";
|
|
case 2:
|
|
return "sized_by_or_null";
|
|
}
|
|
}
|
|
|
|
|
|
// SpeculativeLoadHardeningAttr implementation
|
|
|
|
SpeculativeLoadHardeningAttr *SpeculativeLoadHardeningAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SpeculativeLoadHardeningAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SpeculativeLoadHardeningAttr *SpeculativeLoadHardeningAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SpeculativeLoadHardeningAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SpeculativeLoadHardeningAttr *SpeculativeLoadHardeningAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_speculative_load_hardening:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_speculative_load_hardening, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_speculative_load_hardening:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_speculative_load_hardening, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_speculative_load_hardening:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_speculative_load_hardening, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SpeculativeLoadHardeningAttr *SpeculativeLoadHardeningAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_speculative_load_hardening:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_speculative_load_hardening, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_speculative_load_hardening:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_speculative_load_hardening, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_speculative_load_hardening:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_speculative_load_hardening, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SpeculativeLoadHardeningAttr::SpeculativeLoadHardeningAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SpeculativeLoadHardening, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SpeculativeLoadHardeningAttr *SpeculativeLoadHardeningAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SpeculativeLoadHardeningAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SpeculativeLoadHardeningAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((speculative_load_hardening";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::speculative_load_hardening";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::speculative_load_hardening";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SpeculativeLoadHardeningAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "speculative_load_hardening";
|
|
case 1:
|
|
return "speculative_load_hardening";
|
|
case 2:
|
|
return "speculative_load_hardening";
|
|
}
|
|
}
|
|
|
|
|
|
// StandaloneDebugAttr implementation
|
|
|
|
StandaloneDebugAttr *StandaloneDebugAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) StandaloneDebugAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
StandaloneDebugAttr *StandaloneDebugAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) StandaloneDebugAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
StandaloneDebugAttr *StandaloneDebugAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_standalone_debug:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_standalone_debug, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_standalone_debug:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_standalone_debug, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
StandaloneDebugAttr *StandaloneDebugAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_standalone_debug:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_standalone_debug, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_standalone_debug:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_standalone_debug, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
StandaloneDebugAttr::StandaloneDebugAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::StandaloneDebug, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
StandaloneDebugAttr *StandaloneDebugAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) StandaloneDebugAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void StandaloneDebugAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((standalone_debug";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::standalone_debug";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *StandaloneDebugAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "standalone_debug";
|
|
case 1:
|
|
return "standalone_debug";
|
|
}
|
|
}
|
|
|
|
|
|
// StdCallAttr implementation
|
|
|
|
StdCallAttr *StdCallAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) StdCallAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
StdCallAttr *StdCallAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) StdCallAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
StdCallAttr *StdCallAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_stdcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_stdcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_stdcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_stdcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_stdcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_stdcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_stdcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_stdcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
StdCallAttr *StdCallAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_stdcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_stdcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_stdcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_stdcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_stdcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_stdcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_stdcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_stdcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
StdCallAttr::StdCallAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::StdCall, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
StdCallAttr *StdCallAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) StdCallAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void StdCallAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((stdcall";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::stdcall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::stdcall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__stdcall";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "_stdcall";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *StdCallAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "stdcall";
|
|
case 1:
|
|
return "stdcall";
|
|
case 2:
|
|
return "stdcall";
|
|
case 3:
|
|
return "__stdcall";
|
|
case 4:
|
|
return "_stdcall";
|
|
}
|
|
}
|
|
|
|
|
|
// StrictFPAttr implementation
|
|
|
|
StrictFPAttr *StrictFPAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) StrictFPAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
StrictFPAttr *StrictFPAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) StrictFPAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
StrictFPAttr *StrictFPAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
StrictFPAttr *StrictFPAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
StrictFPAttr::StrictFPAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::StrictFP, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
StrictFPAttr *StrictFPAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) StrictFPAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void StrictFPAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *StrictFPAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// StrictGuardStackCheckAttr implementation
|
|
|
|
StrictGuardStackCheckAttr *StrictGuardStackCheckAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) StrictGuardStackCheckAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
StrictGuardStackCheckAttr *StrictGuardStackCheckAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) StrictGuardStackCheckAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
StrictGuardStackCheckAttr *StrictGuardStackCheckAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
StrictGuardStackCheckAttr *StrictGuardStackCheckAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
StrictGuardStackCheckAttr::StrictGuardStackCheckAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::StrictGuardStackCheck, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
StrictGuardStackCheckAttr *StrictGuardStackCheckAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) StrictGuardStackCheckAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void StrictGuardStackCheckAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(strict_gs_check";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *StrictGuardStackCheckAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "strict_gs_check";
|
|
}
|
|
}
|
|
|
|
|
|
// SuppressAttr implementation
|
|
|
|
SuppressAttr *SuppressAttr::CreateImplicit(ASTContext &Ctx, StringRef *DiagnosticIdentifiers, unsigned DiagnosticIdentifiersSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SuppressAttr(Ctx, CommonInfo, DiagnosticIdentifiers, DiagnosticIdentifiersSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SuppressAttr *SuppressAttr::Create(ASTContext &Ctx, StringRef *DiagnosticIdentifiers, unsigned DiagnosticIdentifiersSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SuppressAttr(Ctx, CommonInfo, DiagnosticIdentifiers, DiagnosticIdentifiersSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SuppressAttr *SuppressAttr::CreateImplicit(ASTContext &Ctx, StringRef *DiagnosticIdentifiers, unsigned DiagnosticIdentifiersSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_gsl_suppress:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gsl_suppress, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_suppress:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_suppress, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_suppress:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_suppress, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_suppress:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_suppress, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, DiagnosticIdentifiers, DiagnosticIdentifiersSize, I);
|
|
}
|
|
|
|
SuppressAttr *SuppressAttr::Create(ASTContext &Ctx, StringRef *DiagnosticIdentifiers, unsigned DiagnosticIdentifiersSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_gsl_suppress:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gsl_suppress, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_suppress:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_suppress, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_suppress:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_suppress, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_suppress:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_suppress, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, DiagnosticIdentifiers, DiagnosticIdentifiersSize, I);
|
|
}
|
|
|
|
SuppressAttr::SuppressAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, StringRef *DiagnosticIdentifiers, unsigned DiagnosticIdentifiersSize
|
|
)
|
|
: DeclOrStmtAttr(Ctx, CommonInfo, attr::Suppress, /*IsLateParsed=*/false, false)
|
|
, diagnosticIdentifiers_Size(DiagnosticIdentifiersSize), diagnosticIdentifiers_(new (Ctx, 16) StringRef[diagnosticIdentifiers_Size])
|
|
{
|
|
for (size_t I = 0, E = diagnosticIdentifiers_Size; I != E;
|
|
++I) {
|
|
StringRef Ref = DiagnosticIdentifiers[I];
|
|
if (!Ref.empty()) {
|
|
char *Mem = new (Ctx, 1) char[Ref.size()];
|
|
std::memcpy(Mem, Ref.data(), Ref.size());
|
|
diagnosticIdentifiers_[I] = StringRef(Mem, Ref.size());
|
|
}
|
|
}
|
|
}
|
|
|
|
SuppressAttr::SuppressAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: DeclOrStmtAttr(Ctx, CommonInfo, attr::Suppress, /*IsLateParsed=*/false, false)
|
|
, diagnosticIdentifiers_Size(0), diagnosticIdentifiers_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
SuppressAttr *SuppressAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SuppressAttr(C, *this, diagnosticIdentifiers_, diagnosticIdentifiers_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SuppressAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[gsl::suppress";
|
|
OS << "";
|
|
for (const auto &Val : diagnosticIdentifiers()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__attribute__((suppress";
|
|
OS << "";
|
|
for (const auto &Val : diagnosticIdentifiers()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::suppress";
|
|
OS << "";
|
|
for (const auto &Val : diagnosticIdentifiers()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::suppress";
|
|
OS << "";
|
|
for (const auto &Val : diagnosticIdentifiers()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SuppressAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "suppress";
|
|
case 1:
|
|
return "suppress";
|
|
case 2:
|
|
return "suppress";
|
|
case 3:
|
|
return "suppress";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftAsyncAttr implementation
|
|
|
|
SwiftAsyncAttr *SwiftAsyncAttr::CreateImplicit(ASTContext &Ctx, SwiftAsyncAttr::Kind Kind, ParamIdx CompletionHandlerIndex, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftAsyncAttr(Ctx, CommonInfo, Kind, CompletionHandlerIndex);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftAsyncAttr *SwiftAsyncAttr::Create(ASTContext &Ctx, SwiftAsyncAttr::Kind Kind, ParamIdx CompletionHandlerIndex, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftAsyncAttr(Ctx, CommonInfo, Kind, CompletionHandlerIndex);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftAsyncAttr *SwiftAsyncAttr::CreateImplicit(ASTContext &Ctx, SwiftAsyncAttr::Kind Kind, ParamIdx CompletionHandlerIndex, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_async:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_async, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swift_async:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swift_async, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swift_async:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swift_async, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Kind, CompletionHandlerIndex, I);
|
|
}
|
|
|
|
SwiftAsyncAttr *SwiftAsyncAttr::Create(ASTContext &Ctx, SwiftAsyncAttr::Kind Kind, ParamIdx CompletionHandlerIndex, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_async:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_async, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swift_async:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swift_async, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swift_async:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swift_async, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Kind, CompletionHandlerIndex, I);
|
|
}
|
|
|
|
SwiftAsyncAttr::SwiftAsyncAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, SwiftAsyncAttr::Kind Kind
|
|
, ParamIdx CompletionHandlerIndex
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftAsync, /*IsLateParsed=*/false, false)
|
|
, kind(Kind)
|
|
, completionHandlerIndex(CompletionHandlerIndex)
|
|
{
|
|
}
|
|
|
|
SwiftAsyncAttr::SwiftAsyncAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, SwiftAsyncAttr::Kind Kind
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftAsync, /*IsLateParsed=*/false, false)
|
|
, kind(Kind)
|
|
, completionHandlerIndex()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool SwiftAsyncAttr::ConvertStrToKind(StringRef Val, SwiftAsyncAttr::Kind &Out) {
|
|
std::optional<SwiftAsyncAttr::Kind> R = llvm::StringSwitch<std::optional<SwiftAsyncAttr::Kind>>(Val)
|
|
.Case("none", SwiftAsyncAttr::Kind::None)
|
|
.Case("swift_private", SwiftAsyncAttr::Kind::SwiftPrivate)
|
|
.Case("not_swift_private", SwiftAsyncAttr::Kind::NotSwiftPrivate)
|
|
.Default(std::optional<SwiftAsyncAttr::Kind>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *SwiftAsyncAttr::ConvertKindToStr(SwiftAsyncAttr::Kind Val) {
|
|
switch(Val) {
|
|
case SwiftAsyncAttr::Kind::None: return "none";
|
|
case SwiftAsyncAttr::Kind::SwiftPrivate: return "swift_private";
|
|
case SwiftAsyncAttr::Kind::NotSwiftPrivate: return "not_swift_private";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
|
|
|
|
SwiftAsyncAttr *SwiftAsyncAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftAsyncAttr(C, *this, kind, completionHandlerIndex);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftAsyncAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_async";
|
|
if (!getCompletionHandlerIndex().isValid())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << SwiftAsyncAttr::ConvertKindToStr(getKind()) << "\"";
|
|
if (!(!getCompletionHandlerIndex().isValid())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getCompletionHandlerIndex().getSourceIndex() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::swift_async";
|
|
if (!getCompletionHandlerIndex().isValid())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << SwiftAsyncAttr::ConvertKindToStr(getKind()) << "\"";
|
|
if (!(!getCompletionHandlerIndex().isValid())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getCompletionHandlerIndex().getSourceIndex() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::swift_async";
|
|
if (!getCompletionHandlerIndex().isValid())
|
|
++TrailingOmittedArgs;
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << SwiftAsyncAttr::ConvertKindToStr(getKind()) << "\"";
|
|
if (!(!getCompletionHandlerIndex().isValid())) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getCompletionHandlerIndex().getSourceIndex() << "";
|
|
}
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftAsyncAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_async";
|
|
case 1:
|
|
return "swift_async";
|
|
case 2:
|
|
return "swift_async";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftAsyncCallAttr implementation
|
|
|
|
SwiftAsyncCallAttr *SwiftAsyncCallAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftAsyncCallAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftAsyncCallAttr *SwiftAsyncCallAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftAsyncCallAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftAsyncCallAttr *SwiftAsyncCallAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swiftasynccall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swiftasynccall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swiftasynccall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swiftasynccall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swiftasynccall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swiftasynccall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SwiftAsyncCallAttr *SwiftAsyncCallAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swiftasynccall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swiftasynccall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swiftasynccall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swiftasynccall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swiftasynccall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swiftasynccall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SwiftAsyncCallAttr::SwiftAsyncCallAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftAsyncCall, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SwiftAsyncCallAttr *SwiftAsyncCallAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftAsyncCallAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftAsyncCallAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swiftasynccall";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::swiftasynccall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::swiftasynccall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftAsyncCallAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swiftasynccall";
|
|
case 1:
|
|
return "swiftasynccall";
|
|
case 2:
|
|
return "swiftasynccall";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftAsyncContextAttr implementation
|
|
|
|
SwiftAsyncContextAttr *SwiftAsyncContextAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftAsyncContextAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftAsyncContextAttr *SwiftAsyncContextAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftAsyncContextAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftAsyncContextAttr *SwiftAsyncContextAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_async_context:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_async_context, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swift_async_context:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swift_async_context, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swift_async_context:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swift_async_context, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SwiftAsyncContextAttr *SwiftAsyncContextAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_async_context:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_async_context, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swift_async_context:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swift_async_context, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swift_async_context:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swift_async_context, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SwiftAsyncContextAttr::SwiftAsyncContextAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: ParameterABIAttr(Ctx, CommonInfo, attr::SwiftAsyncContext, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SwiftAsyncContextAttr *SwiftAsyncContextAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftAsyncContextAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftAsyncContextAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_async_context";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::swift_async_context";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::swift_async_context";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftAsyncContextAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_async_context";
|
|
case 1:
|
|
return "swift_async_context";
|
|
case 2:
|
|
return "swift_async_context";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftAsyncErrorAttr implementation
|
|
|
|
SwiftAsyncErrorAttr *SwiftAsyncErrorAttr::CreateImplicit(ASTContext &Ctx, SwiftAsyncErrorAttr::ConventionKind Convention, unsigned HandlerParamIdx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftAsyncErrorAttr(Ctx, CommonInfo, Convention, HandlerParamIdx);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftAsyncErrorAttr *SwiftAsyncErrorAttr::Create(ASTContext &Ctx, SwiftAsyncErrorAttr::ConventionKind Convention, unsigned HandlerParamIdx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftAsyncErrorAttr(Ctx, CommonInfo, Convention, HandlerParamIdx);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftAsyncErrorAttr *SwiftAsyncErrorAttr::CreateImplicit(ASTContext &Ctx, SwiftAsyncErrorAttr::ConventionKind Convention, unsigned HandlerParamIdx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_async_error:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_async_error, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swift_async_error:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swift_async_error, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swift_async_error:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swift_async_error, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Convention, HandlerParamIdx, I);
|
|
}
|
|
|
|
SwiftAsyncErrorAttr *SwiftAsyncErrorAttr::Create(ASTContext &Ctx, SwiftAsyncErrorAttr::ConventionKind Convention, unsigned HandlerParamIdx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_async_error:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_async_error, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swift_async_error:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swift_async_error, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swift_async_error:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swift_async_error, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Convention, HandlerParamIdx, I);
|
|
}
|
|
|
|
SwiftAsyncErrorAttr::SwiftAsyncErrorAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, SwiftAsyncErrorAttr::ConventionKind Convention
|
|
, unsigned HandlerParamIdx
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftAsyncError, /*IsLateParsed=*/false, false)
|
|
, convention(Convention)
|
|
, handlerParamIdx(HandlerParamIdx)
|
|
{
|
|
}
|
|
|
|
SwiftAsyncErrorAttr::SwiftAsyncErrorAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, SwiftAsyncErrorAttr::ConventionKind Convention
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftAsyncError, /*IsLateParsed=*/false, false)
|
|
, convention(Convention)
|
|
, handlerParamIdx()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool SwiftAsyncErrorAttr::ConvertStrToConventionKind(StringRef Val, SwiftAsyncErrorAttr::ConventionKind &Out) {
|
|
std::optional<SwiftAsyncErrorAttr::ConventionKind> R = llvm::StringSwitch<std::optional<SwiftAsyncErrorAttr::ConventionKind>>(Val)
|
|
.Case("none", SwiftAsyncErrorAttr::ConventionKind::None)
|
|
.Case("nonnull_error", SwiftAsyncErrorAttr::ConventionKind::NonNullError)
|
|
.Case("zero_argument", SwiftAsyncErrorAttr::ConventionKind::ZeroArgument)
|
|
.Case("nonzero_argument", SwiftAsyncErrorAttr::ConventionKind::NonZeroArgument)
|
|
.Default(std::optional<SwiftAsyncErrorAttr::ConventionKind>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *SwiftAsyncErrorAttr::ConvertConventionKindToStr(SwiftAsyncErrorAttr::ConventionKind Val) {
|
|
switch(Val) {
|
|
case SwiftAsyncErrorAttr::ConventionKind::None: return "none";
|
|
case SwiftAsyncErrorAttr::ConventionKind::NonNullError: return "nonnull_error";
|
|
case SwiftAsyncErrorAttr::ConventionKind::ZeroArgument: return "zero_argument";
|
|
case SwiftAsyncErrorAttr::ConventionKind::NonZeroArgument: return "nonzero_argument";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
|
|
|
|
SwiftAsyncErrorAttr *SwiftAsyncErrorAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftAsyncErrorAttr(C, *this, convention, handlerParamIdx);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftAsyncErrorAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_async_error";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << SwiftAsyncErrorAttr::ConvertConventionKindToStr(getConvention()) << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getHandlerParamIdx() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::swift_async_error";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << SwiftAsyncErrorAttr::ConvertConventionKindToStr(getConvention()) << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getHandlerParamIdx() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::swift_async_error";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << SwiftAsyncErrorAttr::ConvertConventionKindToStr(getConvention()) << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getHandlerParamIdx() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftAsyncErrorAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_async_error";
|
|
case 1:
|
|
return "swift_async_error";
|
|
case 2:
|
|
return "swift_async_error";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftAsyncNameAttr implementation
|
|
|
|
SwiftAsyncNameAttr *SwiftAsyncNameAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftAsyncNameAttr(Ctx, CommonInfo, Name);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftAsyncNameAttr *SwiftAsyncNameAttr::Create(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftAsyncNameAttr(Ctx, CommonInfo, Name);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftAsyncNameAttr *SwiftAsyncNameAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Name, I);
|
|
}
|
|
|
|
SwiftAsyncNameAttr *SwiftAsyncNameAttr::Create(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Name, I);
|
|
}
|
|
|
|
SwiftAsyncNameAttr::SwiftAsyncNameAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Name
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftAsyncName, /*IsLateParsed=*/false, false)
|
|
, nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
|
|
{
|
|
if (!Name.empty())
|
|
std::memcpy(name, Name.data(), nameLength);
|
|
}
|
|
|
|
|
|
|
|
SwiftAsyncNameAttr *SwiftAsyncNameAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftAsyncNameAttr(C, *this, getName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftAsyncNameAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_async_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftAsyncNameAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_async_name";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftAttrAttr implementation
|
|
|
|
SwiftAttrAttr *SwiftAttrAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Attribute, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftAttrAttr(Ctx, CommonInfo, Attribute);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftAttrAttr *SwiftAttrAttr::Create(ASTContext &Ctx, llvm::StringRef Attribute, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftAttrAttr(Ctx, CommonInfo, Attribute);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftAttrAttr *SwiftAttrAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Attribute, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Attribute, I);
|
|
}
|
|
|
|
SwiftAttrAttr *SwiftAttrAttr::Create(ASTContext &Ctx, llvm::StringRef Attribute, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Attribute, I);
|
|
}
|
|
|
|
SwiftAttrAttr::SwiftAttrAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Attribute
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftAttr, /*IsLateParsed=*/false, false)
|
|
, attributeLength(Attribute.size()),attribute(new (Ctx, 1) char[attributeLength])
|
|
{
|
|
if (!Attribute.empty())
|
|
std::memcpy(attribute, Attribute.data(), attributeLength);
|
|
}
|
|
|
|
|
|
|
|
SwiftAttrAttr *SwiftAttrAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftAttrAttr(C, *this, getAttribute());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftAttrAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_attr";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAttribute() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftAttrAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_attr";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftBridgeAttr implementation
|
|
|
|
SwiftBridgeAttr *SwiftBridgeAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef SwiftType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftBridgeAttr(Ctx, CommonInfo, SwiftType);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftBridgeAttr *SwiftBridgeAttr::Create(ASTContext &Ctx, llvm::StringRef SwiftType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftBridgeAttr(Ctx, CommonInfo, SwiftType);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftBridgeAttr *SwiftBridgeAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef SwiftType, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, SwiftType, I);
|
|
}
|
|
|
|
SwiftBridgeAttr *SwiftBridgeAttr::Create(ASTContext &Ctx, llvm::StringRef SwiftType, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, SwiftType, I);
|
|
}
|
|
|
|
SwiftBridgeAttr::SwiftBridgeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef SwiftType
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftBridge, /*IsLateParsed=*/false, false)
|
|
, swiftTypeLength(SwiftType.size()),swiftType(new (Ctx, 1) char[swiftTypeLength])
|
|
{
|
|
if (!SwiftType.empty())
|
|
std::memcpy(swiftType, SwiftType.data(), swiftTypeLength);
|
|
}
|
|
|
|
|
|
|
|
SwiftBridgeAttr *SwiftBridgeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftBridgeAttr(C, *this, getSwiftType());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftBridgeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_bridge";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getSwiftType() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftBridgeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_bridge";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftBridgedTypedefAttr implementation
|
|
|
|
SwiftBridgedTypedefAttr *SwiftBridgedTypedefAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftBridgedTypedefAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftBridgedTypedefAttr *SwiftBridgedTypedefAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftBridgedTypedefAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftBridgedTypedefAttr *SwiftBridgedTypedefAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SwiftBridgedTypedefAttr *SwiftBridgedTypedefAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SwiftBridgedTypedefAttr::SwiftBridgedTypedefAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftBridgedTypedef, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SwiftBridgedTypedefAttr *SwiftBridgedTypedefAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftBridgedTypedefAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftBridgedTypedefAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_bridged_typedef";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftBridgedTypedefAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_bridged_typedef";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftCallAttr implementation
|
|
|
|
SwiftCallAttr *SwiftCallAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftCallAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftCallAttr *SwiftCallAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftCallAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftCallAttr *SwiftCallAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swiftcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swiftcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swiftcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swiftcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swiftcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swiftcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SwiftCallAttr *SwiftCallAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swiftcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swiftcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swiftcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swiftcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swiftcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swiftcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SwiftCallAttr::SwiftCallAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftCall, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SwiftCallAttr *SwiftCallAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftCallAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftCallAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swiftcall";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::swiftcall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::swiftcall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftCallAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swiftcall";
|
|
case 1:
|
|
return "swiftcall";
|
|
case 2:
|
|
return "swiftcall";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftContextAttr implementation
|
|
|
|
SwiftContextAttr *SwiftContextAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftContextAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftContextAttr *SwiftContextAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftContextAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftContextAttr *SwiftContextAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_context:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_context, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swift_context:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swift_context, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swift_context:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swift_context, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SwiftContextAttr *SwiftContextAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_context:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_context, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swift_context:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swift_context, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swift_context:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swift_context, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SwiftContextAttr::SwiftContextAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: ParameterABIAttr(Ctx, CommonInfo, attr::SwiftContext, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SwiftContextAttr *SwiftContextAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftContextAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftContextAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_context";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::swift_context";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::swift_context";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftContextAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_context";
|
|
case 1:
|
|
return "swift_context";
|
|
case 2:
|
|
return "swift_context";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftErrorAttr implementation
|
|
|
|
SwiftErrorAttr *SwiftErrorAttr::CreateImplicit(ASTContext &Ctx, SwiftErrorAttr::ConventionKind Convention, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftErrorAttr(Ctx, CommonInfo, Convention);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftErrorAttr *SwiftErrorAttr::Create(ASTContext &Ctx, SwiftErrorAttr::ConventionKind Convention, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftErrorAttr(Ctx, CommonInfo, Convention);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftErrorAttr *SwiftErrorAttr::CreateImplicit(ASTContext &Ctx, SwiftErrorAttr::ConventionKind Convention, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Convention, I);
|
|
}
|
|
|
|
SwiftErrorAttr *SwiftErrorAttr::Create(ASTContext &Ctx, SwiftErrorAttr::ConventionKind Convention, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Convention, I);
|
|
}
|
|
|
|
SwiftErrorAttr::SwiftErrorAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, SwiftErrorAttr::ConventionKind Convention
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftError, /*IsLateParsed=*/false, false)
|
|
, convention(Convention)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool SwiftErrorAttr::ConvertStrToConventionKind(StringRef Val, SwiftErrorAttr::ConventionKind &Out) {
|
|
std::optional<SwiftErrorAttr::ConventionKind> R = llvm::StringSwitch<std::optional<SwiftErrorAttr::ConventionKind>>(Val)
|
|
.Case("none", SwiftErrorAttr::ConventionKind::None)
|
|
.Case("nonnull_error", SwiftErrorAttr::ConventionKind::NonNullError)
|
|
.Case("null_result", SwiftErrorAttr::ConventionKind::NullResult)
|
|
.Case("zero_result", SwiftErrorAttr::ConventionKind::ZeroResult)
|
|
.Case("nonzero_result", SwiftErrorAttr::ConventionKind::NonZeroResult)
|
|
.Default(std::optional<SwiftErrorAttr::ConventionKind>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *SwiftErrorAttr::ConvertConventionKindToStr(SwiftErrorAttr::ConventionKind Val) {
|
|
switch(Val) {
|
|
case SwiftErrorAttr::ConventionKind::None: return "none";
|
|
case SwiftErrorAttr::ConventionKind::NonNullError: return "nonnull_error";
|
|
case SwiftErrorAttr::ConventionKind::NullResult: return "null_result";
|
|
case SwiftErrorAttr::ConventionKind::ZeroResult: return "zero_result";
|
|
case SwiftErrorAttr::ConventionKind::NonZeroResult: return "nonzero_result";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
SwiftErrorAttr *SwiftErrorAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftErrorAttr(C, *this, convention);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftErrorAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_error";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << SwiftErrorAttr::ConvertConventionKindToStr(getConvention()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftErrorAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_error";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftErrorResultAttr implementation
|
|
|
|
SwiftErrorResultAttr *SwiftErrorResultAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftErrorResultAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftErrorResultAttr *SwiftErrorResultAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftErrorResultAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftErrorResultAttr *SwiftErrorResultAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_error_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_error_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swift_error_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swift_error_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swift_error_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swift_error_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SwiftErrorResultAttr *SwiftErrorResultAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_error_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_error_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swift_error_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swift_error_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swift_error_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swift_error_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SwiftErrorResultAttr::SwiftErrorResultAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: ParameterABIAttr(Ctx, CommonInfo, attr::SwiftErrorResult, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SwiftErrorResultAttr *SwiftErrorResultAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftErrorResultAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftErrorResultAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_error_result";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::swift_error_result";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::swift_error_result";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftErrorResultAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_error_result";
|
|
case 1:
|
|
return "swift_error_result";
|
|
case 2:
|
|
return "swift_error_result";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftImportAsNonGenericAttr implementation
|
|
|
|
SwiftImportAsNonGenericAttr *SwiftImportAsNonGenericAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftImportAsNonGenericAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftImportAsNonGenericAttr *SwiftImportAsNonGenericAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftImportAsNonGenericAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftImportAsNonGenericAttr *SwiftImportAsNonGenericAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SwiftImportAsNonGenericAttr *SwiftImportAsNonGenericAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SwiftImportAsNonGenericAttr::SwiftImportAsNonGenericAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftImportAsNonGeneric, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SwiftImportAsNonGenericAttr *SwiftImportAsNonGenericAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftImportAsNonGenericAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftImportAsNonGenericAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *SwiftImportAsNonGenericAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// SwiftImportPropertyAsAccessorsAttr implementation
|
|
|
|
SwiftImportPropertyAsAccessorsAttr *SwiftImportPropertyAsAccessorsAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftImportPropertyAsAccessorsAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftImportPropertyAsAccessorsAttr *SwiftImportPropertyAsAccessorsAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftImportPropertyAsAccessorsAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftImportPropertyAsAccessorsAttr *SwiftImportPropertyAsAccessorsAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SwiftImportPropertyAsAccessorsAttr *SwiftImportPropertyAsAccessorsAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SwiftImportPropertyAsAccessorsAttr::SwiftImportPropertyAsAccessorsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftImportPropertyAsAccessors, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SwiftImportPropertyAsAccessorsAttr *SwiftImportPropertyAsAccessorsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftImportPropertyAsAccessorsAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftImportPropertyAsAccessorsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *SwiftImportPropertyAsAccessorsAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// SwiftIndirectResultAttr implementation
|
|
|
|
SwiftIndirectResultAttr *SwiftIndirectResultAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftIndirectResultAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftIndirectResultAttr *SwiftIndirectResultAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftIndirectResultAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftIndirectResultAttr *SwiftIndirectResultAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_indirect_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_indirect_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swift_indirect_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swift_indirect_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swift_indirect_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swift_indirect_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SwiftIndirectResultAttr *SwiftIndirectResultAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_indirect_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_indirect_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_swift_indirect_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_swift_indirect_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_swift_indirect_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_swift_indirect_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SwiftIndirectResultAttr::SwiftIndirectResultAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: ParameterABIAttr(Ctx, CommonInfo, attr::SwiftIndirectResult, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SwiftIndirectResultAttr *SwiftIndirectResultAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftIndirectResultAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftIndirectResultAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_indirect_result";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::swift_indirect_result";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::swift_indirect_result";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftIndirectResultAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_indirect_result";
|
|
case 1:
|
|
return "swift_indirect_result";
|
|
case 2:
|
|
return "swift_indirect_result";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftNameAttr implementation
|
|
|
|
SwiftNameAttr *SwiftNameAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftNameAttr(Ctx, CommonInfo, Name);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftNameAttr *SwiftNameAttr::Create(ASTContext &Ctx, llvm::StringRef Name, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftNameAttr(Ctx, CommonInfo, Name);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftNameAttr *SwiftNameAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, Name, I);
|
|
}
|
|
|
|
SwiftNameAttr *SwiftNameAttr::Create(ASTContext &Ctx, llvm::StringRef Name, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, Name, I);
|
|
}
|
|
|
|
SwiftNameAttr::SwiftNameAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Name
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftName, /*IsLateParsed=*/false, false)
|
|
, nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
|
|
{
|
|
if (!Name.empty())
|
|
std::memcpy(name, Name.data(), nameLength);
|
|
}
|
|
|
|
|
|
|
|
SwiftNameAttr *SwiftNameAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftNameAttr(C, *this, getName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftNameAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftNameAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_name";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftNewTypeAttr implementation
|
|
|
|
SwiftNewTypeAttr *SwiftNewTypeAttr::CreateImplicit(ASTContext &Ctx, SwiftNewTypeAttr::NewtypeKind NewtypeKind, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftNewTypeAttr(Ctx, CommonInfo, NewtypeKind);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftNewTypeAttr *SwiftNewTypeAttr::Create(ASTContext &Ctx, SwiftNewTypeAttr::NewtypeKind NewtypeKind, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftNewTypeAttr(Ctx, CommonInfo, NewtypeKind);
|
|
return A;
|
|
}
|
|
|
|
SwiftNewTypeAttr *SwiftNewTypeAttr::CreateImplicit(ASTContext &Ctx, SwiftNewTypeAttr::NewtypeKind NewtypeKind, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_newtype:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_newtype, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_swift_wrapper:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_wrapper, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, NewtypeKind, I);
|
|
}
|
|
|
|
SwiftNewTypeAttr *SwiftNewTypeAttr::Create(ASTContext &Ctx, SwiftNewTypeAttr::NewtypeKind NewtypeKind, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_swift_newtype:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_newtype, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_swift_wrapper:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_swift_wrapper, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, NewtypeKind, I);
|
|
}
|
|
|
|
SwiftNewTypeAttr::SwiftNewTypeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, SwiftNewTypeAttr::NewtypeKind NewtypeKind
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftNewType, /*IsLateParsed=*/false, false)
|
|
, newtypeKind(NewtypeKind)
|
|
{
|
|
}
|
|
|
|
SwiftNewTypeAttr::Spelling SwiftNewTypeAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_swift_newtype;
|
|
case 1: return GNU_swift_wrapper;
|
|
}
|
|
}
|
|
|
|
|
|
bool SwiftNewTypeAttr::ConvertStrToNewtypeKind(StringRef Val, SwiftNewTypeAttr::NewtypeKind &Out) {
|
|
std::optional<SwiftNewTypeAttr::NewtypeKind> R = llvm::StringSwitch<std::optional<SwiftNewTypeAttr::NewtypeKind>>(Val)
|
|
.Case("struct", SwiftNewTypeAttr::NewtypeKind::NK_Struct)
|
|
.Case("enum", SwiftNewTypeAttr::NewtypeKind::NK_Enum)
|
|
.Default(std::optional<SwiftNewTypeAttr::NewtypeKind>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *SwiftNewTypeAttr::ConvertNewtypeKindToStr(SwiftNewTypeAttr::NewtypeKind Val) {
|
|
switch(Val) {
|
|
case SwiftNewTypeAttr::NewtypeKind::NK_Struct: return "struct";
|
|
case SwiftNewTypeAttr::NewtypeKind::NK_Enum: return "enum";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
SwiftNewTypeAttr *SwiftNewTypeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftNewTypeAttr(C, *this, newtypeKind);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftNewTypeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_newtype";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << SwiftNewTypeAttr::ConvertNewtypeKindToStr(getNewtypeKind()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__attribute__((swift_wrapper";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << SwiftNewTypeAttr::ConvertNewtypeKindToStr(getNewtypeKind()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftNewTypeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_newtype";
|
|
case 1:
|
|
return "swift_wrapper";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftObjCMembersAttr implementation
|
|
|
|
SwiftObjCMembersAttr *SwiftObjCMembersAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftObjCMembersAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftObjCMembersAttr *SwiftObjCMembersAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftObjCMembersAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftObjCMembersAttr *SwiftObjCMembersAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SwiftObjCMembersAttr *SwiftObjCMembersAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SwiftObjCMembersAttr::SwiftObjCMembersAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::SwiftObjCMembers, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
SwiftObjCMembersAttr *SwiftObjCMembersAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftObjCMembersAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftObjCMembersAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_objc_members";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftObjCMembersAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_objc_members";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftPrivateAttr implementation
|
|
|
|
SwiftPrivateAttr *SwiftPrivateAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftPrivateAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftPrivateAttr *SwiftPrivateAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftPrivateAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftPrivateAttr *SwiftPrivateAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SwiftPrivateAttr *SwiftPrivateAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SwiftPrivateAttr::SwiftPrivateAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SwiftPrivate, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SwiftPrivateAttr *SwiftPrivateAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftPrivateAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftPrivateAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((swift_private";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SwiftPrivateAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "swift_private";
|
|
}
|
|
}
|
|
|
|
|
|
// SwiftVersionedAdditionAttr implementation
|
|
|
|
SwiftVersionedAdditionAttr *SwiftVersionedAdditionAttr::CreateImplicit(ASTContext &Ctx, VersionTuple Version, Attr * AdditionalAttr, bool IsReplacedByActive, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftVersionedAdditionAttr(Ctx, CommonInfo, Version, AdditionalAttr, IsReplacedByActive);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftVersionedAdditionAttr *SwiftVersionedAdditionAttr::Create(ASTContext &Ctx, VersionTuple Version, Attr * AdditionalAttr, bool IsReplacedByActive, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftVersionedAdditionAttr(Ctx, CommonInfo, Version, AdditionalAttr, IsReplacedByActive);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftVersionedAdditionAttr *SwiftVersionedAdditionAttr::CreateImplicit(ASTContext &Ctx, VersionTuple Version, Attr * AdditionalAttr, bool IsReplacedByActive, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, Version, AdditionalAttr, IsReplacedByActive, I);
|
|
}
|
|
|
|
SwiftVersionedAdditionAttr *SwiftVersionedAdditionAttr::Create(ASTContext &Ctx, VersionTuple Version, Attr * AdditionalAttr, bool IsReplacedByActive, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, Version, AdditionalAttr, IsReplacedByActive, I);
|
|
}
|
|
|
|
SwiftVersionedAdditionAttr::SwiftVersionedAdditionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, VersionTuple Version
|
|
, Attr * AdditionalAttr
|
|
, bool IsReplacedByActive
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::SwiftVersionedAddition, /*IsLateParsed=*/false)
|
|
, version(Version)
|
|
, additionalAttr(AdditionalAttr)
|
|
, isReplacedByActive(IsReplacedByActive)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SwiftVersionedAdditionAttr *SwiftVersionedAdditionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftVersionedAdditionAttr(C, *this, getVersion(), additionalAttr, isReplacedByActive);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftVersionedAdditionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *SwiftVersionedAdditionAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// SwiftVersionedRemovalAttr implementation
|
|
|
|
SwiftVersionedRemovalAttr *SwiftVersionedRemovalAttr::CreateImplicit(ASTContext &Ctx, VersionTuple Version, unsigned RawKind, bool IsReplacedByActive, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftVersionedRemovalAttr(Ctx, CommonInfo, Version, RawKind, IsReplacedByActive);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftVersionedRemovalAttr *SwiftVersionedRemovalAttr::Create(ASTContext &Ctx, VersionTuple Version, unsigned RawKind, bool IsReplacedByActive, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SwiftVersionedRemovalAttr(Ctx, CommonInfo, Version, RawKind, IsReplacedByActive);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SwiftVersionedRemovalAttr *SwiftVersionedRemovalAttr::CreateImplicit(ASTContext &Ctx, VersionTuple Version, unsigned RawKind, bool IsReplacedByActive, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return CreateImplicit(Ctx, Version, RawKind, IsReplacedByActive, I);
|
|
}
|
|
|
|
SwiftVersionedRemovalAttr *SwiftVersionedRemovalAttr::Create(ASTContext &Ctx, VersionTuple Version, unsigned RawKind, bool IsReplacedByActive, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, AttributeCommonInfo::Form::Implicit());
|
|
return Create(Ctx, Version, RawKind, IsReplacedByActive, I);
|
|
}
|
|
|
|
SwiftVersionedRemovalAttr::SwiftVersionedRemovalAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, VersionTuple Version
|
|
, unsigned RawKind
|
|
, bool IsReplacedByActive
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::SwiftVersionedRemoval, /*IsLateParsed=*/false)
|
|
, version(Version)
|
|
, rawKind(RawKind)
|
|
, isReplacedByActive(IsReplacedByActive)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SwiftVersionedRemovalAttr *SwiftVersionedRemovalAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SwiftVersionedRemovalAttr(C, *this, getVersion(), rawKind, isReplacedByActive);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SwiftVersionedRemovalAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
}
|
|
|
|
const char *SwiftVersionedRemovalAttr::getSpelling() const {
|
|
return "(No spelling)";
|
|
}
|
|
|
|
|
|
// SysVABIAttr implementation
|
|
|
|
SysVABIAttr *SysVABIAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SysVABIAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SysVABIAttr *SysVABIAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) SysVABIAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
SysVABIAttr *SysVABIAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_sysv_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_sysv_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_sysv_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_sysv_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_sysv_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_sysv_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
SysVABIAttr *SysVABIAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_sysv_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_sysv_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_sysv_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_sysv_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_sysv_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_sysv_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
SysVABIAttr::SysVABIAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::SysVABI, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
SysVABIAttr *SysVABIAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) SysVABIAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void SysVABIAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((sysv_abi";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::sysv_abi";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::sysv_abi";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *SysVABIAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "sysv_abi";
|
|
case 1:
|
|
return "sysv_abi";
|
|
case 2:
|
|
return "sysv_abi";
|
|
}
|
|
}
|
|
|
|
|
|
// TLSModelAttr implementation
|
|
|
|
TLSModelAttr *TLSModelAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Model, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TLSModelAttr(Ctx, CommonInfo, Model);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TLSModelAttr *TLSModelAttr::Create(ASTContext &Ctx, llvm::StringRef Model, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TLSModelAttr(Ctx, CommonInfo, Model);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TLSModelAttr *TLSModelAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Model, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_tls_model:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_tls_model, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_tls_model:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_tls_model, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_tls_model:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_tls_model, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Model, I);
|
|
}
|
|
|
|
TLSModelAttr *TLSModelAttr::Create(ASTContext &Ctx, llvm::StringRef Model, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_tls_model:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_tls_model, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_tls_model:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_tls_model, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_tls_model:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_tls_model, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Model, I);
|
|
}
|
|
|
|
TLSModelAttr::TLSModelAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Model
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::TLSModel, /*IsLateParsed=*/false, false)
|
|
, modelLength(Model.size()),model(new (Ctx, 1) char[modelLength])
|
|
{
|
|
if (!Model.empty())
|
|
std::memcpy(model, Model.data(), modelLength);
|
|
}
|
|
|
|
|
|
|
|
TLSModelAttr *TLSModelAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TLSModelAttr(C, *this, getModel());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TLSModelAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((tls_model";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getModel() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::tls_model";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getModel() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::tls_model";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getModel() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TLSModelAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "tls_model";
|
|
case 1:
|
|
return "tls_model";
|
|
case 2:
|
|
return "tls_model";
|
|
}
|
|
}
|
|
|
|
|
|
// TargetAttr implementation
|
|
|
|
TargetAttr *TargetAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef FeaturesStr, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TargetAttr(Ctx, CommonInfo, FeaturesStr);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TargetAttr *TargetAttr::Create(ASTContext &Ctx, llvm::StringRef FeaturesStr, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TargetAttr(Ctx, CommonInfo, FeaturesStr);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TargetAttr *TargetAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef FeaturesStr, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_target:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_target, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_target:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_target, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_target:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_target, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, FeaturesStr, I);
|
|
}
|
|
|
|
TargetAttr *TargetAttr::Create(ASTContext &Ctx, llvm::StringRef FeaturesStr, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_target:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_target, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_target:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_target, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_target:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_target, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, FeaturesStr, I);
|
|
}
|
|
|
|
TargetAttr::TargetAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef FeaturesStr
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Target, /*IsLateParsed=*/false, false)
|
|
, featuresStrLength(FeaturesStr.size()),featuresStr(new (Ctx, 1) char[featuresStrLength])
|
|
{
|
|
if (!FeaturesStr.empty())
|
|
std::memcpy(featuresStr, FeaturesStr.data(), featuresStrLength);
|
|
}
|
|
|
|
|
|
|
|
TargetAttr *TargetAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TargetAttr(C, *this, getFeaturesStr());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TargetAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((target";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getFeaturesStr() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::target";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getFeaturesStr() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::target";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getFeaturesStr() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TargetAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "target";
|
|
case 1:
|
|
return "target";
|
|
case 2:
|
|
return "target";
|
|
}
|
|
}
|
|
|
|
|
|
// TargetClonesAttr implementation
|
|
|
|
TargetClonesAttr *TargetClonesAttr::CreateImplicit(ASTContext &Ctx, StringRef *FeaturesStrs, unsigned FeaturesStrsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TargetClonesAttr(Ctx, CommonInfo, FeaturesStrs, FeaturesStrsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TargetClonesAttr *TargetClonesAttr::Create(ASTContext &Ctx, StringRef *FeaturesStrs, unsigned FeaturesStrsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TargetClonesAttr(Ctx, CommonInfo, FeaturesStrs, FeaturesStrsSize);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TargetClonesAttr *TargetClonesAttr::CreateImplicit(ASTContext &Ctx, StringRef *FeaturesStrs, unsigned FeaturesStrsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_target_clones:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_target_clones, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_target_clones:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_target_clones, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_target_clones:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_target_clones, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, FeaturesStrs, FeaturesStrsSize, I);
|
|
}
|
|
|
|
TargetClonesAttr *TargetClonesAttr::Create(ASTContext &Ctx, StringRef *FeaturesStrs, unsigned FeaturesStrsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_target_clones:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_target_clones, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_target_clones:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_target_clones, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_target_clones:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_target_clones, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, FeaturesStrs, FeaturesStrsSize, I);
|
|
}
|
|
|
|
TargetClonesAttr::TargetClonesAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, StringRef *FeaturesStrs, unsigned FeaturesStrsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::TargetClones, /*IsLateParsed=*/false, false)
|
|
, featuresStrs_Size(FeaturesStrsSize), featuresStrs_(new (Ctx, 16) StringRef[featuresStrs_Size])
|
|
{
|
|
for (size_t I = 0, E = featuresStrs_Size; I != E;
|
|
++I) {
|
|
StringRef Ref = FeaturesStrs[I];
|
|
if (!Ref.empty()) {
|
|
char *Mem = new (Ctx, 1) char[Ref.size()];
|
|
std::memcpy(Mem, Ref.data(), Ref.size());
|
|
featuresStrs_[I] = StringRef(Mem, Ref.size());
|
|
}
|
|
}
|
|
}
|
|
|
|
TargetClonesAttr::TargetClonesAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::TargetClones, /*IsLateParsed=*/false, false)
|
|
, featuresStrs_Size(0), featuresStrs_(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
TargetClonesAttr *TargetClonesAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TargetClonesAttr(C, *this, featuresStrs_, featuresStrs_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TargetClonesAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((target_clones";
|
|
OS << "";
|
|
for (const auto &Val : featuresStrs()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::target_clones";
|
|
OS << "";
|
|
for (const auto &Val : featuresStrs()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::target_clones";
|
|
OS << "";
|
|
for (const auto &Val : featuresStrs()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << Val << "\"";
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TargetClonesAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "target_clones";
|
|
case 1:
|
|
return "target_clones";
|
|
case 2:
|
|
return "target_clones";
|
|
}
|
|
}
|
|
|
|
|
|
// TargetVersionAttr implementation
|
|
|
|
TargetVersionAttr *TargetVersionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef NamesStr, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TargetVersionAttr(Ctx, CommonInfo, NamesStr);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TargetVersionAttr *TargetVersionAttr::Create(ASTContext &Ctx, llvm::StringRef NamesStr, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TargetVersionAttr(Ctx, CommonInfo, NamesStr);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TargetVersionAttr *TargetVersionAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef NamesStr, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_target_version:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_target_version, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_target_version:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_target_version, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_target_version:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_target_version, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, NamesStr, I);
|
|
}
|
|
|
|
TargetVersionAttr *TargetVersionAttr::Create(ASTContext &Ctx, llvm::StringRef NamesStr, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_target_version:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_target_version, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_target_version:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_target_version, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_target_version:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_target_version, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, NamesStr, I);
|
|
}
|
|
|
|
TargetVersionAttr::TargetVersionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef NamesStr
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::TargetVersion, /*IsLateParsed=*/false, false)
|
|
, namesStrLength(NamesStr.size()),namesStr(new (Ctx, 1) char[namesStrLength])
|
|
{
|
|
if (!NamesStr.empty())
|
|
std::memcpy(namesStr, NamesStr.data(), namesStrLength);
|
|
}
|
|
|
|
|
|
|
|
TargetVersionAttr *TargetVersionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TargetVersionAttr(C, *this, getNamesStr());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TargetVersionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((target_version";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getNamesStr() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::target_version";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getNamesStr() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::target_version";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getNamesStr() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TargetVersionAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "target_version";
|
|
case 1:
|
|
return "target_version";
|
|
case 2:
|
|
return "target_version";
|
|
}
|
|
}
|
|
|
|
|
|
// TestTypestateAttr implementation
|
|
|
|
TestTypestateAttr *TestTypestateAttr::CreateImplicit(ASTContext &Ctx, TestTypestateAttr::ConsumedState TestState, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TestTypestateAttr(Ctx, CommonInfo, TestState);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TestTypestateAttr *TestTypestateAttr::Create(ASTContext &Ctx, TestTypestateAttr::ConsumedState TestState, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TestTypestateAttr(Ctx, CommonInfo, TestState);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TestTypestateAttr *TestTypestateAttr::CreateImplicit(ASTContext &Ctx, TestTypestateAttr::ConsumedState TestState, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_test_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_test_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_test_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_test_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, TestState, I);
|
|
}
|
|
|
|
TestTypestateAttr *TestTypestateAttr::Create(ASTContext &Ctx, TestTypestateAttr::ConsumedState TestState, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_test_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_test_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_test_typestate:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_test_typestate, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, TestState, I);
|
|
}
|
|
|
|
TestTypestateAttr::TestTypestateAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, TestTypestateAttr::ConsumedState TestState
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::TestTypestate, /*IsLateParsed=*/false, false)
|
|
, testState(TestState)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool TestTypestateAttr::ConvertStrToConsumedState(StringRef Val, TestTypestateAttr::ConsumedState &Out) {
|
|
std::optional<TestTypestateAttr::ConsumedState> R = llvm::StringSwitch<std::optional<TestTypestateAttr::ConsumedState>>(Val)
|
|
.Case("consumed", TestTypestateAttr::ConsumedState::Consumed)
|
|
.Case("unconsumed", TestTypestateAttr::ConsumedState::Unconsumed)
|
|
.Default(std::optional<TestTypestateAttr::ConsumedState>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *TestTypestateAttr::ConvertConsumedStateToStr(TestTypestateAttr::ConsumedState Val) {
|
|
switch(Val) {
|
|
case TestTypestateAttr::ConsumedState::Consumed: return "consumed";
|
|
case TestTypestateAttr::ConsumedState::Unconsumed: return "unconsumed";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
TestTypestateAttr *TestTypestateAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TestTypestateAttr(C, *this, testState);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TestTypestateAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((test_typestate";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << TestTypestateAttr::ConvertConsumedStateToStr(getTestState()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::test_typestate";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << TestTypestateAttr::ConvertConsumedStateToStr(getTestState()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TestTypestateAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "test_typestate";
|
|
case 1:
|
|
return "test_typestate";
|
|
}
|
|
}
|
|
|
|
|
|
// ThisCallAttr implementation
|
|
|
|
ThisCallAttr *ThisCallAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ThisCallAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ThisCallAttr *ThisCallAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ThisCallAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ThisCallAttr *ThisCallAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_thiscall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_thiscall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_thiscall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_thiscall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_thiscall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_thiscall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_thiscall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_thiscall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ThisCallAttr *ThisCallAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_thiscall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_thiscall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_thiscall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_thiscall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_thiscall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_thiscall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_thiscall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_thiscall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ThisCallAttr::ThisCallAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ThisCall, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
ThisCallAttr *ThisCallAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ThisCallAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ThisCallAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((thiscall";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::thiscall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::thiscall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__thiscall";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "_thiscall";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ThisCallAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "thiscall";
|
|
case 1:
|
|
return "thiscall";
|
|
case 2:
|
|
return "thiscall";
|
|
case 3:
|
|
return "__thiscall";
|
|
case 4:
|
|
return "_thiscall";
|
|
}
|
|
}
|
|
|
|
|
|
// ThreadAttr implementation
|
|
|
|
ThreadAttr *ThreadAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ThreadAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ThreadAttr *ThreadAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ThreadAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ThreadAttr *ThreadAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
ThreadAttr *ThreadAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
ThreadAttr::ThreadAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: Attr(Ctx, CommonInfo, attr::Thread, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
ThreadAttr *ThreadAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ThreadAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ThreadAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(thread";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ThreadAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "thread";
|
|
}
|
|
}
|
|
|
|
|
|
// TransparentUnionAttr implementation
|
|
|
|
TransparentUnionAttr *TransparentUnionAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TransparentUnionAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TransparentUnionAttr *TransparentUnionAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TransparentUnionAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TransparentUnionAttr *TransparentUnionAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_transparent_union:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_transparent_union, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_transparent_union:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_transparent_union, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_transparent_union:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_transparent_union, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
TransparentUnionAttr *TransparentUnionAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_transparent_union:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_transparent_union, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_transparent_union:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_transparent_union, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_transparent_union:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_transparent_union, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
TransparentUnionAttr::TransparentUnionAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::TransparentUnion, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
TransparentUnionAttr *TransparentUnionAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TransparentUnionAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TransparentUnionAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((transparent_union";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::transparent_union";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::transparent_union";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TransparentUnionAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "transparent_union";
|
|
case 1:
|
|
return "transparent_union";
|
|
case 2:
|
|
return "transparent_union";
|
|
}
|
|
}
|
|
|
|
|
|
// TrivialABIAttr implementation
|
|
|
|
TrivialABIAttr *TrivialABIAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TrivialABIAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TrivialABIAttr *TrivialABIAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TrivialABIAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TrivialABIAttr *TrivialABIAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_trivial_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_trivial_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_trivial_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_trivial_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
TrivialABIAttr *TrivialABIAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_trivial_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_trivial_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_trivial_abi:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_trivial_abi, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
TrivialABIAttr::TrivialABIAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::TrivialABI, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
TrivialABIAttr *TrivialABIAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TrivialABIAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TrivialABIAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((trivial_abi";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::trivial_abi";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TrivialABIAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "trivial_abi";
|
|
case 1:
|
|
return "trivial_abi";
|
|
}
|
|
}
|
|
|
|
|
|
// TryAcquireCapabilityAttr implementation
|
|
|
|
TryAcquireCapabilityAttr *TryAcquireCapabilityAttr::CreateImplicit(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TryAcquireCapabilityAttr(Ctx, CommonInfo, SuccessValue, Args, ArgsSize);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TryAcquireCapabilityAttr *TryAcquireCapabilityAttr::Create(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TryAcquireCapabilityAttr(Ctx, CommonInfo, SuccessValue, Args, ArgsSize);
|
|
return A;
|
|
}
|
|
|
|
TryAcquireCapabilityAttr *TryAcquireCapabilityAttr::CreateImplicit(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_try_acquire_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_try_acquire_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_try_acquire_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_try_acquire_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_try_acquire_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_try_acquire_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_try_acquire_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_try_acquire_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, SuccessValue, Args, ArgsSize, I);
|
|
}
|
|
|
|
TryAcquireCapabilityAttr *TryAcquireCapabilityAttr::Create(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_try_acquire_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_try_acquire_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_try_acquire_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_try_acquire_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_try_acquire_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_try_acquire_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_try_acquire_shared_capability:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_try_acquire_shared_capability, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, SuccessValue, Args, ArgsSize, I);
|
|
}
|
|
|
|
TryAcquireCapabilityAttr::TryAcquireCapabilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * SuccessValue
|
|
, Expr * *Args, unsigned ArgsSize
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::TryAcquireCapability, /*IsLateParsed=*/true, true)
|
|
, successValue(SuccessValue)
|
|
, args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
|
|
{
|
|
std::copy(Args, Args + args_Size, args_);
|
|
}
|
|
|
|
TryAcquireCapabilityAttr::TryAcquireCapabilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, Expr * SuccessValue
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::TryAcquireCapability, /*IsLateParsed=*/true, true)
|
|
, successValue(SuccessValue)
|
|
, args_Size(0), args_(nullptr)
|
|
{
|
|
}
|
|
|
|
TryAcquireCapabilityAttr::Spelling TryAcquireCapabilityAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_try_acquire_capability;
|
|
case 1: return CXX11_clang_try_acquire_capability;
|
|
case 2: return GNU_try_acquire_shared_capability;
|
|
case 3: return CXX11_clang_try_acquire_shared_capability;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
TryAcquireCapabilityAttr *TryAcquireCapabilityAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TryAcquireCapabilityAttr(C, *this, successValue, args_, args_Size);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TryAcquireCapabilityAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((try_acquire_capability";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getSuccessValue()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::try_acquire_capability";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getSuccessValue()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "__attribute__((try_acquire_shared_capability";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getSuccessValue()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[clang::try_acquire_shared_capability";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "";
|
|
getSuccessValue()->printPretty(OS, nullptr, Policy);
|
|
OS << "";
|
|
OS << "";
|
|
for (const auto &Val : args()) {
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << Val;
|
|
}
|
|
OS << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TryAcquireCapabilityAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "try_acquire_capability";
|
|
case 1:
|
|
return "try_acquire_capability";
|
|
case 2:
|
|
return "try_acquire_shared_capability";
|
|
case 3:
|
|
return "try_acquire_shared_capability";
|
|
}
|
|
}
|
|
|
|
|
|
// TypeNonNullAttr implementation
|
|
|
|
TypeNonNullAttr *TypeNonNullAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TypeNonNullAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TypeNonNullAttr *TypeNonNullAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TypeNonNullAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TypeNonNullAttr *TypeNonNullAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
TypeNonNullAttr *TypeNonNullAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
TypeNonNullAttr::TypeNonNullAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::TypeNonNull, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
TypeNonNullAttr *TypeNonNullAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TypeNonNullAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TypeNonNullAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "_Nonnull";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TypeNonNullAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "_Nonnull";
|
|
}
|
|
}
|
|
|
|
|
|
// TypeNullUnspecifiedAttr implementation
|
|
|
|
TypeNullUnspecifiedAttr *TypeNullUnspecifiedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TypeNullUnspecifiedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TypeNullUnspecifiedAttr *TypeNullUnspecifiedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TypeNullUnspecifiedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TypeNullUnspecifiedAttr *TypeNullUnspecifiedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
TypeNullUnspecifiedAttr *TypeNullUnspecifiedAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
TypeNullUnspecifiedAttr::TypeNullUnspecifiedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::TypeNullUnspecified, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
TypeNullUnspecifiedAttr *TypeNullUnspecifiedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TypeNullUnspecifiedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TypeNullUnspecifiedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "_Null_unspecified";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TypeNullUnspecifiedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "_Null_unspecified";
|
|
}
|
|
}
|
|
|
|
|
|
// TypeNullableAttr implementation
|
|
|
|
TypeNullableAttr *TypeNullableAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TypeNullableAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TypeNullableAttr *TypeNullableAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TypeNullableAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TypeNullableAttr *TypeNullableAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
TypeNullableAttr *TypeNullableAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
TypeNullableAttr::TypeNullableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::TypeNullable, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
TypeNullableAttr *TypeNullableAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TypeNullableAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TypeNullableAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "_Nullable";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TypeNullableAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "_Nullable";
|
|
}
|
|
}
|
|
|
|
|
|
// TypeNullableResultAttr implementation
|
|
|
|
TypeNullableResultAttr *TypeNullableResultAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TypeNullableResultAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TypeNullableResultAttr *TypeNullableResultAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TypeNullableResultAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TypeNullableResultAttr *TypeNullableResultAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
TypeNullableResultAttr *TypeNullableResultAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
TypeNullableResultAttr::TypeNullableResultAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::TypeNullableResult, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
TypeNullableResultAttr *TypeNullableResultAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TypeNullableResultAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TypeNullableResultAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "_Nullable_result";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TypeNullableResultAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "_Nullable_result";
|
|
}
|
|
}
|
|
|
|
|
|
// TypeTagForDatatypeAttr implementation
|
|
|
|
TypeTagForDatatypeAttr *TypeTagForDatatypeAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * ArgumentKind, TypeSourceInfo * MatchingCType, bool LayoutCompatible, bool MustBeNull, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TypeTagForDatatypeAttr(Ctx, CommonInfo, ArgumentKind, MatchingCType, LayoutCompatible, MustBeNull);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TypeTagForDatatypeAttr *TypeTagForDatatypeAttr::Create(ASTContext &Ctx, IdentifierInfo * ArgumentKind, TypeSourceInfo * MatchingCType, bool LayoutCompatible, bool MustBeNull, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TypeTagForDatatypeAttr(Ctx, CommonInfo, ArgumentKind, MatchingCType, LayoutCompatible, MustBeNull);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TypeTagForDatatypeAttr *TypeTagForDatatypeAttr::CreateImplicit(ASTContext &Ctx, IdentifierInfo * ArgumentKind, TypeSourceInfo * MatchingCType, bool LayoutCompatible, bool MustBeNull, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_type_tag_for_datatype:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_type_tag_for_datatype, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_type_tag_for_datatype:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_type_tag_for_datatype, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_type_tag_for_datatype:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_type_tag_for_datatype, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, ArgumentKind, MatchingCType, LayoutCompatible, MustBeNull, I);
|
|
}
|
|
|
|
TypeTagForDatatypeAttr *TypeTagForDatatypeAttr::Create(ASTContext &Ctx, IdentifierInfo * ArgumentKind, TypeSourceInfo * MatchingCType, bool LayoutCompatible, bool MustBeNull, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_type_tag_for_datatype:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_type_tag_for_datatype, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_type_tag_for_datatype:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_type_tag_for_datatype, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_type_tag_for_datatype:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_type_tag_for_datatype, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, ArgumentKind, MatchingCType, LayoutCompatible, MustBeNull, I);
|
|
}
|
|
|
|
TypeTagForDatatypeAttr::TypeTagForDatatypeAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, IdentifierInfo * ArgumentKind
|
|
, TypeSourceInfo * MatchingCType
|
|
, bool LayoutCompatible
|
|
, bool MustBeNull
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::TypeTagForDatatype, /*IsLateParsed=*/false, false)
|
|
, argumentKind(ArgumentKind)
|
|
, matchingCType(MatchingCType)
|
|
, layoutCompatible(LayoutCompatible)
|
|
, mustBeNull(MustBeNull)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TypeTagForDatatypeAttr *TypeTagForDatatypeAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TypeTagForDatatypeAttr(C, *this, argumentKind, matchingCType, layoutCompatible, mustBeNull);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TypeTagForDatatypeAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((type_tag_for_datatype";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getArgumentKind() ? getArgumentKind()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getMatchingCType().getAsString() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getLayoutCompatible() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getMustBeNull() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::type_tag_for_datatype";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getArgumentKind() ? getArgumentKind()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getMatchingCType().getAsString() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getLayoutCompatible() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getMustBeNull() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::type_tag_for_datatype";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << (getArgumentKind() ? getArgumentKind()->getName() : "") << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getMatchingCType().getAsString() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getLayoutCompatible() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getMustBeNull() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TypeTagForDatatypeAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "type_tag_for_datatype";
|
|
case 1:
|
|
return "type_tag_for_datatype";
|
|
case 2:
|
|
return "type_tag_for_datatype";
|
|
}
|
|
}
|
|
|
|
|
|
// TypeVisibilityAttr implementation
|
|
|
|
TypeVisibilityAttr *TypeVisibilityAttr::CreateImplicit(ASTContext &Ctx, TypeVisibilityAttr::VisibilityType Visibility, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TypeVisibilityAttr(Ctx, CommonInfo, Visibility);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TypeVisibilityAttr *TypeVisibilityAttr::Create(ASTContext &Ctx, TypeVisibilityAttr::VisibilityType Visibility, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) TypeVisibilityAttr(Ctx, CommonInfo, Visibility);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
TypeVisibilityAttr *TypeVisibilityAttr::CreateImplicit(ASTContext &Ctx, TypeVisibilityAttr::VisibilityType Visibility, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_type_visibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_type_visibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_type_visibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_type_visibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_type_visibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_type_visibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Visibility, I);
|
|
}
|
|
|
|
TypeVisibilityAttr *TypeVisibilityAttr::Create(ASTContext &Ctx, TypeVisibilityAttr::VisibilityType Visibility, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_type_visibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_type_visibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_type_visibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_type_visibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_type_visibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_type_visibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Visibility, I);
|
|
}
|
|
|
|
TypeVisibilityAttr::TypeVisibilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, TypeVisibilityAttr::VisibilityType Visibility
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::TypeVisibility, /*IsLateParsed=*/false, false)
|
|
, visibility(Visibility)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool TypeVisibilityAttr::ConvertStrToVisibilityType(StringRef Val, TypeVisibilityAttr::VisibilityType &Out) {
|
|
std::optional<TypeVisibilityAttr::VisibilityType> R = llvm::StringSwitch<std::optional<TypeVisibilityAttr::VisibilityType>>(Val)
|
|
.Case("default", TypeVisibilityAttr::VisibilityType::Default)
|
|
.Case("hidden", TypeVisibilityAttr::VisibilityType::Hidden)
|
|
.Case("internal", TypeVisibilityAttr::VisibilityType::Hidden)
|
|
.Case("protected", TypeVisibilityAttr::VisibilityType::Protected)
|
|
.Default(std::optional<TypeVisibilityAttr::VisibilityType>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *TypeVisibilityAttr::ConvertVisibilityTypeToStr(TypeVisibilityAttr::VisibilityType Val) {
|
|
switch(Val) {
|
|
case TypeVisibilityAttr::VisibilityType::Default: return "default";
|
|
case TypeVisibilityAttr::VisibilityType::Hidden: return "hidden";
|
|
case TypeVisibilityAttr::VisibilityType::Protected: return "protected";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
TypeVisibilityAttr *TypeVisibilityAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) TypeVisibilityAttr(C, *this, visibility);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void TypeVisibilityAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((type_visibility";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << TypeVisibilityAttr::ConvertVisibilityTypeToStr(getVisibility()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::type_visibility";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << TypeVisibilityAttr::ConvertVisibilityTypeToStr(getVisibility()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::type_visibility";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << TypeVisibilityAttr::ConvertVisibilityTypeToStr(getVisibility()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *TypeVisibilityAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "type_visibility";
|
|
case 1:
|
|
return "type_visibility";
|
|
case 2:
|
|
return "type_visibility";
|
|
}
|
|
}
|
|
|
|
|
|
// UPtrAttr implementation
|
|
|
|
UPtrAttr *UPtrAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UPtrAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UPtrAttr *UPtrAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UPtrAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UPtrAttr *UPtrAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
UPtrAttr *UPtrAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
UPtrAttr::UPtrAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::UPtr, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
UPtrAttr *UPtrAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) UPtrAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void UPtrAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__uptr";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *UPtrAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__uptr";
|
|
}
|
|
}
|
|
|
|
|
|
// UnavailableAttr implementation
|
|
|
|
UnavailableAttr *UnavailableAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, UnavailableAttr::ImplicitReason ImplicitReason, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UnavailableAttr(Ctx, CommonInfo, Message, ImplicitReason);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UnavailableAttr *UnavailableAttr::Create(ASTContext &Ctx, llvm::StringRef Message, UnavailableAttr::ImplicitReason ImplicitReason, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UnavailableAttr(Ctx, CommonInfo, Message, ImplicitReason);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UnavailableAttr *UnavailableAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, UnavailableAttr::ImplicitReason ImplicitReason, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Message, ImplicitReason, I);
|
|
}
|
|
|
|
UnavailableAttr *UnavailableAttr::Create(ASTContext &Ctx, llvm::StringRef Message, UnavailableAttr::ImplicitReason ImplicitReason, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Message, ImplicitReason, I);
|
|
}
|
|
|
|
UnavailableAttr *UnavailableAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UnavailableAttr(Ctx, CommonInfo, Message);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UnavailableAttr *UnavailableAttr::Create(ASTContext &Ctx, llvm::StringRef Message, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UnavailableAttr(Ctx, CommonInfo, Message);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UnavailableAttr *UnavailableAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Message, I);
|
|
}
|
|
|
|
UnavailableAttr *UnavailableAttr::Create(ASTContext &Ctx, llvm::StringRef Message, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_unavailable:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_unavailable, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Message, I);
|
|
}
|
|
|
|
UnavailableAttr::UnavailableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Message
|
|
, UnavailableAttr::ImplicitReason ImplicitReason
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Unavailable, /*IsLateParsed=*/false, false)
|
|
, messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
|
|
, implicitReason(ImplicitReason)
|
|
{
|
|
if (!Message.empty())
|
|
std::memcpy(message, Message.data(), messageLength);
|
|
}
|
|
|
|
UnavailableAttr::UnavailableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Message
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Unavailable, /*IsLateParsed=*/false, false)
|
|
, messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
|
|
, implicitReason(UnavailableAttr::ImplicitReason(0))
|
|
{
|
|
if (!Message.empty())
|
|
std::memcpy(message, Message.data(), messageLength);
|
|
}
|
|
|
|
UnavailableAttr::UnavailableAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Unavailable, /*IsLateParsed=*/false, false)
|
|
, messageLength(0),message(nullptr)
|
|
, implicitReason(UnavailableAttr::ImplicitReason(0))
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UnavailableAttr *UnavailableAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) UnavailableAttr(C, *this, getMessage(), implicitReason);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void UnavailableAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((unavailable";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::unavailable";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::unavailable";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *UnavailableAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "unavailable";
|
|
case 1:
|
|
return "unavailable";
|
|
case 2:
|
|
return "unavailable";
|
|
}
|
|
}
|
|
|
|
|
|
// UninitializedAttr implementation
|
|
|
|
UninitializedAttr *UninitializedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UninitializedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UninitializedAttr *UninitializedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UninitializedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UninitializedAttr *UninitializedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_uninitialized:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_uninitialized, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_uninitialized:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_uninitialized, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
UninitializedAttr *UninitializedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_uninitialized:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_uninitialized, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_uninitialized:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_uninitialized, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
UninitializedAttr::UninitializedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Uninitialized, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
UninitializedAttr *UninitializedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) UninitializedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void UninitializedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((uninitialized";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::uninitialized";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *UninitializedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "uninitialized";
|
|
case 1:
|
|
return "uninitialized";
|
|
}
|
|
}
|
|
|
|
|
|
// UnlikelyAttr implementation
|
|
|
|
UnlikelyAttr *UnlikelyAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UnlikelyAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UnlikelyAttr *UnlikelyAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UnlikelyAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UnlikelyAttr *UnlikelyAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_unlikely:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_unlikely, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_unlikely:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_unlikely, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
UnlikelyAttr *UnlikelyAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_unlikely:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_unlikely, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_unlikely:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_unlikely, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
UnlikelyAttr::UnlikelyAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: StmtAttr(Ctx, CommonInfo, attr::Unlikely, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
UnlikelyAttr *UnlikelyAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) UnlikelyAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void UnlikelyAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[unlikely";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::unlikely";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *UnlikelyAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "unlikely";
|
|
case 1:
|
|
return "unlikely";
|
|
}
|
|
}
|
|
|
|
|
|
// UnsafeBufferUsageAttr implementation
|
|
|
|
UnsafeBufferUsageAttr *UnsafeBufferUsageAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UnsafeBufferUsageAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UnsafeBufferUsageAttr *UnsafeBufferUsageAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UnsafeBufferUsageAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UnsafeBufferUsageAttr *UnsafeBufferUsageAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_unsafe_buffer_usage:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_unsafe_buffer_usage, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_unsafe_buffer_usage:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_unsafe_buffer_usage, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_unsafe_buffer_usage:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_unsafe_buffer_usage, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
UnsafeBufferUsageAttr *UnsafeBufferUsageAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_unsafe_buffer_usage:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_unsafe_buffer_usage, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_unsafe_buffer_usage:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_unsafe_buffer_usage, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_unsafe_buffer_usage:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_unsafe_buffer_usage, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
UnsafeBufferUsageAttr::UnsafeBufferUsageAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::UnsafeBufferUsage, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
UnsafeBufferUsageAttr *UnsafeBufferUsageAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) UnsafeBufferUsageAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void UnsafeBufferUsageAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((unsafe_buffer_usage";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::unsafe_buffer_usage";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::unsafe_buffer_usage";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *UnsafeBufferUsageAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "unsafe_buffer_usage";
|
|
case 1:
|
|
return "unsafe_buffer_usage";
|
|
case 2:
|
|
return "unsafe_buffer_usage";
|
|
}
|
|
}
|
|
|
|
|
|
// UnusedAttr implementation
|
|
|
|
UnusedAttr *UnusedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UnusedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UnusedAttr *UnusedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UnusedAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
UnusedAttr *UnusedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_maybe_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_maybe_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_maybe_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_maybe_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
UnusedAttr *UnusedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_maybe_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_maybe_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_maybe_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_maybe_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
UnusedAttr::UnusedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Unused, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
UnusedAttr::Spelling UnusedAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return CXX11_maybe_unused;
|
|
case 1: return GNU_unused;
|
|
case 2: return CXX11_gnu_unused;
|
|
case 3: return C23_gnu_unused;
|
|
case 4: return C23_maybe_unused;
|
|
}
|
|
}
|
|
UnusedAttr *UnusedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) UnusedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void UnusedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[maybe_unused";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "__attribute__((unused";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::unused";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "[[gnu::unused";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[maybe_unused";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *UnusedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "maybe_unused";
|
|
case 1:
|
|
return "unused";
|
|
case 2:
|
|
return "unused";
|
|
case 3:
|
|
return "unused";
|
|
case 4:
|
|
return "maybe_unused";
|
|
}
|
|
}
|
|
|
|
|
|
// UseHandleAttr implementation
|
|
|
|
UseHandleAttr *UseHandleAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef HandleType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UseHandleAttr(Ctx, CommonInfo, HandleType);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UseHandleAttr *UseHandleAttr::Create(ASTContext &Ctx, llvm::StringRef HandleType, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UseHandleAttr(Ctx, CommonInfo, HandleType);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UseHandleAttr *UseHandleAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef HandleType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_use_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_use_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_use_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_use_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_use_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_use_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, HandleType, I);
|
|
}
|
|
|
|
UseHandleAttr *UseHandleAttr::Create(ASTContext &Ctx, llvm::StringRef HandleType, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_use_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_use_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_use_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_use_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_use_handle:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_use_handle, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, HandleType, I);
|
|
}
|
|
|
|
UseHandleAttr::UseHandleAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef HandleType
|
|
)
|
|
: InheritableParamAttr(Ctx, CommonInfo, attr::UseHandle, /*IsLateParsed=*/false, false)
|
|
, handleTypeLength(HandleType.size()),handleType(new (Ctx, 1) char[handleTypeLength])
|
|
{
|
|
if (!HandleType.empty())
|
|
std::memcpy(handleType, HandleType.data(), handleTypeLength);
|
|
}
|
|
|
|
|
|
|
|
UseHandleAttr *UseHandleAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) UseHandleAttr(C, *this, getHandleType());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void UseHandleAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((use_handle";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getHandleType() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::use_handle";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getHandleType() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::use_handle";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getHandleType() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *UseHandleAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "use_handle";
|
|
case 1:
|
|
return "use_handle";
|
|
case 2:
|
|
return "use_handle";
|
|
}
|
|
}
|
|
|
|
|
|
// UsedAttr implementation
|
|
|
|
UsedAttr *UsedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UsedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UsedAttr *UsedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UsedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UsedAttr *UsedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_used:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_used, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_used:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_used, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_used:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_used, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
UsedAttr *UsedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_used:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_used, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_used:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_used, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_used:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_used, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
UsedAttr::UsedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Used, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
UsedAttr *UsedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) UsedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void UsedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((used";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::used";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::used";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *UsedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "used";
|
|
case 1:
|
|
return "used";
|
|
case 2:
|
|
return "used";
|
|
}
|
|
}
|
|
|
|
|
|
// UsingIfExistsAttr implementation
|
|
|
|
UsingIfExistsAttr *UsingIfExistsAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UsingIfExistsAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UsingIfExistsAttr *UsingIfExistsAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UsingIfExistsAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UsingIfExistsAttr *UsingIfExistsAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_using_if_exists:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_using_if_exists, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_using_if_exists:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_using_if_exists, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
UsingIfExistsAttr *UsingIfExistsAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_using_if_exists:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_using_if_exists, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_using_if_exists:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_using_if_exists, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
UsingIfExistsAttr::UsingIfExistsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::UsingIfExists, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
UsingIfExistsAttr *UsingIfExistsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) UsingIfExistsAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void UsingIfExistsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((using_if_exists";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::using_if_exists";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *UsingIfExistsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "using_if_exists";
|
|
case 1:
|
|
return "using_if_exists";
|
|
}
|
|
}
|
|
|
|
|
|
// UuidAttr implementation
|
|
|
|
UuidAttr *UuidAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Guid, MSGuidDecl * GuidDecl, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UuidAttr(Ctx, CommonInfo, Guid, GuidDecl);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UuidAttr *UuidAttr::Create(ASTContext &Ctx, llvm::StringRef Guid, MSGuidDecl * GuidDecl, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UuidAttr(Ctx, CommonInfo, Guid, GuidDecl);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UuidAttr *UuidAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Guid, MSGuidDecl * GuidDecl, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_uuid:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_uuid, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Microsoft_uuid:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Microsoft, Microsoft_uuid, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Guid, GuidDecl, I);
|
|
}
|
|
|
|
UuidAttr *UuidAttr::Create(ASTContext &Ctx, llvm::StringRef Guid, MSGuidDecl * GuidDecl, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_uuid:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_uuid, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Microsoft_uuid:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Microsoft, Microsoft_uuid, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Guid, GuidDecl, I);
|
|
}
|
|
|
|
UuidAttr *UuidAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Guid, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UuidAttr(Ctx, CommonInfo, Guid);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UuidAttr *UuidAttr::Create(ASTContext &Ctx, llvm::StringRef Guid, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) UuidAttr(Ctx, CommonInfo, Guid);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
UuidAttr *UuidAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Guid, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_uuid:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_uuid, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Microsoft_uuid:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Microsoft, Microsoft_uuid, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Guid, I);
|
|
}
|
|
|
|
UuidAttr *UuidAttr::Create(ASTContext &Ctx, llvm::StringRef Guid, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case Declspec_uuid:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, Declspec_uuid, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Microsoft_uuid:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Microsoft, Microsoft_uuid, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Declspec, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Guid, I);
|
|
}
|
|
|
|
UuidAttr::UuidAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Guid
|
|
, MSGuidDecl * GuidDecl
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Uuid, /*IsLateParsed=*/false, false)
|
|
, guidLength(Guid.size()),guid(new (Ctx, 1) char[guidLength])
|
|
, guidDecl(GuidDecl)
|
|
{
|
|
if (!Guid.empty())
|
|
std::memcpy(guid, Guid.data(), guidLength);
|
|
}
|
|
|
|
UuidAttr::UuidAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Guid
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Uuid, /*IsLateParsed=*/false, false)
|
|
, guidLength(Guid.size()),guid(new (Ctx, 1) char[guidLength])
|
|
, guidDecl()
|
|
{
|
|
if (!Guid.empty())
|
|
std::memcpy(guid, Guid.data(), guidLength);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UuidAttr *UuidAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) UuidAttr(C, *this, getGuid(), guidDecl);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void UuidAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__declspec(uuid";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getGuid() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << ")";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[uuid";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getGuid() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *UuidAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "uuid";
|
|
case 1:
|
|
return "uuid";
|
|
}
|
|
}
|
|
|
|
|
|
// VTablePointerAuthenticationAttr implementation
|
|
|
|
VTablePointerAuthenticationAttr *VTablePointerAuthenticationAttr::CreateImplicit(ASTContext &Ctx, VTablePointerAuthenticationAttr::VPtrAuthKeyType Key, VTablePointerAuthenticationAttr::AddressDiscriminationMode AddressDiscrimination, VTablePointerAuthenticationAttr::ExtraDiscrimination ExtraDiscrimination, int CustomDiscriminationValue, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) VTablePointerAuthenticationAttr(Ctx, CommonInfo, Key, AddressDiscrimination, ExtraDiscrimination, CustomDiscriminationValue);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
VTablePointerAuthenticationAttr *VTablePointerAuthenticationAttr::Create(ASTContext &Ctx, VTablePointerAuthenticationAttr::VPtrAuthKeyType Key, VTablePointerAuthenticationAttr::AddressDiscriminationMode AddressDiscrimination, VTablePointerAuthenticationAttr::ExtraDiscrimination ExtraDiscrimination, int CustomDiscriminationValue, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) VTablePointerAuthenticationAttr(Ctx, CommonInfo, Key, AddressDiscrimination, ExtraDiscrimination, CustomDiscriminationValue);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
VTablePointerAuthenticationAttr *VTablePointerAuthenticationAttr::CreateImplicit(ASTContext &Ctx, VTablePointerAuthenticationAttr::VPtrAuthKeyType Key, VTablePointerAuthenticationAttr::AddressDiscriminationMode AddressDiscrimination, VTablePointerAuthenticationAttr::ExtraDiscrimination ExtraDiscrimination, int CustomDiscriminationValue, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ptrauth_vtable_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ptrauth_vtable_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ptrauth_vtable_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ptrauth_vtable_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ptrauth_vtable_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ptrauth_vtable_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Key, AddressDiscrimination, ExtraDiscrimination, CustomDiscriminationValue, I);
|
|
}
|
|
|
|
VTablePointerAuthenticationAttr *VTablePointerAuthenticationAttr::Create(ASTContext &Ctx, VTablePointerAuthenticationAttr::VPtrAuthKeyType Key, VTablePointerAuthenticationAttr::AddressDiscriminationMode AddressDiscrimination, VTablePointerAuthenticationAttr::ExtraDiscrimination ExtraDiscrimination, int CustomDiscriminationValue, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_ptrauth_vtable_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_ptrauth_vtable_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_ptrauth_vtable_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_ptrauth_vtable_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_ptrauth_vtable_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_ptrauth_vtable_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Key, AddressDiscrimination, ExtraDiscrimination, CustomDiscriminationValue, I);
|
|
}
|
|
|
|
VTablePointerAuthenticationAttr::VTablePointerAuthenticationAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, VTablePointerAuthenticationAttr::VPtrAuthKeyType Key
|
|
, VTablePointerAuthenticationAttr::AddressDiscriminationMode AddressDiscrimination
|
|
, VTablePointerAuthenticationAttr::ExtraDiscrimination ExtraDiscrimination
|
|
, int CustomDiscriminationValue
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::VTablePointerAuthentication, /*IsLateParsed=*/false, false)
|
|
, key(Key)
|
|
, addressDiscrimination(AddressDiscrimination)
|
|
, extraDiscrimination(ExtraDiscrimination)
|
|
, customDiscriminationValue(CustomDiscriminationValue)
|
|
{
|
|
}
|
|
|
|
VTablePointerAuthenticationAttr::VTablePointerAuthenticationAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, VTablePointerAuthenticationAttr::VPtrAuthKeyType Key
|
|
, VTablePointerAuthenticationAttr::AddressDiscriminationMode AddressDiscrimination
|
|
, VTablePointerAuthenticationAttr::ExtraDiscrimination ExtraDiscrimination
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::VTablePointerAuthentication, /*IsLateParsed=*/false, false)
|
|
, key(Key)
|
|
, addressDiscrimination(AddressDiscrimination)
|
|
, extraDiscrimination(ExtraDiscrimination)
|
|
, customDiscriminationValue()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool VTablePointerAuthenticationAttr::ConvertStrToVPtrAuthKeyType(StringRef Val, VTablePointerAuthenticationAttr::VPtrAuthKeyType &Out) {
|
|
std::optional<VTablePointerAuthenticationAttr::VPtrAuthKeyType> R = llvm::StringSwitch<std::optional<VTablePointerAuthenticationAttr::VPtrAuthKeyType>>(Val)
|
|
.Case("default_key", VTablePointerAuthenticationAttr::VPtrAuthKeyType::DefaultKey)
|
|
.Case("no_authentication", VTablePointerAuthenticationAttr::VPtrAuthKeyType::NoKey)
|
|
.Case("process_dependent", VTablePointerAuthenticationAttr::VPtrAuthKeyType::ProcessDependent)
|
|
.Case("process_independent", VTablePointerAuthenticationAttr::VPtrAuthKeyType::ProcessIndependent)
|
|
.Default(std::optional<VTablePointerAuthenticationAttr::VPtrAuthKeyType>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *VTablePointerAuthenticationAttr::ConvertVPtrAuthKeyTypeToStr(VTablePointerAuthenticationAttr::VPtrAuthKeyType Val) {
|
|
switch(Val) {
|
|
case VTablePointerAuthenticationAttr::VPtrAuthKeyType::DefaultKey: return "default_key";
|
|
case VTablePointerAuthenticationAttr::VPtrAuthKeyType::NoKey: return "no_authentication";
|
|
case VTablePointerAuthenticationAttr::VPtrAuthKeyType::ProcessDependent: return "process_dependent";
|
|
case VTablePointerAuthenticationAttr::VPtrAuthKeyType::ProcessIndependent: return "process_independent";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
|
|
|
|
bool VTablePointerAuthenticationAttr::ConvertStrToAddressDiscriminationMode(StringRef Val, VTablePointerAuthenticationAttr::AddressDiscriminationMode &Out) {
|
|
std::optional<VTablePointerAuthenticationAttr::AddressDiscriminationMode> R = llvm::StringSwitch<std::optional<VTablePointerAuthenticationAttr::AddressDiscriminationMode>>(Val)
|
|
.Case("default_address_discrimination", VTablePointerAuthenticationAttr::AddressDiscriminationMode::DefaultAddressDiscrimination)
|
|
.Case("no_address_discrimination", VTablePointerAuthenticationAttr::AddressDiscriminationMode::NoAddressDiscrimination)
|
|
.Case("address_discrimination", VTablePointerAuthenticationAttr::AddressDiscriminationMode::AddressDiscrimination)
|
|
.Default(std::optional<VTablePointerAuthenticationAttr::AddressDiscriminationMode>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *VTablePointerAuthenticationAttr::ConvertAddressDiscriminationModeToStr(VTablePointerAuthenticationAttr::AddressDiscriminationMode Val) {
|
|
switch(Val) {
|
|
case VTablePointerAuthenticationAttr::AddressDiscriminationMode::DefaultAddressDiscrimination: return "default_address_discrimination";
|
|
case VTablePointerAuthenticationAttr::AddressDiscriminationMode::NoAddressDiscrimination: return "no_address_discrimination";
|
|
case VTablePointerAuthenticationAttr::AddressDiscriminationMode::AddressDiscrimination: return "address_discrimination";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
|
|
|
|
bool VTablePointerAuthenticationAttr::ConvertStrToExtraDiscrimination(StringRef Val, VTablePointerAuthenticationAttr::ExtraDiscrimination &Out) {
|
|
std::optional<VTablePointerAuthenticationAttr::ExtraDiscrimination> R = llvm::StringSwitch<std::optional<VTablePointerAuthenticationAttr::ExtraDiscrimination>>(Val)
|
|
.Case("default_extra_discrimination", VTablePointerAuthenticationAttr::ExtraDiscrimination::DefaultExtraDiscrimination)
|
|
.Case("no_extra_discrimination", VTablePointerAuthenticationAttr::ExtraDiscrimination::NoExtraDiscrimination)
|
|
.Case("type_discrimination", VTablePointerAuthenticationAttr::ExtraDiscrimination::TypeDiscrimination)
|
|
.Case("custom_discrimination", VTablePointerAuthenticationAttr::ExtraDiscrimination::CustomDiscrimination)
|
|
.Default(std::optional<VTablePointerAuthenticationAttr::ExtraDiscrimination>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *VTablePointerAuthenticationAttr::ConvertExtraDiscriminationToStr(VTablePointerAuthenticationAttr::ExtraDiscrimination Val) {
|
|
switch(Val) {
|
|
case VTablePointerAuthenticationAttr::ExtraDiscrimination::DefaultExtraDiscrimination: return "default_extra_discrimination";
|
|
case VTablePointerAuthenticationAttr::ExtraDiscrimination::NoExtraDiscrimination: return "no_extra_discrimination";
|
|
case VTablePointerAuthenticationAttr::ExtraDiscrimination::TypeDiscrimination: return "type_discrimination";
|
|
case VTablePointerAuthenticationAttr::ExtraDiscrimination::CustomDiscrimination: return "custom_discrimination";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
|
|
|
|
VTablePointerAuthenticationAttr *VTablePointerAuthenticationAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) VTablePointerAuthenticationAttr(C, *this, key, addressDiscrimination, extraDiscrimination, customDiscriminationValue);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void VTablePointerAuthenticationAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((ptrauth_vtable_pointer";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << VTablePointerAuthenticationAttr::ConvertVPtrAuthKeyTypeToStr(getKey()) << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << VTablePointerAuthenticationAttr::ConvertAddressDiscriminationModeToStr(getAddressDiscrimination()) << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << VTablePointerAuthenticationAttr::ConvertExtraDiscriminationToStr(getExtraDiscrimination()) << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getCustomDiscriminationValue() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::ptrauth_vtable_pointer";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << VTablePointerAuthenticationAttr::ConvertVPtrAuthKeyTypeToStr(getKey()) << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << VTablePointerAuthenticationAttr::ConvertAddressDiscriminationModeToStr(getAddressDiscrimination()) << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << VTablePointerAuthenticationAttr::ConvertExtraDiscriminationToStr(getExtraDiscrimination()) << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getCustomDiscriminationValue() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::ptrauth_vtable_pointer";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << VTablePointerAuthenticationAttr::ConvertVPtrAuthKeyTypeToStr(getKey()) << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << VTablePointerAuthenticationAttr::ConvertAddressDiscriminationModeToStr(getAddressDiscrimination()) << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << VTablePointerAuthenticationAttr::ConvertExtraDiscriminationToStr(getExtraDiscrimination()) << "\"";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getCustomDiscriminationValue() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *VTablePointerAuthenticationAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "ptrauth_vtable_pointer";
|
|
case 1:
|
|
return "ptrauth_vtable_pointer";
|
|
case 2:
|
|
return "ptrauth_vtable_pointer";
|
|
}
|
|
}
|
|
|
|
|
|
// VecReturnAttr implementation
|
|
|
|
VecReturnAttr *VecReturnAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) VecReturnAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
VecReturnAttr *VecReturnAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) VecReturnAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
VecReturnAttr *VecReturnAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_vecreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_vecreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_vecreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_vecreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
VecReturnAttr *VecReturnAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_vecreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_vecreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_vecreturn:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_vecreturn, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
VecReturnAttr::VecReturnAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::VecReturn, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
VecReturnAttr *VecReturnAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) VecReturnAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void VecReturnAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((vecreturn";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::vecreturn";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *VecReturnAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "vecreturn";
|
|
case 1:
|
|
return "vecreturn";
|
|
}
|
|
}
|
|
|
|
|
|
// VecTypeHintAttr implementation
|
|
|
|
VecTypeHintAttr *VecTypeHintAttr::CreateImplicit(ASTContext &Ctx, TypeSourceInfo * TypeHint, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) VecTypeHintAttr(Ctx, CommonInfo, TypeHint);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
VecTypeHintAttr *VecTypeHintAttr::Create(ASTContext &Ctx, TypeSourceInfo * TypeHint, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) VecTypeHintAttr(Ctx, CommonInfo, TypeHint);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
VecTypeHintAttr *VecTypeHintAttr::CreateImplicit(ASTContext &Ctx, TypeSourceInfo * TypeHint, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, TypeHint, I);
|
|
}
|
|
|
|
VecTypeHintAttr *VecTypeHintAttr::Create(ASTContext &Ctx, TypeSourceInfo * TypeHint, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, TypeHint, I);
|
|
}
|
|
|
|
VecTypeHintAttr::VecTypeHintAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, TypeSourceInfo * TypeHint
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::VecTypeHint, /*IsLateParsed=*/false, false)
|
|
, typeHint(TypeHint)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
VecTypeHintAttr *VecTypeHintAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) VecTypeHintAttr(C, *this, typeHint);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void VecTypeHintAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((vec_type_hint";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getTypeHint().getAsString() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *VecTypeHintAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "vec_type_hint";
|
|
}
|
|
}
|
|
|
|
|
|
// VectorCallAttr implementation
|
|
|
|
VectorCallAttr *VectorCallAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) VectorCallAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
VectorCallAttr *VectorCallAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) VectorCallAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
VectorCallAttr *VectorCallAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_vectorcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_vectorcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_vectorcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_vectorcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_vectorcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_vectorcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_vectorcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_vectorcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
VectorCallAttr *VectorCallAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_vectorcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_vectorcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_vectorcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_vectorcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_vectorcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_vectorcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case Keyword_vectorcall:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_Keyword, Keyword_vectorcall, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
VectorCallAttr::VectorCallAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::VectorCall, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
VectorCallAttr *VectorCallAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) VectorCallAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void VectorCallAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((vectorcall";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::vectorcall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::vectorcall";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__vectorcall";
|
|
OS << "";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "_vectorcall";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *VectorCallAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "vectorcall";
|
|
case 1:
|
|
return "vectorcall";
|
|
case 2:
|
|
return "vectorcall";
|
|
case 3:
|
|
return "__vectorcall";
|
|
case 4:
|
|
return "_vectorcall";
|
|
}
|
|
}
|
|
|
|
|
|
// VisibilityAttr implementation
|
|
|
|
VisibilityAttr *VisibilityAttr::CreateImplicit(ASTContext &Ctx, VisibilityAttr::VisibilityType Visibility, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) VisibilityAttr(Ctx, CommonInfo, Visibility);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
VisibilityAttr *VisibilityAttr::Create(ASTContext &Ctx, VisibilityAttr::VisibilityType Visibility, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) VisibilityAttr(Ctx, CommonInfo, Visibility);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
VisibilityAttr *VisibilityAttr::CreateImplicit(ASTContext &Ctx, VisibilityAttr::VisibilityType Visibility, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_visibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_visibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_visibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_visibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_visibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_visibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Visibility, I);
|
|
}
|
|
|
|
VisibilityAttr *VisibilityAttr::Create(ASTContext &Ctx, VisibilityAttr::VisibilityType Visibility, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_visibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_visibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_visibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_visibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_visibility:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_visibility, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Visibility, I);
|
|
}
|
|
|
|
VisibilityAttr::VisibilityAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, VisibilityAttr::VisibilityType Visibility
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Visibility, /*IsLateParsed=*/false, false)
|
|
, visibility(Visibility)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool VisibilityAttr::ConvertStrToVisibilityType(StringRef Val, VisibilityAttr::VisibilityType &Out) {
|
|
std::optional<VisibilityAttr::VisibilityType> R = llvm::StringSwitch<std::optional<VisibilityAttr::VisibilityType>>(Val)
|
|
.Case("default", VisibilityAttr::VisibilityType::Default)
|
|
.Case("hidden", VisibilityAttr::VisibilityType::Hidden)
|
|
.Case("internal", VisibilityAttr::VisibilityType::Hidden)
|
|
.Case("protected", VisibilityAttr::VisibilityType::Protected)
|
|
.Default(std::optional<VisibilityAttr::VisibilityType>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *VisibilityAttr::ConvertVisibilityTypeToStr(VisibilityAttr::VisibilityType Val) {
|
|
switch(Val) {
|
|
case VisibilityAttr::VisibilityType::Default: return "default";
|
|
case VisibilityAttr::VisibilityType::Hidden: return "hidden";
|
|
case VisibilityAttr::VisibilityType::Protected: return "protected";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
VisibilityAttr *VisibilityAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) VisibilityAttr(C, *this, visibility);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void VisibilityAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((visibility";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << VisibilityAttr::ConvertVisibilityTypeToStr(getVisibility()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::visibility";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << VisibilityAttr::ConvertVisibilityTypeToStr(getVisibility()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::visibility";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << VisibilityAttr::ConvertVisibilityTypeToStr(getVisibility()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *VisibilityAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "visibility";
|
|
case 1:
|
|
return "visibility";
|
|
case 2:
|
|
return "visibility";
|
|
}
|
|
}
|
|
|
|
|
|
// WarnUnusedAttr implementation
|
|
|
|
WarnUnusedAttr *WarnUnusedAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WarnUnusedAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WarnUnusedAttr *WarnUnusedAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WarnUnusedAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WarnUnusedAttr *WarnUnusedAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_warn_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_warn_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_warn_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_warn_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_warn_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_warn_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
WarnUnusedAttr *WarnUnusedAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_warn_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_warn_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_warn_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_warn_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_warn_unused:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_warn_unused, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
WarnUnusedAttr::WarnUnusedAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::WarnUnused, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
WarnUnusedAttr *WarnUnusedAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) WarnUnusedAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void WarnUnusedAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((warn_unused";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::warn_unused";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::warn_unused";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *WarnUnusedAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "warn_unused";
|
|
case 1:
|
|
return "warn_unused";
|
|
case 2:
|
|
return "warn_unused";
|
|
}
|
|
}
|
|
|
|
|
|
// WarnUnusedResultAttr implementation
|
|
|
|
WarnUnusedResultAttr *WarnUnusedResultAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WarnUnusedResultAttr(Ctx, CommonInfo, Message);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WarnUnusedResultAttr *WarnUnusedResultAttr::Create(ASTContext &Ctx, llvm::StringRef Message, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WarnUnusedResultAttr(Ctx, CommonInfo, Message);
|
|
return A;
|
|
}
|
|
|
|
WarnUnusedResultAttr *WarnUnusedResultAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_nodiscard:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_nodiscard, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_nodiscard:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_nodiscard, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_warn_unused_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_warn_unused_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_warn_unused_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_warn_unused_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_warn_unused_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_warn_unused_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_warn_unused_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_warn_unused_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Message, I);
|
|
}
|
|
|
|
WarnUnusedResultAttr *WarnUnusedResultAttr::Create(ASTContext &Ctx, llvm::StringRef Message, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case CXX11_nodiscard:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_nodiscard, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_nodiscard:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_nodiscard, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_warn_unused_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_warn_unused_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_warn_unused_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_warn_unused_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_warn_unused_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_warn_unused_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_warn_unused_result:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_warn_unused_result, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Message, I);
|
|
}
|
|
|
|
WarnUnusedResultAttr::WarnUnusedResultAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Message
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::WarnUnusedResult, /*IsLateParsed=*/false, false)
|
|
, messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
|
|
{
|
|
if (!Message.empty())
|
|
std::memcpy(message, Message.data(), messageLength);
|
|
}
|
|
|
|
WarnUnusedResultAttr::WarnUnusedResultAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::WarnUnusedResult, /*IsLateParsed=*/false, false)
|
|
, messageLength(0),message(nullptr)
|
|
{
|
|
}
|
|
|
|
WarnUnusedResultAttr::Spelling WarnUnusedResultAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return CXX11_nodiscard;
|
|
case 1: return C23_nodiscard;
|
|
case 2: return CXX11_clang_warn_unused_result;
|
|
case 3: return GNU_warn_unused_result;
|
|
case 4: return CXX11_gnu_warn_unused_result;
|
|
case 5: return C23_gnu_warn_unused_result;
|
|
}
|
|
}
|
|
|
|
|
|
WarnUnusedResultAttr *WarnUnusedResultAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) WarnUnusedResultAttr(C, *this, getMessage());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void WarnUnusedResultAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "[[nodiscard";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[nodiscard";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::warn_unused_result";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__attribute__((warn_unused_result";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[gnu::warn_unused_result";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[gnu::warn_unused_result";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getMessage() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *WarnUnusedResultAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "nodiscard";
|
|
case 1:
|
|
return "nodiscard";
|
|
case 2:
|
|
return "warn_unused_result";
|
|
case 3:
|
|
return "warn_unused_result";
|
|
case 4:
|
|
return "warn_unused_result";
|
|
case 5:
|
|
return "warn_unused_result";
|
|
}
|
|
}
|
|
|
|
|
|
// WeakAttr implementation
|
|
|
|
WeakAttr *WeakAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WeakAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WeakAttr *WeakAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WeakAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WeakAttr *WeakAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_weak:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_weak, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_weak:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_weak, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_weak:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_weak, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
WeakAttr *WeakAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_weak:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_weak, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_weak:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_weak, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_weak:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_weak, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
WeakAttr::WeakAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::Weak, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
WeakAttr *WeakAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) WeakAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void WeakAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((weak";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::weak";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::weak";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *WeakAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "weak";
|
|
case 1:
|
|
return "weak";
|
|
case 2:
|
|
return "weak";
|
|
}
|
|
}
|
|
|
|
|
|
// WeakImportAttr implementation
|
|
|
|
WeakImportAttr *WeakImportAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WeakImportAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WeakImportAttr *WeakImportAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WeakImportAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WeakImportAttr *WeakImportAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_weak_import:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_weak_import, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_weak_import:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_weak_import, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_weak_import:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_weak_import, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
WeakImportAttr *WeakImportAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_weak_import:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_weak_import, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_weak_import:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_weak_import, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_weak_import:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_weak_import, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
WeakImportAttr::WeakImportAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::WeakImport, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
WeakImportAttr *WeakImportAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) WeakImportAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void WeakImportAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((weak_import";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::weak_import";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::weak_import";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *WeakImportAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "weak_import";
|
|
case 1:
|
|
return "weak_import";
|
|
case 2:
|
|
return "weak_import";
|
|
}
|
|
}
|
|
|
|
|
|
// WeakRefAttr implementation
|
|
|
|
WeakRefAttr *WeakRefAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Aliasee, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WeakRefAttr(Ctx, CommonInfo, Aliasee);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WeakRefAttr *WeakRefAttr::Create(ASTContext &Ctx, llvm::StringRef Aliasee, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WeakRefAttr(Ctx, CommonInfo, Aliasee);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WeakRefAttr *WeakRefAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef Aliasee, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_weakref:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_weakref, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_weakref:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_weakref, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_weakref:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_weakref, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, Aliasee, I);
|
|
}
|
|
|
|
WeakRefAttr *WeakRefAttr::Create(ASTContext &Ctx, llvm::StringRef Aliasee, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_weakref:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_weakref, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_weakref:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_weakref, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_weakref:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_weakref, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, Aliasee, I);
|
|
}
|
|
|
|
WeakRefAttr::WeakRefAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef Aliasee
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::WeakRef, /*IsLateParsed=*/false, false)
|
|
, aliaseeLength(Aliasee.size()),aliasee(new (Ctx, 1) char[aliaseeLength])
|
|
{
|
|
if (!Aliasee.empty())
|
|
std::memcpy(aliasee, Aliasee.data(), aliaseeLength);
|
|
}
|
|
|
|
WeakRefAttr::WeakRefAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::WeakRef, /*IsLateParsed=*/false, false)
|
|
, aliaseeLength(0),aliasee(nullptr)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
WeakRefAttr *WeakRefAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) WeakRefAttr(C, *this, getAliasee());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void WeakRefAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((weakref";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAliasee() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::weakref";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAliasee() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::weakref";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getAliasee() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *WeakRefAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "weakref";
|
|
case 1:
|
|
return "weakref";
|
|
case 2:
|
|
return "weakref";
|
|
}
|
|
}
|
|
|
|
|
|
// WebAssemblyExportNameAttr implementation
|
|
|
|
WebAssemblyExportNameAttr *WebAssemblyExportNameAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef ExportName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WebAssemblyExportNameAttr(Ctx, CommonInfo, ExportName);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WebAssemblyExportNameAttr *WebAssemblyExportNameAttr::Create(ASTContext &Ctx, llvm::StringRef ExportName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WebAssemblyExportNameAttr(Ctx, CommonInfo, ExportName);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WebAssemblyExportNameAttr *WebAssemblyExportNameAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef ExportName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_export_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_export_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_export_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_export_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_export_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_export_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, ExportName, I);
|
|
}
|
|
|
|
WebAssemblyExportNameAttr *WebAssemblyExportNameAttr::Create(ASTContext &Ctx, llvm::StringRef ExportName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_export_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_export_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_export_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_export_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_export_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_export_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, ExportName, I);
|
|
}
|
|
|
|
WebAssemblyExportNameAttr::WebAssemblyExportNameAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef ExportName
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::WebAssemblyExportName, /*IsLateParsed=*/false, false)
|
|
, exportNameLength(ExportName.size()),exportName(new (Ctx, 1) char[exportNameLength])
|
|
{
|
|
if (!ExportName.empty())
|
|
std::memcpy(exportName, ExportName.data(), exportNameLength);
|
|
}
|
|
|
|
|
|
|
|
WebAssemblyExportNameAttr *WebAssemblyExportNameAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) WebAssemblyExportNameAttr(C, *this, getExportName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void WebAssemblyExportNameAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((export_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getExportName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::export_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getExportName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::export_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getExportName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *WebAssemblyExportNameAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "export_name";
|
|
case 1:
|
|
return "export_name";
|
|
case 2:
|
|
return "export_name";
|
|
}
|
|
}
|
|
|
|
|
|
// WebAssemblyFuncrefAttr implementation
|
|
|
|
WebAssemblyFuncrefAttr *WebAssemblyFuncrefAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WebAssemblyFuncrefAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WebAssemblyFuncrefAttr *WebAssemblyFuncrefAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WebAssemblyFuncrefAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WebAssemblyFuncrefAttr *WebAssemblyFuncrefAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
WebAssemblyFuncrefAttr *WebAssemblyFuncrefAttr::Create(ASTContext &Ctx, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_Keyword, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
WebAssemblyFuncrefAttr::WebAssemblyFuncrefAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: TypeAttr(Ctx, CommonInfo, attr::WebAssemblyFuncref, /*IsLateParsed=*/false)
|
|
{
|
|
}
|
|
|
|
WebAssemblyFuncrefAttr *WebAssemblyFuncrefAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) WebAssemblyFuncrefAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void WebAssemblyFuncrefAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__funcref";
|
|
OS << "";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *WebAssemblyFuncrefAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "__funcref";
|
|
}
|
|
}
|
|
|
|
|
|
// WebAssemblyImportModuleAttr implementation
|
|
|
|
WebAssemblyImportModuleAttr *WebAssemblyImportModuleAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef ImportModule, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WebAssemblyImportModuleAttr(Ctx, CommonInfo, ImportModule);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WebAssemblyImportModuleAttr *WebAssemblyImportModuleAttr::Create(ASTContext &Ctx, llvm::StringRef ImportModule, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WebAssemblyImportModuleAttr(Ctx, CommonInfo, ImportModule);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WebAssemblyImportModuleAttr *WebAssemblyImportModuleAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef ImportModule, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_import_module:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_import_module, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_import_module:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_import_module, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_import_module:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_import_module, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, ImportModule, I);
|
|
}
|
|
|
|
WebAssemblyImportModuleAttr *WebAssemblyImportModuleAttr::Create(ASTContext &Ctx, llvm::StringRef ImportModule, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_import_module:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_import_module, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_import_module:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_import_module, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_import_module:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_import_module, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, ImportModule, I);
|
|
}
|
|
|
|
WebAssemblyImportModuleAttr::WebAssemblyImportModuleAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef ImportModule
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::WebAssemblyImportModule, /*IsLateParsed=*/false, false)
|
|
, importModuleLength(ImportModule.size()),importModule(new (Ctx, 1) char[importModuleLength])
|
|
{
|
|
if (!ImportModule.empty())
|
|
std::memcpy(importModule, ImportModule.data(), importModuleLength);
|
|
}
|
|
|
|
|
|
|
|
WebAssemblyImportModuleAttr *WebAssemblyImportModuleAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) WebAssemblyImportModuleAttr(C, *this, getImportModule());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void WebAssemblyImportModuleAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((import_module";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getImportModule() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::import_module";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getImportModule() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::import_module";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getImportModule() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *WebAssemblyImportModuleAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "import_module";
|
|
case 1:
|
|
return "import_module";
|
|
case 2:
|
|
return "import_module";
|
|
}
|
|
}
|
|
|
|
|
|
// WebAssemblyImportNameAttr implementation
|
|
|
|
WebAssemblyImportNameAttr *WebAssemblyImportNameAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef ImportName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WebAssemblyImportNameAttr(Ctx, CommonInfo, ImportName);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WebAssemblyImportNameAttr *WebAssemblyImportNameAttr::Create(ASTContext &Ctx, llvm::StringRef ImportName, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WebAssemblyImportNameAttr(Ctx, CommonInfo, ImportName);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WebAssemblyImportNameAttr *WebAssemblyImportNameAttr::CreateImplicit(ASTContext &Ctx, llvm::StringRef ImportName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_import_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_import_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_import_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_import_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_import_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_import_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, ImportName, I);
|
|
}
|
|
|
|
WebAssemblyImportNameAttr *WebAssemblyImportNameAttr::Create(ASTContext &Ctx, llvm::StringRef ImportName, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_import_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_import_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_import_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_import_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_import_name:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_import_name, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, ImportName, I);
|
|
}
|
|
|
|
WebAssemblyImportNameAttr::WebAssemblyImportNameAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, llvm::StringRef ImportName
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::WebAssemblyImportName, /*IsLateParsed=*/false, false)
|
|
, importNameLength(ImportName.size()),importName(new (Ctx, 1) char[importNameLength])
|
|
{
|
|
if (!ImportName.empty())
|
|
std::memcpy(importName, ImportName.data(), importNameLength);
|
|
}
|
|
|
|
|
|
|
|
WebAssemblyImportNameAttr *WebAssemblyImportNameAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) WebAssemblyImportNameAttr(C, *this, getImportName());
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void WebAssemblyImportNameAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((import_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getImportName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::import_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getImportName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::import_name";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << getImportName() << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *WebAssemblyImportNameAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "import_name";
|
|
case 1:
|
|
return "import_name";
|
|
case 2:
|
|
return "import_name";
|
|
}
|
|
}
|
|
|
|
|
|
// WorkGroupSizeHintAttr implementation
|
|
|
|
WorkGroupSizeHintAttr *WorkGroupSizeHintAttr::CreateImplicit(ASTContext &Ctx, unsigned XDim, unsigned YDim, unsigned ZDim, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WorkGroupSizeHintAttr(Ctx, CommonInfo, XDim, YDim, ZDim);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WorkGroupSizeHintAttr *WorkGroupSizeHintAttr::Create(ASTContext &Ctx, unsigned XDim, unsigned YDim, unsigned ZDim, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) WorkGroupSizeHintAttr(Ctx, CommonInfo, XDim, YDim, ZDim);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
WorkGroupSizeHintAttr *WorkGroupSizeHintAttr::CreateImplicit(ASTContext &Ctx, unsigned XDim, unsigned YDim, unsigned ZDim, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return CreateImplicit(Ctx, XDim, YDim, ZDim, I);
|
|
}
|
|
|
|
WorkGroupSizeHintAttr *WorkGroupSizeHintAttr::Create(ASTContext &Ctx, unsigned XDim, unsigned YDim, unsigned ZDim, SourceRange Range) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, {AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/});
|
|
return Create(Ctx, XDim, YDim, ZDim, I);
|
|
}
|
|
|
|
WorkGroupSizeHintAttr::WorkGroupSizeHintAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned XDim
|
|
, unsigned YDim
|
|
, unsigned ZDim
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::WorkGroupSizeHint, /*IsLateParsed=*/false, false)
|
|
, xDim(XDim)
|
|
, yDim(YDim)
|
|
, zDim(ZDim)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WorkGroupSizeHintAttr *WorkGroupSizeHintAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) WorkGroupSizeHintAttr(C, *this, xDim, yDim, zDim);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void WorkGroupSizeHintAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((work_group_size_hint";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getXDim() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getYDim() << "";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getZDim() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *WorkGroupSizeHintAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "work_group_size_hint";
|
|
}
|
|
}
|
|
|
|
|
|
// X86ForceAlignArgPointerAttr implementation
|
|
|
|
X86ForceAlignArgPointerAttr *X86ForceAlignArgPointerAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) X86ForceAlignArgPointerAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
X86ForceAlignArgPointerAttr *X86ForceAlignArgPointerAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) X86ForceAlignArgPointerAttr(Ctx, CommonInfo);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
X86ForceAlignArgPointerAttr *X86ForceAlignArgPointerAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_force_align_arg_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_force_align_arg_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_force_align_arg_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_force_align_arg_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_force_align_arg_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_force_align_arg_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
X86ForceAlignArgPointerAttr *X86ForceAlignArgPointerAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_force_align_arg_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_force_align_arg_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_force_align_arg_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_force_align_arg_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_force_align_arg_pointer:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_force_align_arg_pointer, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
X86ForceAlignArgPointerAttr::X86ForceAlignArgPointerAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::X86ForceAlignArgPointer, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
X86ForceAlignArgPointerAttr *X86ForceAlignArgPointerAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) X86ForceAlignArgPointerAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void X86ForceAlignArgPointerAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((force_align_arg_pointer";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::force_align_arg_pointer";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::force_align_arg_pointer";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *X86ForceAlignArgPointerAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "force_align_arg_pointer";
|
|
case 1:
|
|
return "force_align_arg_pointer";
|
|
case 2:
|
|
return "force_align_arg_pointer";
|
|
}
|
|
}
|
|
|
|
|
|
// XRayInstrumentAttr implementation
|
|
|
|
XRayInstrumentAttr *XRayInstrumentAttr::CreateImplicit(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) XRayInstrumentAttr(Ctx, CommonInfo);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
XRayInstrumentAttr *XRayInstrumentAttr::Create(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) XRayInstrumentAttr(Ctx, CommonInfo);
|
|
return A;
|
|
}
|
|
|
|
XRayInstrumentAttr *XRayInstrumentAttr::CreateImplicit(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_xray_always_instrument:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_xray_always_instrument, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_xray_always_instrument:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_xray_always_instrument, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_xray_always_instrument:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_xray_always_instrument, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_xray_never_instrument:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_xray_never_instrument, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_xray_never_instrument:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_xray_never_instrument, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_xray_never_instrument:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_xray_never_instrument, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, I);
|
|
}
|
|
|
|
XRayInstrumentAttr *XRayInstrumentAttr::Create(ASTContext &Ctx, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_xray_always_instrument:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_xray_always_instrument, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_xray_always_instrument:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_xray_always_instrument, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_xray_always_instrument:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_xray_always_instrument, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case GNU_xray_never_instrument:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_xray_never_instrument, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_xray_never_instrument:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_xray_never_instrument, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_xray_never_instrument:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_xray_never_instrument, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, I);
|
|
}
|
|
|
|
XRayInstrumentAttr::XRayInstrumentAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::XRayInstrument, /*IsLateParsed=*/false, false)
|
|
{
|
|
}
|
|
|
|
XRayInstrumentAttr::Spelling XRayInstrumentAttr::getSemanticSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default: llvm_unreachable("Unknown spelling list index");
|
|
case 0: return GNU_xray_always_instrument;
|
|
case 1: return CXX11_clang_xray_always_instrument;
|
|
case 2: return C23_clang_xray_always_instrument;
|
|
case 3: return GNU_xray_never_instrument;
|
|
case 4: return CXX11_clang_xray_never_instrument;
|
|
case 5: return C23_clang_xray_never_instrument;
|
|
}
|
|
}
|
|
XRayInstrumentAttr *XRayInstrumentAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) XRayInstrumentAttr(C, *this);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void XRayInstrumentAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((xray_always_instrument";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::xray_always_instrument";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::xray_always_instrument";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 3 : {
|
|
OS << "__attribute__((xray_never_instrument";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 4 : {
|
|
OS << "[[clang::xray_never_instrument";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 5 : {
|
|
OS << "[[clang::xray_never_instrument";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *XRayInstrumentAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "xray_always_instrument";
|
|
case 1:
|
|
return "xray_always_instrument";
|
|
case 2:
|
|
return "xray_always_instrument";
|
|
case 3:
|
|
return "xray_never_instrument";
|
|
case 4:
|
|
return "xray_never_instrument";
|
|
case 5:
|
|
return "xray_never_instrument";
|
|
}
|
|
}
|
|
|
|
|
|
// XRayLogArgsAttr implementation
|
|
|
|
XRayLogArgsAttr *XRayLogArgsAttr::CreateImplicit(ASTContext &Ctx, unsigned ArgumentCount, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) XRayLogArgsAttr(Ctx, CommonInfo, ArgumentCount);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
XRayLogArgsAttr *XRayLogArgsAttr::Create(ASTContext &Ctx, unsigned ArgumentCount, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) XRayLogArgsAttr(Ctx, CommonInfo, ArgumentCount);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
XRayLogArgsAttr *XRayLogArgsAttr::CreateImplicit(ASTContext &Ctx, unsigned ArgumentCount, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_xray_log_args:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_xray_log_args, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_xray_log_args:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_xray_log_args, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_xray_log_args:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_xray_log_args, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, ArgumentCount, I);
|
|
}
|
|
|
|
XRayLogArgsAttr *XRayLogArgsAttr::Create(ASTContext &Ctx, unsigned ArgumentCount, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_xray_log_args:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_xray_log_args, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_clang_xray_log_args:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_clang_xray_log_args, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_clang_xray_log_args:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_clang_xray_log_args, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, ArgumentCount, I);
|
|
}
|
|
|
|
XRayLogArgsAttr::XRayLogArgsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, unsigned ArgumentCount
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::XRayLogArgs, /*IsLateParsed=*/false, false)
|
|
, argumentCount(ArgumentCount)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
XRayLogArgsAttr *XRayLogArgsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) XRayLogArgsAttr(C, *this, argumentCount);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void XRayLogArgsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((xray_log_args";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getArgumentCount() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[clang::xray_log_args";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getArgumentCount() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[clang::xray_log_args";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "" << getArgumentCount() << "";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *XRayLogArgsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "xray_log_args";
|
|
case 1:
|
|
return "xray_log_args";
|
|
case 2:
|
|
return "xray_log_args";
|
|
}
|
|
}
|
|
|
|
|
|
// ZeroCallUsedRegsAttr implementation
|
|
|
|
ZeroCallUsedRegsAttr *ZeroCallUsedRegsAttr::CreateImplicit(ASTContext &Ctx, ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind ZeroCallUsedRegs, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ZeroCallUsedRegsAttr(Ctx, CommonInfo, ZeroCallUsedRegs);
|
|
A->setImplicit(true);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ZeroCallUsedRegsAttr *ZeroCallUsedRegsAttr::Create(ASTContext &Ctx, ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind ZeroCallUsedRegs, const AttributeCommonInfo &CommonInfo) {
|
|
auto *A = new (Ctx) ZeroCallUsedRegsAttr(Ctx, CommonInfo, ZeroCallUsedRegs);
|
|
if (!A->isAttributeSpellingListCalculated() && !A->getAttrName())
|
|
A->setAttributeSpellingListIndex(0);
|
|
return A;
|
|
}
|
|
|
|
ZeroCallUsedRegsAttr *ZeroCallUsedRegsAttr::CreateImplicit(ASTContext &Ctx, ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind ZeroCallUsedRegs, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_zero_call_used_regs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_zero_call_used_regs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_zero_call_used_regs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_zero_call_used_regs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_zero_call_used_regs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_zero_call_used_regs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return CreateImplicit(Ctx, ZeroCallUsedRegs, I);
|
|
}
|
|
|
|
ZeroCallUsedRegsAttr *ZeroCallUsedRegsAttr::Create(ASTContext &Ctx, ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind ZeroCallUsedRegs, SourceRange Range, Spelling S) {
|
|
AttributeCommonInfo I(Range, NoSemaHandlerAttribute, [&]() {
|
|
switch (S) {
|
|
case GNU_zero_call_used_regs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, GNU_zero_call_used_regs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case CXX11_gnu_zero_call_used_regs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_CXX11, CXX11_gnu_zero_call_used_regs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
case C23_gnu_zero_call_used_regs:
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_C23, C23_gnu_zero_call_used_regs, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return AttributeCommonInfo::Form{AttributeCommonInfo::AS_GNU, 0, false /*IsAlignas*/, false /*IsRegularKeywordAttribute*/};
|
|
}
|
|
}());
|
|
return Create(Ctx, ZeroCallUsedRegs, I);
|
|
}
|
|
|
|
ZeroCallUsedRegsAttr::ZeroCallUsedRegsAttr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo
|
|
, ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind ZeroCallUsedRegs
|
|
)
|
|
: InheritableAttr(Ctx, CommonInfo, attr::ZeroCallUsedRegs, /*IsLateParsed=*/false, false)
|
|
, zeroCallUsedRegs(ZeroCallUsedRegs)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
bool ZeroCallUsedRegsAttr::ConvertStrToZeroCallUsedRegsKind(StringRef Val, ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind &Out) {
|
|
std::optional<ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind> R = llvm::StringSwitch<std::optional<ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind>>(Val)
|
|
.Case("skip", ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::Skip)
|
|
.Case("used-gpr-arg", ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::UsedGPRArg)
|
|
.Case("used-gpr", ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::UsedGPR)
|
|
.Case("used-arg", ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::UsedArg)
|
|
.Case("used", ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::Used)
|
|
.Case("all-gpr-arg", ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::AllGPRArg)
|
|
.Case("all-gpr", ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::AllGPR)
|
|
.Case("all-arg", ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::AllArg)
|
|
.Case("all", ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::All)
|
|
.Default(std::optional<ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind>());
|
|
if (R) {
|
|
Out = *R;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const char *ZeroCallUsedRegsAttr::ConvertZeroCallUsedRegsKindToStr(ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind Val) {
|
|
switch(Val) {
|
|
case ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::Skip: return "skip";
|
|
case ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::UsedGPRArg: return "used-gpr-arg";
|
|
case ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::UsedGPR: return "used-gpr";
|
|
case ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::UsedArg: return "used-arg";
|
|
case ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::Used: return "used";
|
|
case ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::AllGPRArg: return "all-gpr-arg";
|
|
case ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::AllGPR: return "all-gpr";
|
|
case ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::AllArg: return "all-arg";
|
|
case ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind::All: return "all";
|
|
}
|
|
llvm_unreachable("No enumerator with that value");
|
|
}
|
|
ZeroCallUsedRegsAttr *ZeroCallUsedRegsAttr::clone(ASTContext &C) const {
|
|
auto *A = new (C) ZeroCallUsedRegsAttr(C, *this, zeroCallUsedRegs);
|
|
A->Inherited = Inherited;
|
|
A->IsPackExpansion = IsPackExpansion;
|
|
A->setImplicit(Implicit);
|
|
return A;
|
|
}
|
|
|
|
void ZeroCallUsedRegsAttr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
bool IsFirstArgument = true; (void)IsFirstArgument;
|
|
unsigned TrailingOmittedArgs = 0; (void)TrailingOmittedArgs;
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
break;
|
|
case 0 : {
|
|
OS << "__attribute__((zero_call_used_regs";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ZeroCallUsedRegsAttr::ConvertZeroCallUsedRegsKindToStr(getZeroCallUsedRegs()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "))";
|
|
break;
|
|
}
|
|
case 1 : {
|
|
OS << "[[gnu::zero_call_used_regs";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ZeroCallUsedRegsAttr::ConvertZeroCallUsedRegsKindToStr(getZeroCallUsedRegs()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
case 2 : {
|
|
OS << "[[gnu::zero_call_used_regs";
|
|
DelimitAttributeArgument(OS, IsFirstArgument);
|
|
OS << "\"" << ZeroCallUsedRegsAttr::ConvertZeroCallUsedRegsKindToStr(getZeroCallUsedRegs()) << "\"";
|
|
if (!IsFirstArgument)
|
|
OS << ")";
|
|
OS << "]]";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *ZeroCallUsedRegsAttr::getSpelling() const {
|
|
switch (getAttributeSpellingListIndex()) {
|
|
default:
|
|
llvm_unreachable("Unknown attribute spelling!");
|
|
return "(No spelling)";
|
|
case 0:
|
|
return "zero_call_used_regs";
|
|
case 1:
|
|
return "zero_call_used_regs";
|
|
case 2:
|
|
return "zero_call_used_regs";
|
|
}
|
|
}
|
|
|
|
const char *Attr::getSpelling() const {
|
|
switch (getKind()) {
|
|
case attr::AArch64SVEPcs:
|
|
return cast<AArch64SVEPcsAttr>(this)->getSpelling();
|
|
case attr::AArch64VectorPcs:
|
|
return cast<AArch64VectorPcsAttr>(this)->getSpelling();
|
|
case attr::AMDGPUFlatWorkGroupSize:
|
|
return cast<AMDGPUFlatWorkGroupSizeAttr>(this)->getSpelling();
|
|
case attr::AMDGPUKernelCall:
|
|
return cast<AMDGPUKernelCallAttr>(this)->getSpelling();
|
|
case attr::AMDGPUMaxNumWorkGroups:
|
|
return cast<AMDGPUMaxNumWorkGroupsAttr>(this)->getSpelling();
|
|
case attr::AMDGPUNumSGPR:
|
|
return cast<AMDGPUNumSGPRAttr>(this)->getSpelling();
|
|
case attr::AMDGPUNumVGPR:
|
|
return cast<AMDGPUNumVGPRAttr>(this)->getSpelling();
|
|
case attr::AMDGPUWavesPerEU:
|
|
return cast<AMDGPUWavesPerEUAttr>(this)->getSpelling();
|
|
case attr::ARMInterrupt:
|
|
return cast<ARMInterruptAttr>(this)->getSpelling();
|
|
case attr::AVRInterrupt:
|
|
return cast<AVRInterruptAttr>(this)->getSpelling();
|
|
case attr::AVRSignal:
|
|
return cast<AVRSignalAttr>(this)->getSpelling();
|
|
case attr::AbiTag:
|
|
return cast<AbiTagAttr>(this)->getSpelling();
|
|
case attr::AcquireCapability:
|
|
return cast<AcquireCapabilityAttr>(this)->getSpelling();
|
|
case attr::AcquireHandle:
|
|
return cast<AcquireHandleAttr>(this)->getSpelling();
|
|
case attr::AcquiredAfter:
|
|
return cast<AcquiredAfterAttr>(this)->getSpelling();
|
|
case attr::AcquiredBefore:
|
|
return cast<AcquiredBeforeAttr>(this)->getSpelling();
|
|
case attr::AddressSpace:
|
|
return cast<AddressSpaceAttr>(this)->getSpelling();
|
|
case attr::Alias:
|
|
return cast<AliasAttr>(this)->getSpelling();
|
|
case attr::AlignMac68k:
|
|
return cast<AlignMac68kAttr>(this)->getSpelling();
|
|
case attr::AlignNatural:
|
|
return cast<AlignNaturalAttr>(this)->getSpelling();
|
|
case attr::AlignValue:
|
|
return cast<AlignValueAttr>(this)->getSpelling();
|
|
case attr::Aligned:
|
|
return cast<AlignedAttr>(this)->getSpelling();
|
|
case attr::AllocAlign:
|
|
return cast<AllocAlignAttr>(this)->getSpelling();
|
|
case attr::AllocSize:
|
|
return cast<AllocSizeAttr>(this)->getSpelling();
|
|
case attr::Allocating:
|
|
return cast<AllocatingAttr>(this)->getSpelling();
|
|
case attr::AlwaysDestroy:
|
|
return cast<AlwaysDestroyAttr>(this)->getSpelling();
|
|
case attr::AlwaysInline:
|
|
return cast<AlwaysInlineAttr>(this)->getSpelling();
|
|
case attr::AnalyzerNoReturn:
|
|
return cast<AnalyzerNoReturnAttr>(this)->getSpelling();
|
|
case attr::Annotate:
|
|
return cast<AnnotateAttr>(this)->getSpelling();
|
|
case attr::AnnotateType:
|
|
return cast<AnnotateTypeAttr>(this)->getSpelling();
|
|
case attr::AnyX86Interrupt:
|
|
return cast<AnyX86InterruptAttr>(this)->getSpelling();
|
|
case attr::AnyX86NoCallerSavedRegisters:
|
|
return cast<AnyX86NoCallerSavedRegistersAttr>(this)->getSpelling();
|
|
case attr::AnyX86NoCfCheck:
|
|
return cast<AnyX86NoCfCheckAttr>(this)->getSpelling();
|
|
case attr::ArcWeakrefUnavailable:
|
|
return cast<ArcWeakrefUnavailableAttr>(this)->getSpelling();
|
|
case attr::ArgumentWithTypeTag:
|
|
return cast<ArgumentWithTypeTagAttr>(this)->getSpelling();
|
|
case attr::ArmBuiltinAlias:
|
|
return cast<ArmBuiltinAliasAttr>(this)->getSpelling();
|
|
case attr::ArmIn:
|
|
return cast<ArmInAttr>(this)->getSpelling();
|
|
case attr::ArmInOut:
|
|
return cast<ArmInOutAttr>(this)->getSpelling();
|
|
case attr::ArmLocallyStreaming:
|
|
return cast<ArmLocallyStreamingAttr>(this)->getSpelling();
|
|
case attr::ArmMveStrictPolymorphism:
|
|
return cast<ArmMveStrictPolymorphismAttr>(this)->getSpelling();
|
|
case attr::ArmNew:
|
|
return cast<ArmNewAttr>(this)->getSpelling();
|
|
case attr::ArmOut:
|
|
return cast<ArmOutAttr>(this)->getSpelling();
|
|
case attr::ArmPreserves:
|
|
return cast<ArmPreservesAttr>(this)->getSpelling();
|
|
case attr::ArmStreaming:
|
|
return cast<ArmStreamingAttr>(this)->getSpelling();
|
|
case attr::ArmStreamingCompatible:
|
|
return cast<ArmStreamingCompatibleAttr>(this)->getSpelling();
|
|
case attr::Artificial:
|
|
return cast<ArtificialAttr>(this)->getSpelling();
|
|
case attr::AsmLabel:
|
|
return cast<AsmLabelAttr>(this)->getSpelling();
|
|
case attr::AssertCapability:
|
|
return cast<AssertCapabilityAttr>(this)->getSpelling();
|
|
case attr::AssertExclusiveLock:
|
|
return cast<AssertExclusiveLockAttr>(this)->getSpelling();
|
|
case attr::AssertSharedLock:
|
|
return cast<AssertSharedLockAttr>(this)->getSpelling();
|
|
case attr::AssumeAligned:
|
|
return cast<AssumeAlignedAttr>(this)->getSpelling();
|
|
case attr::Availability:
|
|
return cast<AvailabilityAttr>(this)->getSpelling();
|
|
case attr::AvailableOnlyInDefaultEvalMethod:
|
|
return cast<AvailableOnlyInDefaultEvalMethodAttr>(this)->getSpelling();
|
|
case attr::BPFFastCall:
|
|
return cast<BPFFastCallAttr>(this)->getSpelling();
|
|
case attr::BPFPreserveAccessIndex:
|
|
return cast<BPFPreserveAccessIndexAttr>(this)->getSpelling();
|
|
case attr::BPFPreserveStaticOffset:
|
|
return cast<BPFPreserveStaticOffsetAttr>(this)->getSpelling();
|
|
case attr::BTFDeclTag:
|
|
return cast<BTFDeclTagAttr>(this)->getSpelling();
|
|
case attr::BTFTypeTag:
|
|
return cast<BTFTypeTagAttr>(this)->getSpelling();
|
|
case attr::Blocking:
|
|
return cast<BlockingAttr>(this)->getSpelling();
|
|
case attr::Blocks:
|
|
return cast<BlocksAttr>(this)->getSpelling();
|
|
case attr::Builtin:
|
|
return cast<BuiltinAttr>(this)->getSpelling();
|
|
case attr::BuiltinAlias:
|
|
return cast<BuiltinAliasAttr>(this)->getSpelling();
|
|
case attr::C11NoReturn:
|
|
return cast<C11NoReturnAttr>(this)->getSpelling();
|
|
case attr::CDecl:
|
|
return cast<CDeclAttr>(this)->getSpelling();
|
|
case attr::CFAuditedTransfer:
|
|
return cast<CFAuditedTransferAttr>(this)->getSpelling();
|
|
case attr::CFConsumed:
|
|
return cast<CFConsumedAttr>(this)->getSpelling();
|
|
case attr::CFGuard:
|
|
return cast<CFGuardAttr>(this)->getSpelling();
|
|
case attr::CFICanonicalJumpTable:
|
|
return cast<CFICanonicalJumpTableAttr>(this)->getSpelling();
|
|
case attr::CFReturnsNotRetained:
|
|
return cast<CFReturnsNotRetainedAttr>(this)->getSpelling();
|
|
case attr::CFReturnsRetained:
|
|
return cast<CFReturnsRetainedAttr>(this)->getSpelling();
|
|
case attr::CFUnknownTransfer:
|
|
return cast<CFUnknownTransferAttr>(this)->getSpelling();
|
|
case attr::CPUDispatch:
|
|
return cast<CPUDispatchAttr>(this)->getSpelling();
|
|
case attr::CPUSpecific:
|
|
return cast<CPUSpecificAttr>(this)->getSpelling();
|
|
case attr::CUDAConstant:
|
|
return cast<CUDAConstantAttr>(this)->getSpelling();
|
|
case attr::CUDADevice:
|
|
return cast<CUDADeviceAttr>(this)->getSpelling();
|
|
case attr::CUDADeviceBuiltinSurfaceType:
|
|
return cast<CUDADeviceBuiltinSurfaceTypeAttr>(this)->getSpelling();
|
|
case attr::CUDADeviceBuiltinTextureType:
|
|
return cast<CUDADeviceBuiltinTextureTypeAttr>(this)->getSpelling();
|
|
case attr::CUDAGlobal:
|
|
return cast<CUDAGlobalAttr>(this)->getSpelling();
|
|
case attr::CUDAHost:
|
|
return cast<CUDAHostAttr>(this)->getSpelling();
|
|
case attr::CUDAInvalidTarget:
|
|
return cast<CUDAInvalidTargetAttr>(this)->getSpelling();
|
|
case attr::CUDALaunchBounds:
|
|
return cast<CUDALaunchBoundsAttr>(this)->getSpelling();
|
|
case attr::CUDAShared:
|
|
return cast<CUDASharedAttr>(this)->getSpelling();
|
|
case attr::CXX11NoReturn:
|
|
return cast<CXX11NoReturnAttr>(this)->getSpelling();
|
|
case attr::CXXAssume:
|
|
return cast<CXXAssumeAttr>(this)->getSpelling();
|
|
case attr::CallableWhen:
|
|
return cast<CallableWhenAttr>(this)->getSpelling();
|
|
case attr::Callback:
|
|
return cast<CallbackAttr>(this)->getSpelling();
|
|
case attr::CalledOnce:
|
|
return cast<CalledOnceAttr>(this)->getSpelling();
|
|
case attr::Capability:
|
|
return cast<CapabilityAttr>(this)->getSpelling();
|
|
case attr::CapturedRecord:
|
|
return cast<CapturedRecordAttr>(this)->getSpelling();
|
|
case attr::CarriesDependency:
|
|
return cast<CarriesDependencyAttr>(this)->getSpelling();
|
|
case attr::Cleanup:
|
|
return cast<CleanupAttr>(this)->getSpelling();
|
|
case attr::ClspvLibclcBuiltin:
|
|
return cast<ClspvLibclcBuiltinAttr>(this)->getSpelling();
|
|
case attr::CmseNSCall:
|
|
return cast<CmseNSCallAttr>(this)->getSpelling();
|
|
case attr::CmseNSEntry:
|
|
return cast<CmseNSEntryAttr>(this)->getSpelling();
|
|
case attr::CodeAlign:
|
|
return cast<CodeAlignAttr>(this)->getSpelling();
|
|
case attr::CodeModel:
|
|
return cast<CodeModelAttr>(this)->getSpelling();
|
|
case attr::CodeSeg:
|
|
return cast<CodeSegAttr>(this)->getSpelling();
|
|
case attr::Cold:
|
|
return cast<ColdAttr>(this)->getSpelling();
|
|
case attr::Common:
|
|
return cast<CommonAttr>(this)->getSpelling();
|
|
case attr::Const:
|
|
return cast<ConstAttr>(this)->getSpelling();
|
|
case attr::ConstInit:
|
|
return cast<ConstInitAttr>(this)->getSpelling();
|
|
case attr::Constructor:
|
|
return cast<ConstructorAttr>(this)->getSpelling();
|
|
case attr::Consumable:
|
|
return cast<ConsumableAttr>(this)->getSpelling();
|
|
case attr::ConsumableAutoCast:
|
|
return cast<ConsumableAutoCastAttr>(this)->getSpelling();
|
|
case attr::ConsumableSetOnRead:
|
|
return cast<ConsumableSetOnReadAttr>(this)->getSpelling();
|
|
case attr::Convergent:
|
|
return cast<ConvergentAttr>(this)->getSpelling();
|
|
case attr::CoroDisableLifetimeBound:
|
|
return cast<CoroDisableLifetimeBoundAttr>(this)->getSpelling();
|
|
case attr::CoroLifetimeBound:
|
|
return cast<CoroLifetimeBoundAttr>(this)->getSpelling();
|
|
case attr::CoroOnlyDestroyWhenComplete:
|
|
return cast<CoroOnlyDestroyWhenCompleteAttr>(this)->getSpelling();
|
|
case attr::CoroReturnType:
|
|
return cast<CoroReturnTypeAttr>(this)->getSpelling();
|
|
case attr::CoroWrapper:
|
|
return cast<CoroWrapperAttr>(this)->getSpelling();
|
|
case attr::CountedBy:
|
|
return cast<CountedByAttr>(this)->getSpelling();
|
|
case attr::CountedByOrNull:
|
|
return cast<CountedByOrNullAttr>(this)->getSpelling();
|
|
case attr::DLLExport:
|
|
return cast<DLLExportAttr>(this)->getSpelling();
|
|
case attr::DLLExportStaticLocal:
|
|
return cast<DLLExportStaticLocalAttr>(this)->getSpelling();
|
|
case attr::DLLImport:
|
|
return cast<DLLImportAttr>(this)->getSpelling();
|
|
case attr::DLLImportStaticLocal:
|
|
return cast<DLLImportStaticLocalAttr>(this)->getSpelling();
|
|
case attr::Deprecated:
|
|
return cast<DeprecatedAttr>(this)->getSpelling();
|
|
case attr::Destructor:
|
|
return cast<DestructorAttr>(this)->getSpelling();
|
|
case attr::DiagnoseAsBuiltin:
|
|
return cast<DiagnoseAsBuiltinAttr>(this)->getSpelling();
|
|
case attr::DiagnoseIf:
|
|
return cast<DiagnoseIfAttr>(this)->getSpelling();
|
|
case attr::DisableSanitizerInstrumentation:
|
|
return cast<DisableSanitizerInstrumentationAttr>(this)->getSpelling();
|
|
case attr::DisableTailCalls:
|
|
return cast<DisableTailCallsAttr>(this)->getSpelling();
|
|
case attr::EmptyBases:
|
|
return cast<EmptyBasesAttr>(this)->getSpelling();
|
|
case attr::EnableIf:
|
|
return cast<EnableIfAttr>(this)->getSpelling();
|
|
case attr::EnforceTCB:
|
|
return cast<EnforceTCBAttr>(this)->getSpelling();
|
|
case attr::EnforceTCBLeaf:
|
|
return cast<EnforceTCBLeafAttr>(this)->getSpelling();
|
|
case attr::EnumExtensibility:
|
|
return cast<EnumExtensibilityAttr>(this)->getSpelling();
|
|
case attr::Error:
|
|
return cast<ErrorAttr>(this)->getSpelling();
|
|
case attr::ExcludeFromExplicitInstantiation:
|
|
return cast<ExcludeFromExplicitInstantiationAttr>(this)->getSpelling();
|
|
case attr::ExclusiveTrylockFunction:
|
|
return cast<ExclusiveTrylockFunctionAttr>(this)->getSpelling();
|
|
case attr::ExternalSourceSymbol:
|
|
return cast<ExternalSourceSymbolAttr>(this)->getSpelling();
|
|
case attr::FallThrough:
|
|
return cast<FallThroughAttr>(this)->getSpelling();
|
|
case attr::FastCall:
|
|
return cast<FastCallAttr>(this)->getSpelling();
|
|
case attr::Final:
|
|
return cast<FinalAttr>(this)->getSpelling();
|
|
case attr::FlagEnum:
|
|
return cast<FlagEnumAttr>(this)->getSpelling();
|
|
case attr::Flatten:
|
|
return cast<FlattenAttr>(this)->getSpelling();
|
|
case attr::Format:
|
|
return cast<FormatAttr>(this)->getSpelling();
|
|
case attr::FormatArg:
|
|
return cast<FormatArgAttr>(this)->getSpelling();
|
|
case attr::FunctionReturnThunks:
|
|
return cast<FunctionReturnThunksAttr>(this)->getSpelling();
|
|
case attr::GNUInline:
|
|
return cast<GNUInlineAttr>(this)->getSpelling();
|
|
case attr::GuardedBy:
|
|
return cast<GuardedByAttr>(this)->getSpelling();
|
|
case attr::GuardedVar:
|
|
return cast<GuardedVarAttr>(this)->getSpelling();
|
|
case attr::HIPManaged:
|
|
return cast<HIPManagedAttr>(this)->getSpelling();
|
|
case attr::HLSLGroupSharedAddressSpace:
|
|
return cast<HLSLGroupSharedAddressSpaceAttr>(this)->getSpelling();
|
|
case attr::HLSLLoopHint:
|
|
return cast<HLSLLoopHintAttr>(this)->getSpelling();
|
|
case attr::HLSLNumThreads:
|
|
return cast<HLSLNumThreadsAttr>(this)->getSpelling();
|
|
case attr::HLSLPackOffset:
|
|
return cast<HLSLPackOffsetAttr>(this)->getSpelling();
|
|
case attr::HLSLParamModifier:
|
|
return cast<HLSLParamModifierAttr>(this)->getSpelling();
|
|
case attr::HLSLROV:
|
|
return cast<HLSLROVAttr>(this)->getSpelling();
|
|
case attr::HLSLResource:
|
|
return cast<HLSLResourceAttr>(this)->getSpelling();
|
|
case attr::HLSLResourceBinding:
|
|
return cast<HLSLResourceBindingAttr>(this)->getSpelling();
|
|
case attr::HLSLResourceClass:
|
|
return cast<HLSLResourceClassAttr>(this)->getSpelling();
|
|
case attr::HLSLSV_DispatchThreadID:
|
|
return cast<HLSLSV_DispatchThreadIDAttr>(this)->getSpelling();
|
|
case attr::HLSLSV_GroupIndex:
|
|
return cast<HLSLSV_GroupIndexAttr>(this)->getSpelling();
|
|
case attr::HLSLShader:
|
|
return cast<HLSLShaderAttr>(this)->getSpelling();
|
|
case attr::Hot:
|
|
return cast<HotAttr>(this)->getSpelling();
|
|
case attr::HybridPatchable:
|
|
return cast<HybridPatchableAttr>(this)->getSpelling();
|
|
case attr::IBAction:
|
|
return cast<IBActionAttr>(this)->getSpelling();
|
|
case attr::IBOutlet:
|
|
return cast<IBOutletAttr>(this)->getSpelling();
|
|
case attr::IBOutletCollection:
|
|
return cast<IBOutletCollectionAttr>(this)->getSpelling();
|
|
case attr::IFunc:
|
|
return cast<IFuncAttr>(this)->getSpelling();
|
|
case attr::InitPriority:
|
|
return cast<InitPriorityAttr>(this)->getSpelling();
|
|
case attr::InitSeg:
|
|
return cast<InitSegAttr>(this)->getSpelling();
|
|
case attr::IntelOclBicc:
|
|
return cast<IntelOclBiccAttr>(this)->getSpelling();
|
|
case attr::InternalLinkage:
|
|
return cast<InternalLinkageAttr>(this)->getSpelling();
|
|
case attr::LTOVisibilityPublic:
|
|
return cast<LTOVisibilityPublicAttr>(this)->getSpelling();
|
|
case attr::LayoutVersion:
|
|
return cast<LayoutVersionAttr>(this)->getSpelling();
|
|
case attr::Leaf:
|
|
return cast<LeafAttr>(this)->getSpelling();
|
|
case attr::LifetimeBound:
|
|
return cast<LifetimeBoundAttr>(this)->getSpelling();
|
|
case attr::Likely:
|
|
return cast<LikelyAttr>(this)->getSpelling();
|
|
case attr::LoaderUninitialized:
|
|
return cast<LoaderUninitializedAttr>(this)->getSpelling();
|
|
case attr::LockReturned:
|
|
return cast<LockReturnedAttr>(this)->getSpelling();
|
|
case attr::LocksExcluded:
|
|
return cast<LocksExcludedAttr>(this)->getSpelling();
|
|
case attr::LoopHint:
|
|
return cast<LoopHintAttr>(this)->getSpelling();
|
|
case attr::M68kInterrupt:
|
|
return cast<M68kInterruptAttr>(this)->getSpelling();
|
|
case attr::M68kRTD:
|
|
return cast<M68kRTDAttr>(this)->getSpelling();
|
|
case attr::MIGServerRoutine:
|
|
return cast<MIGServerRoutineAttr>(this)->getSpelling();
|
|
case attr::MSABI:
|
|
return cast<MSABIAttr>(this)->getSpelling();
|
|
case attr::MSAllocator:
|
|
return cast<MSAllocatorAttr>(this)->getSpelling();
|
|
case attr::MSConstexpr:
|
|
return cast<MSConstexprAttr>(this)->getSpelling();
|
|
case attr::MSInheritance:
|
|
return cast<MSInheritanceAttr>(this)->getSpelling();
|
|
case attr::MSNoVTable:
|
|
return cast<MSNoVTableAttr>(this)->getSpelling();
|
|
case attr::MSP430Interrupt:
|
|
return cast<MSP430InterruptAttr>(this)->getSpelling();
|
|
case attr::MSStruct:
|
|
return cast<MSStructAttr>(this)->getSpelling();
|
|
case attr::MSVtorDisp:
|
|
return cast<MSVtorDispAttr>(this)->getSpelling();
|
|
case attr::MaxFieldAlignment:
|
|
return cast<MaxFieldAlignmentAttr>(this)->getSpelling();
|
|
case attr::MayAlias:
|
|
return cast<MayAliasAttr>(this)->getSpelling();
|
|
case attr::MaybeUndef:
|
|
return cast<MaybeUndefAttr>(this)->getSpelling();
|
|
case attr::MicroMips:
|
|
return cast<MicroMipsAttr>(this)->getSpelling();
|
|
case attr::MinSize:
|
|
return cast<MinSizeAttr>(this)->getSpelling();
|
|
case attr::MinVectorWidth:
|
|
return cast<MinVectorWidthAttr>(this)->getSpelling();
|
|
case attr::Mips16:
|
|
return cast<Mips16Attr>(this)->getSpelling();
|
|
case attr::MipsInterrupt:
|
|
return cast<MipsInterruptAttr>(this)->getSpelling();
|
|
case attr::MipsLongCall:
|
|
return cast<MipsLongCallAttr>(this)->getSpelling();
|
|
case attr::MipsShortCall:
|
|
return cast<MipsShortCallAttr>(this)->getSpelling();
|
|
case attr::Mode:
|
|
return cast<ModeAttr>(this)->getSpelling();
|
|
case attr::MustTail:
|
|
return cast<MustTailAttr>(this)->getSpelling();
|
|
case attr::NSConsumed:
|
|
return cast<NSConsumedAttr>(this)->getSpelling();
|
|
case attr::NSConsumesSelf:
|
|
return cast<NSConsumesSelfAttr>(this)->getSpelling();
|
|
case attr::NSErrorDomain:
|
|
return cast<NSErrorDomainAttr>(this)->getSpelling();
|
|
case attr::NSReturnsAutoreleased:
|
|
return cast<NSReturnsAutoreleasedAttr>(this)->getSpelling();
|
|
case attr::NSReturnsNotRetained:
|
|
return cast<NSReturnsNotRetainedAttr>(this)->getSpelling();
|
|
case attr::NSReturnsRetained:
|
|
return cast<NSReturnsRetainedAttr>(this)->getSpelling();
|
|
case attr::NVPTXKernel:
|
|
return cast<NVPTXKernelAttr>(this)->getSpelling();
|
|
case attr::Naked:
|
|
return cast<NakedAttr>(this)->getSpelling();
|
|
case attr::NoAlias:
|
|
return cast<NoAliasAttr>(this)->getSpelling();
|
|
case attr::NoBuiltin:
|
|
return cast<NoBuiltinAttr>(this)->getSpelling();
|
|
case attr::NoCommon:
|
|
return cast<NoCommonAttr>(this)->getSpelling();
|
|
case attr::NoConvergent:
|
|
return cast<NoConvergentAttr>(this)->getSpelling();
|
|
case attr::NoDebug:
|
|
return cast<NoDebugAttr>(this)->getSpelling();
|
|
case attr::NoDeref:
|
|
return cast<NoDerefAttr>(this)->getSpelling();
|
|
case attr::NoDestroy:
|
|
return cast<NoDestroyAttr>(this)->getSpelling();
|
|
case attr::NoDuplicate:
|
|
return cast<NoDuplicateAttr>(this)->getSpelling();
|
|
case attr::NoEscape:
|
|
return cast<NoEscapeAttr>(this)->getSpelling();
|
|
case attr::NoInline:
|
|
return cast<NoInlineAttr>(this)->getSpelling();
|
|
case attr::NoInstrumentFunction:
|
|
return cast<NoInstrumentFunctionAttr>(this)->getSpelling();
|
|
case attr::NoMerge:
|
|
return cast<NoMergeAttr>(this)->getSpelling();
|
|
case attr::NoMicroMips:
|
|
return cast<NoMicroMipsAttr>(this)->getSpelling();
|
|
case attr::NoMips16:
|
|
return cast<NoMips16Attr>(this)->getSpelling();
|
|
case attr::NoProfileFunction:
|
|
return cast<NoProfileFunctionAttr>(this)->getSpelling();
|
|
case attr::NoRandomizeLayout:
|
|
return cast<NoRandomizeLayoutAttr>(this)->getSpelling();
|
|
case attr::NoReturn:
|
|
return cast<NoReturnAttr>(this)->getSpelling();
|
|
case attr::NoSanitize:
|
|
return cast<NoSanitizeAttr>(this)->getSpelling();
|
|
case attr::NoSpeculativeLoadHardening:
|
|
return cast<NoSpeculativeLoadHardeningAttr>(this)->getSpelling();
|
|
case attr::NoSplitStack:
|
|
return cast<NoSplitStackAttr>(this)->getSpelling();
|
|
case attr::NoStackProtector:
|
|
return cast<NoStackProtectorAttr>(this)->getSpelling();
|
|
case attr::NoThreadSafetyAnalysis:
|
|
return cast<NoThreadSafetyAnalysisAttr>(this)->getSpelling();
|
|
case attr::NoThrow:
|
|
return cast<NoThrowAttr>(this)->getSpelling();
|
|
case attr::NoUniqueAddress:
|
|
return cast<NoUniqueAddressAttr>(this)->getSpelling();
|
|
case attr::NoUwtable:
|
|
return cast<NoUwtableAttr>(this)->getSpelling();
|
|
case attr::NonAllocating:
|
|
return cast<NonAllocatingAttr>(this)->getSpelling();
|
|
case attr::NonBlocking:
|
|
return cast<NonBlockingAttr>(this)->getSpelling();
|
|
case attr::NonNull:
|
|
return cast<NonNullAttr>(this)->getSpelling();
|
|
case attr::NotTailCalled:
|
|
return cast<NotTailCalledAttr>(this)->getSpelling();
|
|
case attr::OMPAllocateDecl:
|
|
return cast<OMPAllocateDeclAttr>(this)->getSpelling();
|
|
case attr::OMPAssume:
|
|
return cast<OMPAssumeAttr>(this)->getSpelling();
|
|
case attr::OMPCaptureKind:
|
|
return cast<OMPCaptureKindAttr>(this)->getSpelling();
|
|
case attr::OMPCaptureNoInit:
|
|
return cast<OMPCaptureNoInitAttr>(this)->getSpelling();
|
|
case attr::OMPDeclareSimdDecl:
|
|
return cast<OMPDeclareSimdDeclAttr>(this)->getSpelling();
|
|
case attr::OMPDeclareTargetDecl:
|
|
return cast<OMPDeclareTargetDeclAttr>(this)->getSpelling();
|
|
case attr::OMPDeclareVariant:
|
|
return cast<OMPDeclareVariantAttr>(this)->getSpelling();
|
|
case attr::OMPReferencedVar:
|
|
return cast<OMPReferencedVarAttr>(this)->getSpelling();
|
|
case attr::OMPThreadPrivateDecl:
|
|
return cast<OMPThreadPrivateDeclAttr>(this)->getSpelling();
|
|
case attr::OSConsumed:
|
|
return cast<OSConsumedAttr>(this)->getSpelling();
|
|
case attr::OSConsumesThis:
|
|
return cast<OSConsumesThisAttr>(this)->getSpelling();
|
|
case attr::OSReturnsNotRetained:
|
|
return cast<OSReturnsNotRetainedAttr>(this)->getSpelling();
|
|
case attr::OSReturnsRetained:
|
|
return cast<OSReturnsRetainedAttr>(this)->getSpelling();
|
|
case attr::OSReturnsRetainedOnNonZero:
|
|
return cast<OSReturnsRetainedOnNonZeroAttr>(this)->getSpelling();
|
|
case attr::OSReturnsRetainedOnZero:
|
|
return cast<OSReturnsRetainedOnZeroAttr>(this)->getSpelling();
|
|
case attr::ObjCBoxable:
|
|
return cast<ObjCBoxableAttr>(this)->getSpelling();
|
|
case attr::ObjCBridge:
|
|
return cast<ObjCBridgeAttr>(this)->getSpelling();
|
|
case attr::ObjCBridgeMutable:
|
|
return cast<ObjCBridgeMutableAttr>(this)->getSpelling();
|
|
case attr::ObjCBridgeRelated:
|
|
return cast<ObjCBridgeRelatedAttr>(this)->getSpelling();
|
|
case attr::ObjCClassStub:
|
|
return cast<ObjCClassStubAttr>(this)->getSpelling();
|
|
case attr::ObjCDesignatedInitializer:
|
|
return cast<ObjCDesignatedInitializerAttr>(this)->getSpelling();
|
|
case attr::ObjCDirect:
|
|
return cast<ObjCDirectAttr>(this)->getSpelling();
|
|
case attr::ObjCDirectMembers:
|
|
return cast<ObjCDirectMembersAttr>(this)->getSpelling();
|
|
case attr::ObjCException:
|
|
return cast<ObjCExceptionAttr>(this)->getSpelling();
|
|
case attr::ObjCExplicitProtocolImpl:
|
|
return cast<ObjCExplicitProtocolImplAttr>(this)->getSpelling();
|
|
case attr::ObjCExternallyRetained:
|
|
return cast<ObjCExternallyRetainedAttr>(this)->getSpelling();
|
|
case attr::ObjCGC:
|
|
return cast<ObjCGCAttr>(this)->getSpelling();
|
|
case attr::ObjCIndependentClass:
|
|
return cast<ObjCIndependentClassAttr>(this)->getSpelling();
|
|
case attr::ObjCInertUnsafeUnretained:
|
|
return cast<ObjCInertUnsafeUnretainedAttr>(this)->getSpelling();
|
|
case attr::ObjCKindOf:
|
|
return cast<ObjCKindOfAttr>(this)->getSpelling();
|
|
case attr::ObjCMethodFamily:
|
|
return cast<ObjCMethodFamilyAttr>(this)->getSpelling();
|
|
case attr::ObjCNSObject:
|
|
return cast<ObjCNSObjectAttr>(this)->getSpelling();
|
|
case attr::ObjCNonLazyClass:
|
|
return cast<ObjCNonLazyClassAttr>(this)->getSpelling();
|
|
case attr::ObjCNonRuntimeProtocol:
|
|
return cast<ObjCNonRuntimeProtocolAttr>(this)->getSpelling();
|
|
case attr::ObjCOwnership:
|
|
return cast<ObjCOwnershipAttr>(this)->getSpelling();
|
|
case attr::ObjCPreciseLifetime:
|
|
return cast<ObjCPreciseLifetimeAttr>(this)->getSpelling();
|
|
case attr::ObjCRequiresPropertyDefs:
|
|
return cast<ObjCRequiresPropertyDefsAttr>(this)->getSpelling();
|
|
case attr::ObjCRequiresSuper:
|
|
return cast<ObjCRequiresSuperAttr>(this)->getSpelling();
|
|
case attr::ObjCReturnsInnerPointer:
|
|
return cast<ObjCReturnsInnerPointerAttr>(this)->getSpelling();
|
|
case attr::ObjCRootClass:
|
|
return cast<ObjCRootClassAttr>(this)->getSpelling();
|
|
case attr::ObjCRuntimeName:
|
|
return cast<ObjCRuntimeNameAttr>(this)->getSpelling();
|
|
case attr::ObjCRuntimeVisible:
|
|
return cast<ObjCRuntimeVisibleAttr>(this)->getSpelling();
|
|
case attr::ObjCSubclassingRestricted:
|
|
return cast<ObjCSubclassingRestrictedAttr>(this)->getSpelling();
|
|
case attr::OpenCLAccess:
|
|
return cast<OpenCLAccessAttr>(this)->getSpelling();
|
|
case attr::OpenCLConstantAddressSpace:
|
|
return cast<OpenCLConstantAddressSpaceAttr>(this)->getSpelling();
|
|
case attr::OpenCLGenericAddressSpace:
|
|
return cast<OpenCLGenericAddressSpaceAttr>(this)->getSpelling();
|
|
case attr::OpenCLGlobalAddressSpace:
|
|
return cast<OpenCLGlobalAddressSpaceAttr>(this)->getSpelling();
|
|
case attr::OpenCLGlobalDeviceAddressSpace:
|
|
return cast<OpenCLGlobalDeviceAddressSpaceAttr>(this)->getSpelling();
|
|
case attr::OpenCLGlobalHostAddressSpace:
|
|
return cast<OpenCLGlobalHostAddressSpaceAttr>(this)->getSpelling();
|
|
case attr::OpenCLIntelReqdSubGroupSize:
|
|
return cast<OpenCLIntelReqdSubGroupSizeAttr>(this)->getSpelling();
|
|
case attr::OpenCLKernel:
|
|
return cast<OpenCLKernelAttr>(this)->getSpelling();
|
|
case attr::OpenCLLocalAddressSpace:
|
|
return cast<OpenCLLocalAddressSpaceAttr>(this)->getSpelling();
|
|
case attr::OpenCLPrivateAddressSpace:
|
|
return cast<OpenCLPrivateAddressSpaceAttr>(this)->getSpelling();
|
|
case attr::OpenCLUnrollHint:
|
|
return cast<OpenCLUnrollHintAttr>(this)->getSpelling();
|
|
case attr::OptimizeNone:
|
|
return cast<OptimizeNoneAttr>(this)->getSpelling();
|
|
case attr::Overloadable:
|
|
return cast<OverloadableAttr>(this)->getSpelling();
|
|
case attr::Override:
|
|
return cast<OverrideAttr>(this)->getSpelling();
|
|
case attr::Owner:
|
|
return cast<OwnerAttr>(this)->getSpelling();
|
|
case attr::Ownership:
|
|
return cast<OwnershipAttr>(this)->getSpelling();
|
|
case attr::Packed:
|
|
return cast<PackedAttr>(this)->getSpelling();
|
|
case attr::ParamTypestate:
|
|
return cast<ParamTypestateAttr>(this)->getSpelling();
|
|
case attr::Pascal:
|
|
return cast<PascalAttr>(this)->getSpelling();
|
|
case attr::PassObjectSize:
|
|
return cast<PassObjectSizeAttr>(this)->getSpelling();
|
|
case attr::PatchableFunctionEntry:
|
|
return cast<PatchableFunctionEntryAttr>(this)->getSpelling();
|
|
case attr::Pcs:
|
|
return cast<PcsAttr>(this)->getSpelling();
|
|
case attr::Pointer:
|
|
return cast<PointerAttr>(this)->getSpelling();
|
|
case attr::PragmaClangBSSSection:
|
|
return cast<PragmaClangBSSSectionAttr>(this)->getSpelling();
|
|
case attr::PragmaClangDataSection:
|
|
return cast<PragmaClangDataSectionAttr>(this)->getSpelling();
|
|
case attr::PragmaClangRelroSection:
|
|
return cast<PragmaClangRelroSectionAttr>(this)->getSpelling();
|
|
case attr::PragmaClangRodataSection:
|
|
return cast<PragmaClangRodataSectionAttr>(this)->getSpelling();
|
|
case attr::PragmaClangTextSection:
|
|
return cast<PragmaClangTextSectionAttr>(this)->getSpelling();
|
|
case attr::PreferredName:
|
|
return cast<PreferredNameAttr>(this)->getSpelling();
|
|
case attr::PreferredType:
|
|
return cast<PreferredTypeAttr>(this)->getSpelling();
|
|
case attr::PreserveAll:
|
|
return cast<PreserveAllAttr>(this)->getSpelling();
|
|
case attr::PreserveMost:
|
|
return cast<PreserveMostAttr>(this)->getSpelling();
|
|
case attr::PreserveNone:
|
|
return cast<PreserveNoneAttr>(this)->getSpelling();
|
|
case attr::PtGuardedBy:
|
|
return cast<PtGuardedByAttr>(this)->getSpelling();
|
|
case attr::PtGuardedVar:
|
|
return cast<PtGuardedVarAttr>(this)->getSpelling();
|
|
case attr::Ptr32:
|
|
return cast<Ptr32Attr>(this)->getSpelling();
|
|
case attr::Ptr64:
|
|
return cast<Ptr64Attr>(this)->getSpelling();
|
|
case attr::Pure:
|
|
return cast<PureAttr>(this)->getSpelling();
|
|
case attr::RISCVInterrupt:
|
|
return cast<RISCVInterruptAttr>(this)->getSpelling();
|
|
case attr::RISCVVectorCC:
|
|
return cast<RISCVVectorCCAttr>(this)->getSpelling();
|
|
case attr::RandomizeLayout:
|
|
return cast<RandomizeLayoutAttr>(this)->getSpelling();
|
|
case attr::ReadOnlyPlacement:
|
|
return cast<ReadOnlyPlacementAttr>(this)->getSpelling();
|
|
case attr::RegCall:
|
|
return cast<RegCallAttr>(this)->getSpelling();
|
|
case attr::Reinitializes:
|
|
return cast<ReinitializesAttr>(this)->getSpelling();
|
|
case attr::ReleaseCapability:
|
|
return cast<ReleaseCapabilityAttr>(this)->getSpelling();
|
|
case attr::ReleaseHandle:
|
|
return cast<ReleaseHandleAttr>(this)->getSpelling();
|
|
case attr::RenderScriptKernel:
|
|
return cast<RenderScriptKernelAttr>(this)->getSpelling();
|
|
case attr::ReqdWorkGroupSize:
|
|
return cast<ReqdWorkGroupSizeAttr>(this)->getSpelling();
|
|
case attr::RequiresCapability:
|
|
return cast<RequiresCapabilityAttr>(this)->getSpelling();
|
|
case attr::Restrict:
|
|
return cast<RestrictAttr>(this)->getSpelling();
|
|
case attr::Retain:
|
|
return cast<RetainAttr>(this)->getSpelling();
|
|
case attr::ReturnTypestate:
|
|
return cast<ReturnTypestateAttr>(this)->getSpelling();
|
|
case attr::ReturnsNonNull:
|
|
return cast<ReturnsNonNullAttr>(this)->getSpelling();
|
|
case attr::ReturnsTwice:
|
|
return cast<ReturnsTwiceAttr>(this)->getSpelling();
|
|
case attr::SPtr:
|
|
return cast<SPtrAttr>(this)->getSpelling();
|
|
case attr::SYCLKernel:
|
|
return cast<SYCLKernelAttr>(this)->getSpelling();
|
|
case attr::SYCLSpecialClass:
|
|
return cast<SYCLSpecialClassAttr>(this)->getSpelling();
|
|
case attr::ScopedLockable:
|
|
return cast<ScopedLockableAttr>(this)->getSpelling();
|
|
case attr::Section:
|
|
return cast<SectionAttr>(this)->getSpelling();
|
|
case attr::SelectAny:
|
|
return cast<SelectAnyAttr>(this)->getSpelling();
|
|
case attr::Sentinel:
|
|
return cast<SentinelAttr>(this)->getSpelling();
|
|
case attr::SetTypestate:
|
|
return cast<SetTypestateAttr>(this)->getSpelling();
|
|
case attr::SharedTrylockFunction:
|
|
return cast<SharedTrylockFunctionAttr>(this)->getSpelling();
|
|
case attr::SizedBy:
|
|
return cast<SizedByAttr>(this)->getSpelling();
|
|
case attr::SizedByOrNull:
|
|
return cast<SizedByOrNullAttr>(this)->getSpelling();
|
|
case attr::SpeculativeLoadHardening:
|
|
return cast<SpeculativeLoadHardeningAttr>(this)->getSpelling();
|
|
case attr::StandaloneDebug:
|
|
return cast<StandaloneDebugAttr>(this)->getSpelling();
|
|
case attr::StdCall:
|
|
return cast<StdCallAttr>(this)->getSpelling();
|
|
case attr::StrictFP:
|
|
return cast<StrictFPAttr>(this)->getSpelling();
|
|
case attr::StrictGuardStackCheck:
|
|
return cast<StrictGuardStackCheckAttr>(this)->getSpelling();
|
|
case attr::Suppress:
|
|
return cast<SuppressAttr>(this)->getSpelling();
|
|
case attr::SwiftAsync:
|
|
return cast<SwiftAsyncAttr>(this)->getSpelling();
|
|
case attr::SwiftAsyncCall:
|
|
return cast<SwiftAsyncCallAttr>(this)->getSpelling();
|
|
case attr::SwiftAsyncContext:
|
|
return cast<SwiftAsyncContextAttr>(this)->getSpelling();
|
|
case attr::SwiftAsyncError:
|
|
return cast<SwiftAsyncErrorAttr>(this)->getSpelling();
|
|
case attr::SwiftAsyncName:
|
|
return cast<SwiftAsyncNameAttr>(this)->getSpelling();
|
|
case attr::SwiftAttr:
|
|
return cast<SwiftAttrAttr>(this)->getSpelling();
|
|
case attr::SwiftBridge:
|
|
return cast<SwiftBridgeAttr>(this)->getSpelling();
|
|
case attr::SwiftBridgedTypedef:
|
|
return cast<SwiftBridgedTypedefAttr>(this)->getSpelling();
|
|
case attr::SwiftCall:
|
|
return cast<SwiftCallAttr>(this)->getSpelling();
|
|
case attr::SwiftContext:
|
|
return cast<SwiftContextAttr>(this)->getSpelling();
|
|
case attr::SwiftError:
|
|
return cast<SwiftErrorAttr>(this)->getSpelling();
|
|
case attr::SwiftErrorResult:
|
|
return cast<SwiftErrorResultAttr>(this)->getSpelling();
|
|
case attr::SwiftImportAsNonGeneric:
|
|
return cast<SwiftImportAsNonGenericAttr>(this)->getSpelling();
|
|
case attr::SwiftImportPropertyAsAccessors:
|
|
return cast<SwiftImportPropertyAsAccessorsAttr>(this)->getSpelling();
|
|
case attr::SwiftIndirectResult:
|
|
return cast<SwiftIndirectResultAttr>(this)->getSpelling();
|
|
case attr::SwiftName:
|
|
return cast<SwiftNameAttr>(this)->getSpelling();
|
|
case attr::SwiftNewType:
|
|
return cast<SwiftNewTypeAttr>(this)->getSpelling();
|
|
case attr::SwiftObjCMembers:
|
|
return cast<SwiftObjCMembersAttr>(this)->getSpelling();
|
|
case attr::SwiftPrivate:
|
|
return cast<SwiftPrivateAttr>(this)->getSpelling();
|
|
case attr::SwiftVersionedAddition:
|
|
return cast<SwiftVersionedAdditionAttr>(this)->getSpelling();
|
|
case attr::SwiftVersionedRemoval:
|
|
return cast<SwiftVersionedRemovalAttr>(this)->getSpelling();
|
|
case attr::SysVABI:
|
|
return cast<SysVABIAttr>(this)->getSpelling();
|
|
case attr::TLSModel:
|
|
return cast<TLSModelAttr>(this)->getSpelling();
|
|
case attr::Target:
|
|
return cast<TargetAttr>(this)->getSpelling();
|
|
case attr::TargetClones:
|
|
return cast<TargetClonesAttr>(this)->getSpelling();
|
|
case attr::TargetVersion:
|
|
return cast<TargetVersionAttr>(this)->getSpelling();
|
|
case attr::TestTypestate:
|
|
return cast<TestTypestateAttr>(this)->getSpelling();
|
|
case attr::ThisCall:
|
|
return cast<ThisCallAttr>(this)->getSpelling();
|
|
case attr::Thread:
|
|
return cast<ThreadAttr>(this)->getSpelling();
|
|
case attr::TransparentUnion:
|
|
return cast<TransparentUnionAttr>(this)->getSpelling();
|
|
case attr::TrivialABI:
|
|
return cast<TrivialABIAttr>(this)->getSpelling();
|
|
case attr::TryAcquireCapability:
|
|
return cast<TryAcquireCapabilityAttr>(this)->getSpelling();
|
|
case attr::TypeNonNull:
|
|
return cast<TypeNonNullAttr>(this)->getSpelling();
|
|
case attr::TypeNullUnspecified:
|
|
return cast<TypeNullUnspecifiedAttr>(this)->getSpelling();
|
|
case attr::TypeNullable:
|
|
return cast<TypeNullableAttr>(this)->getSpelling();
|
|
case attr::TypeNullableResult:
|
|
return cast<TypeNullableResultAttr>(this)->getSpelling();
|
|
case attr::TypeTagForDatatype:
|
|
return cast<TypeTagForDatatypeAttr>(this)->getSpelling();
|
|
case attr::TypeVisibility:
|
|
return cast<TypeVisibilityAttr>(this)->getSpelling();
|
|
case attr::UPtr:
|
|
return cast<UPtrAttr>(this)->getSpelling();
|
|
case attr::Unavailable:
|
|
return cast<UnavailableAttr>(this)->getSpelling();
|
|
case attr::Uninitialized:
|
|
return cast<UninitializedAttr>(this)->getSpelling();
|
|
case attr::Unlikely:
|
|
return cast<UnlikelyAttr>(this)->getSpelling();
|
|
case attr::UnsafeBufferUsage:
|
|
return cast<UnsafeBufferUsageAttr>(this)->getSpelling();
|
|
case attr::Unused:
|
|
return cast<UnusedAttr>(this)->getSpelling();
|
|
case attr::UseHandle:
|
|
return cast<UseHandleAttr>(this)->getSpelling();
|
|
case attr::Used:
|
|
return cast<UsedAttr>(this)->getSpelling();
|
|
case attr::UsingIfExists:
|
|
return cast<UsingIfExistsAttr>(this)->getSpelling();
|
|
case attr::Uuid:
|
|
return cast<UuidAttr>(this)->getSpelling();
|
|
case attr::VTablePointerAuthentication:
|
|
return cast<VTablePointerAuthenticationAttr>(this)->getSpelling();
|
|
case attr::VecReturn:
|
|
return cast<VecReturnAttr>(this)->getSpelling();
|
|
case attr::VecTypeHint:
|
|
return cast<VecTypeHintAttr>(this)->getSpelling();
|
|
case attr::VectorCall:
|
|
return cast<VectorCallAttr>(this)->getSpelling();
|
|
case attr::Visibility:
|
|
return cast<VisibilityAttr>(this)->getSpelling();
|
|
case attr::WarnUnused:
|
|
return cast<WarnUnusedAttr>(this)->getSpelling();
|
|
case attr::WarnUnusedResult:
|
|
return cast<WarnUnusedResultAttr>(this)->getSpelling();
|
|
case attr::Weak:
|
|
return cast<WeakAttr>(this)->getSpelling();
|
|
case attr::WeakImport:
|
|
return cast<WeakImportAttr>(this)->getSpelling();
|
|
case attr::WeakRef:
|
|
return cast<WeakRefAttr>(this)->getSpelling();
|
|
case attr::WebAssemblyExportName:
|
|
return cast<WebAssemblyExportNameAttr>(this)->getSpelling();
|
|
case attr::WebAssemblyFuncref:
|
|
return cast<WebAssemblyFuncrefAttr>(this)->getSpelling();
|
|
case attr::WebAssemblyImportModule:
|
|
return cast<WebAssemblyImportModuleAttr>(this)->getSpelling();
|
|
case attr::WebAssemblyImportName:
|
|
return cast<WebAssemblyImportNameAttr>(this)->getSpelling();
|
|
case attr::WorkGroupSizeHint:
|
|
return cast<WorkGroupSizeHintAttr>(this)->getSpelling();
|
|
case attr::X86ForceAlignArgPointer:
|
|
return cast<X86ForceAlignArgPointerAttr>(this)->getSpelling();
|
|
case attr::XRayInstrument:
|
|
return cast<XRayInstrumentAttr>(this)->getSpelling();
|
|
case attr::XRayLogArgs:
|
|
return cast<XRayLogArgsAttr>(this)->getSpelling();
|
|
case attr::ZeroCallUsedRegs:
|
|
return cast<ZeroCallUsedRegsAttr>(this)->getSpelling();
|
|
}
|
|
llvm_unreachable("Unexpected attribute kind!");
|
|
}
|
|
|
|
Attr *Attr::clone(ASTContext &C) const {
|
|
switch (getKind()) {
|
|
case attr::AArch64SVEPcs:
|
|
return cast<AArch64SVEPcsAttr>(this)->clone(C);
|
|
case attr::AArch64VectorPcs:
|
|
return cast<AArch64VectorPcsAttr>(this)->clone(C);
|
|
case attr::AMDGPUFlatWorkGroupSize:
|
|
return cast<AMDGPUFlatWorkGroupSizeAttr>(this)->clone(C);
|
|
case attr::AMDGPUKernelCall:
|
|
return cast<AMDGPUKernelCallAttr>(this)->clone(C);
|
|
case attr::AMDGPUMaxNumWorkGroups:
|
|
return cast<AMDGPUMaxNumWorkGroupsAttr>(this)->clone(C);
|
|
case attr::AMDGPUNumSGPR:
|
|
return cast<AMDGPUNumSGPRAttr>(this)->clone(C);
|
|
case attr::AMDGPUNumVGPR:
|
|
return cast<AMDGPUNumVGPRAttr>(this)->clone(C);
|
|
case attr::AMDGPUWavesPerEU:
|
|
return cast<AMDGPUWavesPerEUAttr>(this)->clone(C);
|
|
case attr::ARMInterrupt:
|
|
return cast<ARMInterruptAttr>(this)->clone(C);
|
|
case attr::AVRInterrupt:
|
|
return cast<AVRInterruptAttr>(this)->clone(C);
|
|
case attr::AVRSignal:
|
|
return cast<AVRSignalAttr>(this)->clone(C);
|
|
case attr::AbiTag:
|
|
return cast<AbiTagAttr>(this)->clone(C);
|
|
case attr::AcquireCapability:
|
|
return cast<AcquireCapabilityAttr>(this)->clone(C);
|
|
case attr::AcquireHandle:
|
|
return cast<AcquireHandleAttr>(this)->clone(C);
|
|
case attr::AcquiredAfter:
|
|
return cast<AcquiredAfterAttr>(this)->clone(C);
|
|
case attr::AcquiredBefore:
|
|
return cast<AcquiredBeforeAttr>(this)->clone(C);
|
|
case attr::AddressSpace:
|
|
return cast<AddressSpaceAttr>(this)->clone(C);
|
|
case attr::Alias:
|
|
return cast<AliasAttr>(this)->clone(C);
|
|
case attr::AlignMac68k:
|
|
return cast<AlignMac68kAttr>(this)->clone(C);
|
|
case attr::AlignNatural:
|
|
return cast<AlignNaturalAttr>(this)->clone(C);
|
|
case attr::AlignValue:
|
|
return cast<AlignValueAttr>(this)->clone(C);
|
|
case attr::Aligned:
|
|
return cast<AlignedAttr>(this)->clone(C);
|
|
case attr::AllocAlign:
|
|
return cast<AllocAlignAttr>(this)->clone(C);
|
|
case attr::AllocSize:
|
|
return cast<AllocSizeAttr>(this)->clone(C);
|
|
case attr::Allocating:
|
|
return cast<AllocatingAttr>(this)->clone(C);
|
|
case attr::AlwaysDestroy:
|
|
return cast<AlwaysDestroyAttr>(this)->clone(C);
|
|
case attr::AlwaysInline:
|
|
return cast<AlwaysInlineAttr>(this)->clone(C);
|
|
case attr::AnalyzerNoReturn:
|
|
return cast<AnalyzerNoReturnAttr>(this)->clone(C);
|
|
case attr::Annotate:
|
|
return cast<AnnotateAttr>(this)->clone(C);
|
|
case attr::AnnotateType:
|
|
return cast<AnnotateTypeAttr>(this)->clone(C);
|
|
case attr::AnyX86Interrupt:
|
|
return cast<AnyX86InterruptAttr>(this)->clone(C);
|
|
case attr::AnyX86NoCallerSavedRegisters:
|
|
return cast<AnyX86NoCallerSavedRegistersAttr>(this)->clone(C);
|
|
case attr::AnyX86NoCfCheck:
|
|
return cast<AnyX86NoCfCheckAttr>(this)->clone(C);
|
|
case attr::ArcWeakrefUnavailable:
|
|
return cast<ArcWeakrefUnavailableAttr>(this)->clone(C);
|
|
case attr::ArgumentWithTypeTag:
|
|
return cast<ArgumentWithTypeTagAttr>(this)->clone(C);
|
|
case attr::ArmBuiltinAlias:
|
|
return cast<ArmBuiltinAliasAttr>(this)->clone(C);
|
|
case attr::ArmIn:
|
|
return cast<ArmInAttr>(this)->clone(C);
|
|
case attr::ArmInOut:
|
|
return cast<ArmInOutAttr>(this)->clone(C);
|
|
case attr::ArmLocallyStreaming:
|
|
return cast<ArmLocallyStreamingAttr>(this)->clone(C);
|
|
case attr::ArmMveStrictPolymorphism:
|
|
return cast<ArmMveStrictPolymorphismAttr>(this)->clone(C);
|
|
case attr::ArmNew:
|
|
return cast<ArmNewAttr>(this)->clone(C);
|
|
case attr::ArmOut:
|
|
return cast<ArmOutAttr>(this)->clone(C);
|
|
case attr::ArmPreserves:
|
|
return cast<ArmPreservesAttr>(this)->clone(C);
|
|
case attr::ArmStreaming:
|
|
return cast<ArmStreamingAttr>(this)->clone(C);
|
|
case attr::ArmStreamingCompatible:
|
|
return cast<ArmStreamingCompatibleAttr>(this)->clone(C);
|
|
case attr::Artificial:
|
|
return cast<ArtificialAttr>(this)->clone(C);
|
|
case attr::AsmLabel:
|
|
return cast<AsmLabelAttr>(this)->clone(C);
|
|
case attr::AssertCapability:
|
|
return cast<AssertCapabilityAttr>(this)->clone(C);
|
|
case attr::AssertExclusiveLock:
|
|
return cast<AssertExclusiveLockAttr>(this)->clone(C);
|
|
case attr::AssertSharedLock:
|
|
return cast<AssertSharedLockAttr>(this)->clone(C);
|
|
case attr::AssumeAligned:
|
|
return cast<AssumeAlignedAttr>(this)->clone(C);
|
|
case attr::Availability:
|
|
return cast<AvailabilityAttr>(this)->clone(C);
|
|
case attr::AvailableOnlyInDefaultEvalMethod:
|
|
return cast<AvailableOnlyInDefaultEvalMethodAttr>(this)->clone(C);
|
|
case attr::BPFFastCall:
|
|
return cast<BPFFastCallAttr>(this)->clone(C);
|
|
case attr::BPFPreserveAccessIndex:
|
|
return cast<BPFPreserveAccessIndexAttr>(this)->clone(C);
|
|
case attr::BPFPreserveStaticOffset:
|
|
return cast<BPFPreserveStaticOffsetAttr>(this)->clone(C);
|
|
case attr::BTFDeclTag:
|
|
return cast<BTFDeclTagAttr>(this)->clone(C);
|
|
case attr::BTFTypeTag:
|
|
return cast<BTFTypeTagAttr>(this)->clone(C);
|
|
case attr::Blocking:
|
|
return cast<BlockingAttr>(this)->clone(C);
|
|
case attr::Blocks:
|
|
return cast<BlocksAttr>(this)->clone(C);
|
|
case attr::Builtin:
|
|
return cast<BuiltinAttr>(this)->clone(C);
|
|
case attr::BuiltinAlias:
|
|
return cast<BuiltinAliasAttr>(this)->clone(C);
|
|
case attr::C11NoReturn:
|
|
return cast<C11NoReturnAttr>(this)->clone(C);
|
|
case attr::CDecl:
|
|
return cast<CDeclAttr>(this)->clone(C);
|
|
case attr::CFAuditedTransfer:
|
|
return cast<CFAuditedTransferAttr>(this)->clone(C);
|
|
case attr::CFConsumed:
|
|
return cast<CFConsumedAttr>(this)->clone(C);
|
|
case attr::CFGuard:
|
|
return cast<CFGuardAttr>(this)->clone(C);
|
|
case attr::CFICanonicalJumpTable:
|
|
return cast<CFICanonicalJumpTableAttr>(this)->clone(C);
|
|
case attr::CFReturnsNotRetained:
|
|
return cast<CFReturnsNotRetainedAttr>(this)->clone(C);
|
|
case attr::CFReturnsRetained:
|
|
return cast<CFReturnsRetainedAttr>(this)->clone(C);
|
|
case attr::CFUnknownTransfer:
|
|
return cast<CFUnknownTransferAttr>(this)->clone(C);
|
|
case attr::CPUDispatch:
|
|
return cast<CPUDispatchAttr>(this)->clone(C);
|
|
case attr::CPUSpecific:
|
|
return cast<CPUSpecificAttr>(this)->clone(C);
|
|
case attr::CUDAConstant:
|
|
return cast<CUDAConstantAttr>(this)->clone(C);
|
|
case attr::CUDADevice:
|
|
return cast<CUDADeviceAttr>(this)->clone(C);
|
|
case attr::CUDADeviceBuiltinSurfaceType:
|
|
return cast<CUDADeviceBuiltinSurfaceTypeAttr>(this)->clone(C);
|
|
case attr::CUDADeviceBuiltinTextureType:
|
|
return cast<CUDADeviceBuiltinTextureTypeAttr>(this)->clone(C);
|
|
case attr::CUDAGlobal:
|
|
return cast<CUDAGlobalAttr>(this)->clone(C);
|
|
case attr::CUDAHost:
|
|
return cast<CUDAHostAttr>(this)->clone(C);
|
|
case attr::CUDAInvalidTarget:
|
|
return cast<CUDAInvalidTargetAttr>(this)->clone(C);
|
|
case attr::CUDALaunchBounds:
|
|
return cast<CUDALaunchBoundsAttr>(this)->clone(C);
|
|
case attr::CUDAShared:
|
|
return cast<CUDASharedAttr>(this)->clone(C);
|
|
case attr::CXX11NoReturn:
|
|
return cast<CXX11NoReturnAttr>(this)->clone(C);
|
|
case attr::CXXAssume:
|
|
return cast<CXXAssumeAttr>(this)->clone(C);
|
|
case attr::CallableWhen:
|
|
return cast<CallableWhenAttr>(this)->clone(C);
|
|
case attr::Callback:
|
|
return cast<CallbackAttr>(this)->clone(C);
|
|
case attr::CalledOnce:
|
|
return cast<CalledOnceAttr>(this)->clone(C);
|
|
case attr::Capability:
|
|
return cast<CapabilityAttr>(this)->clone(C);
|
|
case attr::CapturedRecord:
|
|
return cast<CapturedRecordAttr>(this)->clone(C);
|
|
case attr::CarriesDependency:
|
|
return cast<CarriesDependencyAttr>(this)->clone(C);
|
|
case attr::Cleanup:
|
|
return cast<CleanupAttr>(this)->clone(C);
|
|
case attr::ClspvLibclcBuiltin:
|
|
return cast<ClspvLibclcBuiltinAttr>(this)->clone(C);
|
|
case attr::CmseNSCall:
|
|
return cast<CmseNSCallAttr>(this)->clone(C);
|
|
case attr::CmseNSEntry:
|
|
return cast<CmseNSEntryAttr>(this)->clone(C);
|
|
case attr::CodeAlign:
|
|
return cast<CodeAlignAttr>(this)->clone(C);
|
|
case attr::CodeModel:
|
|
return cast<CodeModelAttr>(this)->clone(C);
|
|
case attr::CodeSeg:
|
|
return cast<CodeSegAttr>(this)->clone(C);
|
|
case attr::Cold:
|
|
return cast<ColdAttr>(this)->clone(C);
|
|
case attr::Common:
|
|
return cast<CommonAttr>(this)->clone(C);
|
|
case attr::Const:
|
|
return cast<ConstAttr>(this)->clone(C);
|
|
case attr::ConstInit:
|
|
return cast<ConstInitAttr>(this)->clone(C);
|
|
case attr::Constructor:
|
|
return cast<ConstructorAttr>(this)->clone(C);
|
|
case attr::Consumable:
|
|
return cast<ConsumableAttr>(this)->clone(C);
|
|
case attr::ConsumableAutoCast:
|
|
return cast<ConsumableAutoCastAttr>(this)->clone(C);
|
|
case attr::ConsumableSetOnRead:
|
|
return cast<ConsumableSetOnReadAttr>(this)->clone(C);
|
|
case attr::Convergent:
|
|
return cast<ConvergentAttr>(this)->clone(C);
|
|
case attr::CoroDisableLifetimeBound:
|
|
return cast<CoroDisableLifetimeBoundAttr>(this)->clone(C);
|
|
case attr::CoroLifetimeBound:
|
|
return cast<CoroLifetimeBoundAttr>(this)->clone(C);
|
|
case attr::CoroOnlyDestroyWhenComplete:
|
|
return cast<CoroOnlyDestroyWhenCompleteAttr>(this)->clone(C);
|
|
case attr::CoroReturnType:
|
|
return cast<CoroReturnTypeAttr>(this)->clone(C);
|
|
case attr::CoroWrapper:
|
|
return cast<CoroWrapperAttr>(this)->clone(C);
|
|
case attr::CountedBy:
|
|
return cast<CountedByAttr>(this)->clone(C);
|
|
case attr::CountedByOrNull:
|
|
return cast<CountedByOrNullAttr>(this)->clone(C);
|
|
case attr::DLLExport:
|
|
return cast<DLLExportAttr>(this)->clone(C);
|
|
case attr::DLLExportStaticLocal:
|
|
return cast<DLLExportStaticLocalAttr>(this)->clone(C);
|
|
case attr::DLLImport:
|
|
return cast<DLLImportAttr>(this)->clone(C);
|
|
case attr::DLLImportStaticLocal:
|
|
return cast<DLLImportStaticLocalAttr>(this)->clone(C);
|
|
case attr::Deprecated:
|
|
return cast<DeprecatedAttr>(this)->clone(C);
|
|
case attr::Destructor:
|
|
return cast<DestructorAttr>(this)->clone(C);
|
|
case attr::DiagnoseAsBuiltin:
|
|
return cast<DiagnoseAsBuiltinAttr>(this)->clone(C);
|
|
case attr::DiagnoseIf:
|
|
return cast<DiagnoseIfAttr>(this)->clone(C);
|
|
case attr::DisableSanitizerInstrumentation:
|
|
return cast<DisableSanitizerInstrumentationAttr>(this)->clone(C);
|
|
case attr::DisableTailCalls:
|
|
return cast<DisableTailCallsAttr>(this)->clone(C);
|
|
case attr::EmptyBases:
|
|
return cast<EmptyBasesAttr>(this)->clone(C);
|
|
case attr::EnableIf:
|
|
return cast<EnableIfAttr>(this)->clone(C);
|
|
case attr::EnforceTCB:
|
|
return cast<EnforceTCBAttr>(this)->clone(C);
|
|
case attr::EnforceTCBLeaf:
|
|
return cast<EnforceTCBLeafAttr>(this)->clone(C);
|
|
case attr::EnumExtensibility:
|
|
return cast<EnumExtensibilityAttr>(this)->clone(C);
|
|
case attr::Error:
|
|
return cast<ErrorAttr>(this)->clone(C);
|
|
case attr::ExcludeFromExplicitInstantiation:
|
|
return cast<ExcludeFromExplicitInstantiationAttr>(this)->clone(C);
|
|
case attr::ExclusiveTrylockFunction:
|
|
return cast<ExclusiveTrylockFunctionAttr>(this)->clone(C);
|
|
case attr::ExternalSourceSymbol:
|
|
return cast<ExternalSourceSymbolAttr>(this)->clone(C);
|
|
case attr::FallThrough:
|
|
return cast<FallThroughAttr>(this)->clone(C);
|
|
case attr::FastCall:
|
|
return cast<FastCallAttr>(this)->clone(C);
|
|
case attr::Final:
|
|
return cast<FinalAttr>(this)->clone(C);
|
|
case attr::FlagEnum:
|
|
return cast<FlagEnumAttr>(this)->clone(C);
|
|
case attr::Flatten:
|
|
return cast<FlattenAttr>(this)->clone(C);
|
|
case attr::Format:
|
|
return cast<FormatAttr>(this)->clone(C);
|
|
case attr::FormatArg:
|
|
return cast<FormatArgAttr>(this)->clone(C);
|
|
case attr::FunctionReturnThunks:
|
|
return cast<FunctionReturnThunksAttr>(this)->clone(C);
|
|
case attr::GNUInline:
|
|
return cast<GNUInlineAttr>(this)->clone(C);
|
|
case attr::GuardedBy:
|
|
return cast<GuardedByAttr>(this)->clone(C);
|
|
case attr::GuardedVar:
|
|
return cast<GuardedVarAttr>(this)->clone(C);
|
|
case attr::HIPManaged:
|
|
return cast<HIPManagedAttr>(this)->clone(C);
|
|
case attr::HLSLGroupSharedAddressSpace:
|
|
return cast<HLSLGroupSharedAddressSpaceAttr>(this)->clone(C);
|
|
case attr::HLSLLoopHint:
|
|
return cast<HLSLLoopHintAttr>(this)->clone(C);
|
|
case attr::HLSLNumThreads:
|
|
return cast<HLSLNumThreadsAttr>(this)->clone(C);
|
|
case attr::HLSLPackOffset:
|
|
return cast<HLSLPackOffsetAttr>(this)->clone(C);
|
|
case attr::HLSLParamModifier:
|
|
return cast<HLSLParamModifierAttr>(this)->clone(C);
|
|
case attr::HLSLROV:
|
|
return cast<HLSLROVAttr>(this)->clone(C);
|
|
case attr::HLSLResource:
|
|
return cast<HLSLResourceAttr>(this)->clone(C);
|
|
case attr::HLSLResourceBinding:
|
|
return cast<HLSLResourceBindingAttr>(this)->clone(C);
|
|
case attr::HLSLResourceClass:
|
|
return cast<HLSLResourceClassAttr>(this)->clone(C);
|
|
case attr::HLSLSV_DispatchThreadID:
|
|
return cast<HLSLSV_DispatchThreadIDAttr>(this)->clone(C);
|
|
case attr::HLSLSV_GroupIndex:
|
|
return cast<HLSLSV_GroupIndexAttr>(this)->clone(C);
|
|
case attr::HLSLShader:
|
|
return cast<HLSLShaderAttr>(this)->clone(C);
|
|
case attr::Hot:
|
|
return cast<HotAttr>(this)->clone(C);
|
|
case attr::HybridPatchable:
|
|
return cast<HybridPatchableAttr>(this)->clone(C);
|
|
case attr::IBAction:
|
|
return cast<IBActionAttr>(this)->clone(C);
|
|
case attr::IBOutlet:
|
|
return cast<IBOutletAttr>(this)->clone(C);
|
|
case attr::IBOutletCollection:
|
|
return cast<IBOutletCollectionAttr>(this)->clone(C);
|
|
case attr::IFunc:
|
|
return cast<IFuncAttr>(this)->clone(C);
|
|
case attr::InitPriority:
|
|
return cast<InitPriorityAttr>(this)->clone(C);
|
|
case attr::InitSeg:
|
|
return cast<InitSegAttr>(this)->clone(C);
|
|
case attr::IntelOclBicc:
|
|
return cast<IntelOclBiccAttr>(this)->clone(C);
|
|
case attr::InternalLinkage:
|
|
return cast<InternalLinkageAttr>(this)->clone(C);
|
|
case attr::LTOVisibilityPublic:
|
|
return cast<LTOVisibilityPublicAttr>(this)->clone(C);
|
|
case attr::LayoutVersion:
|
|
return cast<LayoutVersionAttr>(this)->clone(C);
|
|
case attr::Leaf:
|
|
return cast<LeafAttr>(this)->clone(C);
|
|
case attr::LifetimeBound:
|
|
return cast<LifetimeBoundAttr>(this)->clone(C);
|
|
case attr::Likely:
|
|
return cast<LikelyAttr>(this)->clone(C);
|
|
case attr::LoaderUninitialized:
|
|
return cast<LoaderUninitializedAttr>(this)->clone(C);
|
|
case attr::LockReturned:
|
|
return cast<LockReturnedAttr>(this)->clone(C);
|
|
case attr::LocksExcluded:
|
|
return cast<LocksExcludedAttr>(this)->clone(C);
|
|
case attr::LoopHint:
|
|
return cast<LoopHintAttr>(this)->clone(C);
|
|
case attr::M68kInterrupt:
|
|
return cast<M68kInterruptAttr>(this)->clone(C);
|
|
case attr::M68kRTD:
|
|
return cast<M68kRTDAttr>(this)->clone(C);
|
|
case attr::MIGServerRoutine:
|
|
return cast<MIGServerRoutineAttr>(this)->clone(C);
|
|
case attr::MSABI:
|
|
return cast<MSABIAttr>(this)->clone(C);
|
|
case attr::MSAllocator:
|
|
return cast<MSAllocatorAttr>(this)->clone(C);
|
|
case attr::MSConstexpr:
|
|
return cast<MSConstexprAttr>(this)->clone(C);
|
|
case attr::MSInheritance:
|
|
return cast<MSInheritanceAttr>(this)->clone(C);
|
|
case attr::MSNoVTable:
|
|
return cast<MSNoVTableAttr>(this)->clone(C);
|
|
case attr::MSP430Interrupt:
|
|
return cast<MSP430InterruptAttr>(this)->clone(C);
|
|
case attr::MSStruct:
|
|
return cast<MSStructAttr>(this)->clone(C);
|
|
case attr::MSVtorDisp:
|
|
return cast<MSVtorDispAttr>(this)->clone(C);
|
|
case attr::MaxFieldAlignment:
|
|
return cast<MaxFieldAlignmentAttr>(this)->clone(C);
|
|
case attr::MayAlias:
|
|
return cast<MayAliasAttr>(this)->clone(C);
|
|
case attr::MaybeUndef:
|
|
return cast<MaybeUndefAttr>(this)->clone(C);
|
|
case attr::MicroMips:
|
|
return cast<MicroMipsAttr>(this)->clone(C);
|
|
case attr::MinSize:
|
|
return cast<MinSizeAttr>(this)->clone(C);
|
|
case attr::MinVectorWidth:
|
|
return cast<MinVectorWidthAttr>(this)->clone(C);
|
|
case attr::Mips16:
|
|
return cast<Mips16Attr>(this)->clone(C);
|
|
case attr::MipsInterrupt:
|
|
return cast<MipsInterruptAttr>(this)->clone(C);
|
|
case attr::MipsLongCall:
|
|
return cast<MipsLongCallAttr>(this)->clone(C);
|
|
case attr::MipsShortCall:
|
|
return cast<MipsShortCallAttr>(this)->clone(C);
|
|
case attr::Mode:
|
|
return cast<ModeAttr>(this)->clone(C);
|
|
case attr::MustTail:
|
|
return cast<MustTailAttr>(this)->clone(C);
|
|
case attr::NSConsumed:
|
|
return cast<NSConsumedAttr>(this)->clone(C);
|
|
case attr::NSConsumesSelf:
|
|
return cast<NSConsumesSelfAttr>(this)->clone(C);
|
|
case attr::NSErrorDomain:
|
|
return cast<NSErrorDomainAttr>(this)->clone(C);
|
|
case attr::NSReturnsAutoreleased:
|
|
return cast<NSReturnsAutoreleasedAttr>(this)->clone(C);
|
|
case attr::NSReturnsNotRetained:
|
|
return cast<NSReturnsNotRetainedAttr>(this)->clone(C);
|
|
case attr::NSReturnsRetained:
|
|
return cast<NSReturnsRetainedAttr>(this)->clone(C);
|
|
case attr::NVPTXKernel:
|
|
return cast<NVPTXKernelAttr>(this)->clone(C);
|
|
case attr::Naked:
|
|
return cast<NakedAttr>(this)->clone(C);
|
|
case attr::NoAlias:
|
|
return cast<NoAliasAttr>(this)->clone(C);
|
|
case attr::NoBuiltin:
|
|
return cast<NoBuiltinAttr>(this)->clone(C);
|
|
case attr::NoCommon:
|
|
return cast<NoCommonAttr>(this)->clone(C);
|
|
case attr::NoConvergent:
|
|
return cast<NoConvergentAttr>(this)->clone(C);
|
|
case attr::NoDebug:
|
|
return cast<NoDebugAttr>(this)->clone(C);
|
|
case attr::NoDeref:
|
|
return cast<NoDerefAttr>(this)->clone(C);
|
|
case attr::NoDestroy:
|
|
return cast<NoDestroyAttr>(this)->clone(C);
|
|
case attr::NoDuplicate:
|
|
return cast<NoDuplicateAttr>(this)->clone(C);
|
|
case attr::NoEscape:
|
|
return cast<NoEscapeAttr>(this)->clone(C);
|
|
case attr::NoInline:
|
|
return cast<NoInlineAttr>(this)->clone(C);
|
|
case attr::NoInstrumentFunction:
|
|
return cast<NoInstrumentFunctionAttr>(this)->clone(C);
|
|
case attr::NoMerge:
|
|
return cast<NoMergeAttr>(this)->clone(C);
|
|
case attr::NoMicroMips:
|
|
return cast<NoMicroMipsAttr>(this)->clone(C);
|
|
case attr::NoMips16:
|
|
return cast<NoMips16Attr>(this)->clone(C);
|
|
case attr::NoProfileFunction:
|
|
return cast<NoProfileFunctionAttr>(this)->clone(C);
|
|
case attr::NoRandomizeLayout:
|
|
return cast<NoRandomizeLayoutAttr>(this)->clone(C);
|
|
case attr::NoReturn:
|
|
return cast<NoReturnAttr>(this)->clone(C);
|
|
case attr::NoSanitize:
|
|
return cast<NoSanitizeAttr>(this)->clone(C);
|
|
case attr::NoSpeculativeLoadHardening:
|
|
return cast<NoSpeculativeLoadHardeningAttr>(this)->clone(C);
|
|
case attr::NoSplitStack:
|
|
return cast<NoSplitStackAttr>(this)->clone(C);
|
|
case attr::NoStackProtector:
|
|
return cast<NoStackProtectorAttr>(this)->clone(C);
|
|
case attr::NoThreadSafetyAnalysis:
|
|
return cast<NoThreadSafetyAnalysisAttr>(this)->clone(C);
|
|
case attr::NoThrow:
|
|
return cast<NoThrowAttr>(this)->clone(C);
|
|
case attr::NoUniqueAddress:
|
|
return cast<NoUniqueAddressAttr>(this)->clone(C);
|
|
case attr::NoUwtable:
|
|
return cast<NoUwtableAttr>(this)->clone(C);
|
|
case attr::NonAllocating:
|
|
return cast<NonAllocatingAttr>(this)->clone(C);
|
|
case attr::NonBlocking:
|
|
return cast<NonBlockingAttr>(this)->clone(C);
|
|
case attr::NonNull:
|
|
return cast<NonNullAttr>(this)->clone(C);
|
|
case attr::NotTailCalled:
|
|
return cast<NotTailCalledAttr>(this)->clone(C);
|
|
case attr::OMPAllocateDecl:
|
|
return cast<OMPAllocateDeclAttr>(this)->clone(C);
|
|
case attr::OMPAssume:
|
|
return cast<OMPAssumeAttr>(this)->clone(C);
|
|
case attr::OMPCaptureKind:
|
|
return cast<OMPCaptureKindAttr>(this)->clone(C);
|
|
case attr::OMPCaptureNoInit:
|
|
return cast<OMPCaptureNoInitAttr>(this)->clone(C);
|
|
case attr::OMPDeclareSimdDecl:
|
|
return cast<OMPDeclareSimdDeclAttr>(this)->clone(C);
|
|
case attr::OMPDeclareTargetDecl:
|
|
return cast<OMPDeclareTargetDeclAttr>(this)->clone(C);
|
|
case attr::OMPDeclareVariant:
|
|
return cast<OMPDeclareVariantAttr>(this)->clone(C);
|
|
case attr::OMPReferencedVar:
|
|
return cast<OMPReferencedVarAttr>(this)->clone(C);
|
|
case attr::OMPThreadPrivateDecl:
|
|
return cast<OMPThreadPrivateDeclAttr>(this)->clone(C);
|
|
case attr::OSConsumed:
|
|
return cast<OSConsumedAttr>(this)->clone(C);
|
|
case attr::OSConsumesThis:
|
|
return cast<OSConsumesThisAttr>(this)->clone(C);
|
|
case attr::OSReturnsNotRetained:
|
|
return cast<OSReturnsNotRetainedAttr>(this)->clone(C);
|
|
case attr::OSReturnsRetained:
|
|
return cast<OSReturnsRetainedAttr>(this)->clone(C);
|
|
case attr::OSReturnsRetainedOnNonZero:
|
|
return cast<OSReturnsRetainedOnNonZeroAttr>(this)->clone(C);
|
|
case attr::OSReturnsRetainedOnZero:
|
|
return cast<OSReturnsRetainedOnZeroAttr>(this)->clone(C);
|
|
case attr::ObjCBoxable:
|
|
return cast<ObjCBoxableAttr>(this)->clone(C);
|
|
case attr::ObjCBridge:
|
|
return cast<ObjCBridgeAttr>(this)->clone(C);
|
|
case attr::ObjCBridgeMutable:
|
|
return cast<ObjCBridgeMutableAttr>(this)->clone(C);
|
|
case attr::ObjCBridgeRelated:
|
|
return cast<ObjCBridgeRelatedAttr>(this)->clone(C);
|
|
case attr::ObjCClassStub:
|
|
return cast<ObjCClassStubAttr>(this)->clone(C);
|
|
case attr::ObjCDesignatedInitializer:
|
|
return cast<ObjCDesignatedInitializerAttr>(this)->clone(C);
|
|
case attr::ObjCDirect:
|
|
return cast<ObjCDirectAttr>(this)->clone(C);
|
|
case attr::ObjCDirectMembers:
|
|
return cast<ObjCDirectMembersAttr>(this)->clone(C);
|
|
case attr::ObjCException:
|
|
return cast<ObjCExceptionAttr>(this)->clone(C);
|
|
case attr::ObjCExplicitProtocolImpl:
|
|
return cast<ObjCExplicitProtocolImplAttr>(this)->clone(C);
|
|
case attr::ObjCExternallyRetained:
|
|
return cast<ObjCExternallyRetainedAttr>(this)->clone(C);
|
|
case attr::ObjCGC:
|
|
return cast<ObjCGCAttr>(this)->clone(C);
|
|
case attr::ObjCIndependentClass:
|
|
return cast<ObjCIndependentClassAttr>(this)->clone(C);
|
|
case attr::ObjCInertUnsafeUnretained:
|
|
return cast<ObjCInertUnsafeUnretainedAttr>(this)->clone(C);
|
|
case attr::ObjCKindOf:
|
|
return cast<ObjCKindOfAttr>(this)->clone(C);
|
|
case attr::ObjCMethodFamily:
|
|
return cast<ObjCMethodFamilyAttr>(this)->clone(C);
|
|
case attr::ObjCNSObject:
|
|
return cast<ObjCNSObjectAttr>(this)->clone(C);
|
|
case attr::ObjCNonLazyClass:
|
|
return cast<ObjCNonLazyClassAttr>(this)->clone(C);
|
|
case attr::ObjCNonRuntimeProtocol:
|
|
return cast<ObjCNonRuntimeProtocolAttr>(this)->clone(C);
|
|
case attr::ObjCOwnership:
|
|
return cast<ObjCOwnershipAttr>(this)->clone(C);
|
|
case attr::ObjCPreciseLifetime:
|
|
return cast<ObjCPreciseLifetimeAttr>(this)->clone(C);
|
|
case attr::ObjCRequiresPropertyDefs:
|
|
return cast<ObjCRequiresPropertyDefsAttr>(this)->clone(C);
|
|
case attr::ObjCRequiresSuper:
|
|
return cast<ObjCRequiresSuperAttr>(this)->clone(C);
|
|
case attr::ObjCReturnsInnerPointer:
|
|
return cast<ObjCReturnsInnerPointerAttr>(this)->clone(C);
|
|
case attr::ObjCRootClass:
|
|
return cast<ObjCRootClassAttr>(this)->clone(C);
|
|
case attr::ObjCRuntimeName:
|
|
return cast<ObjCRuntimeNameAttr>(this)->clone(C);
|
|
case attr::ObjCRuntimeVisible:
|
|
return cast<ObjCRuntimeVisibleAttr>(this)->clone(C);
|
|
case attr::ObjCSubclassingRestricted:
|
|
return cast<ObjCSubclassingRestrictedAttr>(this)->clone(C);
|
|
case attr::OpenCLAccess:
|
|
return cast<OpenCLAccessAttr>(this)->clone(C);
|
|
case attr::OpenCLConstantAddressSpace:
|
|
return cast<OpenCLConstantAddressSpaceAttr>(this)->clone(C);
|
|
case attr::OpenCLGenericAddressSpace:
|
|
return cast<OpenCLGenericAddressSpaceAttr>(this)->clone(C);
|
|
case attr::OpenCLGlobalAddressSpace:
|
|
return cast<OpenCLGlobalAddressSpaceAttr>(this)->clone(C);
|
|
case attr::OpenCLGlobalDeviceAddressSpace:
|
|
return cast<OpenCLGlobalDeviceAddressSpaceAttr>(this)->clone(C);
|
|
case attr::OpenCLGlobalHostAddressSpace:
|
|
return cast<OpenCLGlobalHostAddressSpaceAttr>(this)->clone(C);
|
|
case attr::OpenCLIntelReqdSubGroupSize:
|
|
return cast<OpenCLIntelReqdSubGroupSizeAttr>(this)->clone(C);
|
|
case attr::OpenCLKernel:
|
|
return cast<OpenCLKernelAttr>(this)->clone(C);
|
|
case attr::OpenCLLocalAddressSpace:
|
|
return cast<OpenCLLocalAddressSpaceAttr>(this)->clone(C);
|
|
case attr::OpenCLPrivateAddressSpace:
|
|
return cast<OpenCLPrivateAddressSpaceAttr>(this)->clone(C);
|
|
case attr::OpenCLUnrollHint:
|
|
return cast<OpenCLUnrollHintAttr>(this)->clone(C);
|
|
case attr::OptimizeNone:
|
|
return cast<OptimizeNoneAttr>(this)->clone(C);
|
|
case attr::Overloadable:
|
|
return cast<OverloadableAttr>(this)->clone(C);
|
|
case attr::Override:
|
|
return cast<OverrideAttr>(this)->clone(C);
|
|
case attr::Owner:
|
|
return cast<OwnerAttr>(this)->clone(C);
|
|
case attr::Ownership:
|
|
return cast<OwnershipAttr>(this)->clone(C);
|
|
case attr::Packed:
|
|
return cast<PackedAttr>(this)->clone(C);
|
|
case attr::ParamTypestate:
|
|
return cast<ParamTypestateAttr>(this)->clone(C);
|
|
case attr::Pascal:
|
|
return cast<PascalAttr>(this)->clone(C);
|
|
case attr::PassObjectSize:
|
|
return cast<PassObjectSizeAttr>(this)->clone(C);
|
|
case attr::PatchableFunctionEntry:
|
|
return cast<PatchableFunctionEntryAttr>(this)->clone(C);
|
|
case attr::Pcs:
|
|
return cast<PcsAttr>(this)->clone(C);
|
|
case attr::Pointer:
|
|
return cast<PointerAttr>(this)->clone(C);
|
|
case attr::PragmaClangBSSSection:
|
|
return cast<PragmaClangBSSSectionAttr>(this)->clone(C);
|
|
case attr::PragmaClangDataSection:
|
|
return cast<PragmaClangDataSectionAttr>(this)->clone(C);
|
|
case attr::PragmaClangRelroSection:
|
|
return cast<PragmaClangRelroSectionAttr>(this)->clone(C);
|
|
case attr::PragmaClangRodataSection:
|
|
return cast<PragmaClangRodataSectionAttr>(this)->clone(C);
|
|
case attr::PragmaClangTextSection:
|
|
return cast<PragmaClangTextSectionAttr>(this)->clone(C);
|
|
case attr::PreferredName:
|
|
return cast<PreferredNameAttr>(this)->clone(C);
|
|
case attr::PreferredType:
|
|
return cast<PreferredTypeAttr>(this)->clone(C);
|
|
case attr::PreserveAll:
|
|
return cast<PreserveAllAttr>(this)->clone(C);
|
|
case attr::PreserveMost:
|
|
return cast<PreserveMostAttr>(this)->clone(C);
|
|
case attr::PreserveNone:
|
|
return cast<PreserveNoneAttr>(this)->clone(C);
|
|
case attr::PtGuardedBy:
|
|
return cast<PtGuardedByAttr>(this)->clone(C);
|
|
case attr::PtGuardedVar:
|
|
return cast<PtGuardedVarAttr>(this)->clone(C);
|
|
case attr::Ptr32:
|
|
return cast<Ptr32Attr>(this)->clone(C);
|
|
case attr::Ptr64:
|
|
return cast<Ptr64Attr>(this)->clone(C);
|
|
case attr::Pure:
|
|
return cast<PureAttr>(this)->clone(C);
|
|
case attr::RISCVInterrupt:
|
|
return cast<RISCVInterruptAttr>(this)->clone(C);
|
|
case attr::RISCVVectorCC:
|
|
return cast<RISCVVectorCCAttr>(this)->clone(C);
|
|
case attr::RandomizeLayout:
|
|
return cast<RandomizeLayoutAttr>(this)->clone(C);
|
|
case attr::ReadOnlyPlacement:
|
|
return cast<ReadOnlyPlacementAttr>(this)->clone(C);
|
|
case attr::RegCall:
|
|
return cast<RegCallAttr>(this)->clone(C);
|
|
case attr::Reinitializes:
|
|
return cast<ReinitializesAttr>(this)->clone(C);
|
|
case attr::ReleaseCapability:
|
|
return cast<ReleaseCapabilityAttr>(this)->clone(C);
|
|
case attr::ReleaseHandle:
|
|
return cast<ReleaseHandleAttr>(this)->clone(C);
|
|
case attr::RenderScriptKernel:
|
|
return cast<RenderScriptKernelAttr>(this)->clone(C);
|
|
case attr::ReqdWorkGroupSize:
|
|
return cast<ReqdWorkGroupSizeAttr>(this)->clone(C);
|
|
case attr::RequiresCapability:
|
|
return cast<RequiresCapabilityAttr>(this)->clone(C);
|
|
case attr::Restrict:
|
|
return cast<RestrictAttr>(this)->clone(C);
|
|
case attr::Retain:
|
|
return cast<RetainAttr>(this)->clone(C);
|
|
case attr::ReturnTypestate:
|
|
return cast<ReturnTypestateAttr>(this)->clone(C);
|
|
case attr::ReturnsNonNull:
|
|
return cast<ReturnsNonNullAttr>(this)->clone(C);
|
|
case attr::ReturnsTwice:
|
|
return cast<ReturnsTwiceAttr>(this)->clone(C);
|
|
case attr::SPtr:
|
|
return cast<SPtrAttr>(this)->clone(C);
|
|
case attr::SYCLKernel:
|
|
return cast<SYCLKernelAttr>(this)->clone(C);
|
|
case attr::SYCLSpecialClass:
|
|
return cast<SYCLSpecialClassAttr>(this)->clone(C);
|
|
case attr::ScopedLockable:
|
|
return cast<ScopedLockableAttr>(this)->clone(C);
|
|
case attr::Section:
|
|
return cast<SectionAttr>(this)->clone(C);
|
|
case attr::SelectAny:
|
|
return cast<SelectAnyAttr>(this)->clone(C);
|
|
case attr::Sentinel:
|
|
return cast<SentinelAttr>(this)->clone(C);
|
|
case attr::SetTypestate:
|
|
return cast<SetTypestateAttr>(this)->clone(C);
|
|
case attr::SharedTrylockFunction:
|
|
return cast<SharedTrylockFunctionAttr>(this)->clone(C);
|
|
case attr::SizedBy:
|
|
return cast<SizedByAttr>(this)->clone(C);
|
|
case attr::SizedByOrNull:
|
|
return cast<SizedByOrNullAttr>(this)->clone(C);
|
|
case attr::SpeculativeLoadHardening:
|
|
return cast<SpeculativeLoadHardeningAttr>(this)->clone(C);
|
|
case attr::StandaloneDebug:
|
|
return cast<StandaloneDebugAttr>(this)->clone(C);
|
|
case attr::StdCall:
|
|
return cast<StdCallAttr>(this)->clone(C);
|
|
case attr::StrictFP:
|
|
return cast<StrictFPAttr>(this)->clone(C);
|
|
case attr::StrictGuardStackCheck:
|
|
return cast<StrictGuardStackCheckAttr>(this)->clone(C);
|
|
case attr::Suppress:
|
|
return cast<SuppressAttr>(this)->clone(C);
|
|
case attr::SwiftAsync:
|
|
return cast<SwiftAsyncAttr>(this)->clone(C);
|
|
case attr::SwiftAsyncCall:
|
|
return cast<SwiftAsyncCallAttr>(this)->clone(C);
|
|
case attr::SwiftAsyncContext:
|
|
return cast<SwiftAsyncContextAttr>(this)->clone(C);
|
|
case attr::SwiftAsyncError:
|
|
return cast<SwiftAsyncErrorAttr>(this)->clone(C);
|
|
case attr::SwiftAsyncName:
|
|
return cast<SwiftAsyncNameAttr>(this)->clone(C);
|
|
case attr::SwiftAttr:
|
|
return cast<SwiftAttrAttr>(this)->clone(C);
|
|
case attr::SwiftBridge:
|
|
return cast<SwiftBridgeAttr>(this)->clone(C);
|
|
case attr::SwiftBridgedTypedef:
|
|
return cast<SwiftBridgedTypedefAttr>(this)->clone(C);
|
|
case attr::SwiftCall:
|
|
return cast<SwiftCallAttr>(this)->clone(C);
|
|
case attr::SwiftContext:
|
|
return cast<SwiftContextAttr>(this)->clone(C);
|
|
case attr::SwiftError:
|
|
return cast<SwiftErrorAttr>(this)->clone(C);
|
|
case attr::SwiftErrorResult:
|
|
return cast<SwiftErrorResultAttr>(this)->clone(C);
|
|
case attr::SwiftImportAsNonGeneric:
|
|
return cast<SwiftImportAsNonGenericAttr>(this)->clone(C);
|
|
case attr::SwiftImportPropertyAsAccessors:
|
|
return cast<SwiftImportPropertyAsAccessorsAttr>(this)->clone(C);
|
|
case attr::SwiftIndirectResult:
|
|
return cast<SwiftIndirectResultAttr>(this)->clone(C);
|
|
case attr::SwiftName:
|
|
return cast<SwiftNameAttr>(this)->clone(C);
|
|
case attr::SwiftNewType:
|
|
return cast<SwiftNewTypeAttr>(this)->clone(C);
|
|
case attr::SwiftObjCMembers:
|
|
return cast<SwiftObjCMembersAttr>(this)->clone(C);
|
|
case attr::SwiftPrivate:
|
|
return cast<SwiftPrivateAttr>(this)->clone(C);
|
|
case attr::SwiftVersionedAddition:
|
|
return cast<SwiftVersionedAdditionAttr>(this)->clone(C);
|
|
case attr::SwiftVersionedRemoval:
|
|
return cast<SwiftVersionedRemovalAttr>(this)->clone(C);
|
|
case attr::SysVABI:
|
|
return cast<SysVABIAttr>(this)->clone(C);
|
|
case attr::TLSModel:
|
|
return cast<TLSModelAttr>(this)->clone(C);
|
|
case attr::Target:
|
|
return cast<TargetAttr>(this)->clone(C);
|
|
case attr::TargetClones:
|
|
return cast<TargetClonesAttr>(this)->clone(C);
|
|
case attr::TargetVersion:
|
|
return cast<TargetVersionAttr>(this)->clone(C);
|
|
case attr::TestTypestate:
|
|
return cast<TestTypestateAttr>(this)->clone(C);
|
|
case attr::ThisCall:
|
|
return cast<ThisCallAttr>(this)->clone(C);
|
|
case attr::Thread:
|
|
return cast<ThreadAttr>(this)->clone(C);
|
|
case attr::TransparentUnion:
|
|
return cast<TransparentUnionAttr>(this)->clone(C);
|
|
case attr::TrivialABI:
|
|
return cast<TrivialABIAttr>(this)->clone(C);
|
|
case attr::TryAcquireCapability:
|
|
return cast<TryAcquireCapabilityAttr>(this)->clone(C);
|
|
case attr::TypeNonNull:
|
|
return cast<TypeNonNullAttr>(this)->clone(C);
|
|
case attr::TypeNullUnspecified:
|
|
return cast<TypeNullUnspecifiedAttr>(this)->clone(C);
|
|
case attr::TypeNullable:
|
|
return cast<TypeNullableAttr>(this)->clone(C);
|
|
case attr::TypeNullableResult:
|
|
return cast<TypeNullableResultAttr>(this)->clone(C);
|
|
case attr::TypeTagForDatatype:
|
|
return cast<TypeTagForDatatypeAttr>(this)->clone(C);
|
|
case attr::TypeVisibility:
|
|
return cast<TypeVisibilityAttr>(this)->clone(C);
|
|
case attr::UPtr:
|
|
return cast<UPtrAttr>(this)->clone(C);
|
|
case attr::Unavailable:
|
|
return cast<UnavailableAttr>(this)->clone(C);
|
|
case attr::Uninitialized:
|
|
return cast<UninitializedAttr>(this)->clone(C);
|
|
case attr::Unlikely:
|
|
return cast<UnlikelyAttr>(this)->clone(C);
|
|
case attr::UnsafeBufferUsage:
|
|
return cast<UnsafeBufferUsageAttr>(this)->clone(C);
|
|
case attr::Unused:
|
|
return cast<UnusedAttr>(this)->clone(C);
|
|
case attr::UseHandle:
|
|
return cast<UseHandleAttr>(this)->clone(C);
|
|
case attr::Used:
|
|
return cast<UsedAttr>(this)->clone(C);
|
|
case attr::UsingIfExists:
|
|
return cast<UsingIfExistsAttr>(this)->clone(C);
|
|
case attr::Uuid:
|
|
return cast<UuidAttr>(this)->clone(C);
|
|
case attr::VTablePointerAuthentication:
|
|
return cast<VTablePointerAuthenticationAttr>(this)->clone(C);
|
|
case attr::VecReturn:
|
|
return cast<VecReturnAttr>(this)->clone(C);
|
|
case attr::VecTypeHint:
|
|
return cast<VecTypeHintAttr>(this)->clone(C);
|
|
case attr::VectorCall:
|
|
return cast<VectorCallAttr>(this)->clone(C);
|
|
case attr::Visibility:
|
|
return cast<VisibilityAttr>(this)->clone(C);
|
|
case attr::WarnUnused:
|
|
return cast<WarnUnusedAttr>(this)->clone(C);
|
|
case attr::WarnUnusedResult:
|
|
return cast<WarnUnusedResultAttr>(this)->clone(C);
|
|
case attr::Weak:
|
|
return cast<WeakAttr>(this)->clone(C);
|
|
case attr::WeakImport:
|
|
return cast<WeakImportAttr>(this)->clone(C);
|
|
case attr::WeakRef:
|
|
return cast<WeakRefAttr>(this)->clone(C);
|
|
case attr::WebAssemblyExportName:
|
|
return cast<WebAssemblyExportNameAttr>(this)->clone(C);
|
|
case attr::WebAssemblyFuncref:
|
|
return cast<WebAssemblyFuncrefAttr>(this)->clone(C);
|
|
case attr::WebAssemblyImportModule:
|
|
return cast<WebAssemblyImportModuleAttr>(this)->clone(C);
|
|
case attr::WebAssemblyImportName:
|
|
return cast<WebAssemblyImportNameAttr>(this)->clone(C);
|
|
case attr::WorkGroupSizeHint:
|
|
return cast<WorkGroupSizeHintAttr>(this)->clone(C);
|
|
case attr::X86ForceAlignArgPointer:
|
|
return cast<X86ForceAlignArgPointerAttr>(this)->clone(C);
|
|
case attr::XRayInstrument:
|
|
return cast<XRayInstrumentAttr>(this)->clone(C);
|
|
case attr::XRayLogArgs:
|
|
return cast<XRayLogArgsAttr>(this)->clone(C);
|
|
case attr::ZeroCallUsedRegs:
|
|
return cast<ZeroCallUsedRegsAttr>(this)->clone(C);
|
|
}
|
|
llvm_unreachable("Unexpected attribute kind!");
|
|
}
|
|
|
|
void Attr::printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
|
switch (getKind()) {
|
|
case attr::AArch64SVEPcs:
|
|
return cast<AArch64SVEPcsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AArch64VectorPcs:
|
|
return cast<AArch64VectorPcsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AMDGPUFlatWorkGroupSize:
|
|
return cast<AMDGPUFlatWorkGroupSizeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AMDGPUKernelCall:
|
|
return cast<AMDGPUKernelCallAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AMDGPUMaxNumWorkGroups:
|
|
return cast<AMDGPUMaxNumWorkGroupsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AMDGPUNumSGPR:
|
|
return cast<AMDGPUNumSGPRAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AMDGPUNumVGPR:
|
|
return cast<AMDGPUNumVGPRAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AMDGPUWavesPerEU:
|
|
return cast<AMDGPUWavesPerEUAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ARMInterrupt:
|
|
return cast<ARMInterruptAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AVRInterrupt:
|
|
return cast<AVRInterruptAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AVRSignal:
|
|
return cast<AVRSignalAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AbiTag:
|
|
return cast<AbiTagAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AcquireCapability:
|
|
return cast<AcquireCapabilityAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AcquireHandle:
|
|
return cast<AcquireHandleAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AcquiredAfter:
|
|
return cast<AcquiredAfterAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AcquiredBefore:
|
|
return cast<AcquiredBeforeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AddressSpace:
|
|
return cast<AddressSpaceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Alias:
|
|
return cast<AliasAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AlignMac68k:
|
|
return cast<AlignMac68kAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AlignNatural:
|
|
return cast<AlignNaturalAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AlignValue:
|
|
return cast<AlignValueAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Aligned:
|
|
return cast<AlignedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AllocAlign:
|
|
return cast<AllocAlignAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AllocSize:
|
|
return cast<AllocSizeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Allocating:
|
|
return cast<AllocatingAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AlwaysDestroy:
|
|
return cast<AlwaysDestroyAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AlwaysInline:
|
|
return cast<AlwaysInlineAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AnalyzerNoReturn:
|
|
return cast<AnalyzerNoReturnAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Annotate:
|
|
return cast<AnnotateAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AnnotateType:
|
|
return cast<AnnotateTypeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AnyX86Interrupt:
|
|
return cast<AnyX86InterruptAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AnyX86NoCallerSavedRegisters:
|
|
return cast<AnyX86NoCallerSavedRegistersAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AnyX86NoCfCheck:
|
|
return cast<AnyX86NoCfCheckAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ArcWeakrefUnavailable:
|
|
return cast<ArcWeakrefUnavailableAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ArgumentWithTypeTag:
|
|
return cast<ArgumentWithTypeTagAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ArmBuiltinAlias:
|
|
return cast<ArmBuiltinAliasAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ArmIn:
|
|
return cast<ArmInAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ArmInOut:
|
|
return cast<ArmInOutAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ArmLocallyStreaming:
|
|
return cast<ArmLocallyStreamingAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ArmMveStrictPolymorphism:
|
|
return cast<ArmMveStrictPolymorphismAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ArmNew:
|
|
return cast<ArmNewAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ArmOut:
|
|
return cast<ArmOutAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ArmPreserves:
|
|
return cast<ArmPreservesAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ArmStreaming:
|
|
return cast<ArmStreamingAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ArmStreamingCompatible:
|
|
return cast<ArmStreamingCompatibleAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Artificial:
|
|
return cast<ArtificialAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AsmLabel:
|
|
return cast<AsmLabelAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AssertCapability:
|
|
return cast<AssertCapabilityAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AssertExclusiveLock:
|
|
return cast<AssertExclusiveLockAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AssertSharedLock:
|
|
return cast<AssertSharedLockAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AssumeAligned:
|
|
return cast<AssumeAlignedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Availability:
|
|
return cast<AvailabilityAttr>(this)->printPretty(OS, Policy);
|
|
case attr::AvailableOnlyInDefaultEvalMethod:
|
|
return cast<AvailableOnlyInDefaultEvalMethodAttr>(this)->printPretty(OS, Policy);
|
|
case attr::BPFFastCall:
|
|
return cast<BPFFastCallAttr>(this)->printPretty(OS, Policy);
|
|
case attr::BPFPreserveAccessIndex:
|
|
return cast<BPFPreserveAccessIndexAttr>(this)->printPretty(OS, Policy);
|
|
case attr::BPFPreserveStaticOffset:
|
|
return cast<BPFPreserveStaticOffsetAttr>(this)->printPretty(OS, Policy);
|
|
case attr::BTFDeclTag:
|
|
return cast<BTFDeclTagAttr>(this)->printPretty(OS, Policy);
|
|
case attr::BTFTypeTag:
|
|
return cast<BTFTypeTagAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Blocking:
|
|
return cast<BlockingAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Blocks:
|
|
return cast<BlocksAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Builtin:
|
|
return cast<BuiltinAttr>(this)->printPretty(OS, Policy);
|
|
case attr::BuiltinAlias:
|
|
return cast<BuiltinAliasAttr>(this)->printPretty(OS, Policy);
|
|
case attr::C11NoReturn:
|
|
return cast<C11NoReturnAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CDecl:
|
|
return cast<CDeclAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CFAuditedTransfer:
|
|
return cast<CFAuditedTransferAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CFConsumed:
|
|
return cast<CFConsumedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CFGuard:
|
|
return cast<CFGuardAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CFICanonicalJumpTable:
|
|
return cast<CFICanonicalJumpTableAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CFReturnsNotRetained:
|
|
return cast<CFReturnsNotRetainedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CFReturnsRetained:
|
|
return cast<CFReturnsRetainedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CFUnknownTransfer:
|
|
return cast<CFUnknownTransferAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CPUDispatch:
|
|
return cast<CPUDispatchAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CPUSpecific:
|
|
return cast<CPUSpecificAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CUDAConstant:
|
|
return cast<CUDAConstantAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CUDADevice:
|
|
return cast<CUDADeviceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CUDADeviceBuiltinSurfaceType:
|
|
return cast<CUDADeviceBuiltinSurfaceTypeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CUDADeviceBuiltinTextureType:
|
|
return cast<CUDADeviceBuiltinTextureTypeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CUDAGlobal:
|
|
return cast<CUDAGlobalAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CUDAHost:
|
|
return cast<CUDAHostAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CUDAInvalidTarget:
|
|
return cast<CUDAInvalidTargetAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CUDALaunchBounds:
|
|
return cast<CUDALaunchBoundsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CUDAShared:
|
|
return cast<CUDASharedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CXX11NoReturn:
|
|
return cast<CXX11NoReturnAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CXXAssume:
|
|
return cast<CXXAssumeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CallableWhen:
|
|
return cast<CallableWhenAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Callback:
|
|
return cast<CallbackAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CalledOnce:
|
|
return cast<CalledOnceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Capability:
|
|
return cast<CapabilityAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CapturedRecord:
|
|
return cast<CapturedRecordAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CarriesDependency:
|
|
return cast<CarriesDependencyAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Cleanup:
|
|
return cast<CleanupAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ClspvLibclcBuiltin:
|
|
return cast<ClspvLibclcBuiltinAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CmseNSCall:
|
|
return cast<CmseNSCallAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CmseNSEntry:
|
|
return cast<CmseNSEntryAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CodeAlign:
|
|
return cast<CodeAlignAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CodeModel:
|
|
return cast<CodeModelAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CodeSeg:
|
|
return cast<CodeSegAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Cold:
|
|
return cast<ColdAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Common:
|
|
return cast<CommonAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Const:
|
|
return cast<ConstAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ConstInit:
|
|
return cast<ConstInitAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Constructor:
|
|
return cast<ConstructorAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Consumable:
|
|
return cast<ConsumableAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ConsumableAutoCast:
|
|
return cast<ConsumableAutoCastAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ConsumableSetOnRead:
|
|
return cast<ConsumableSetOnReadAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Convergent:
|
|
return cast<ConvergentAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CoroDisableLifetimeBound:
|
|
return cast<CoroDisableLifetimeBoundAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CoroLifetimeBound:
|
|
return cast<CoroLifetimeBoundAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CoroOnlyDestroyWhenComplete:
|
|
return cast<CoroOnlyDestroyWhenCompleteAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CoroReturnType:
|
|
return cast<CoroReturnTypeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CoroWrapper:
|
|
return cast<CoroWrapperAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CountedBy:
|
|
return cast<CountedByAttr>(this)->printPretty(OS, Policy);
|
|
case attr::CountedByOrNull:
|
|
return cast<CountedByOrNullAttr>(this)->printPretty(OS, Policy);
|
|
case attr::DLLExport:
|
|
return cast<DLLExportAttr>(this)->printPretty(OS, Policy);
|
|
case attr::DLLExportStaticLocal:
|
|
return cast<DLLExportStaticLocalAttr>(this)->printPretty(OS, Policy);
|
|
case attr::DLLImport:
|
|
return cast<DLLImportAttr>(this)->printPretty(OS, Policy);
|
|
case attr::DLLImportStaticLocal:
|
|
return cast<DLLImportStaticLocalAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Deprecated:
|
|
return cast<DeprecatedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Destructor:
|
|
return cast<DestructorAttr>(this)->printPretty(OS, Policy);
|
|
case attr::DiagnoseAsBuiltin:
|
|
return cast<DiagnoseAsBuiltinAttr>(this)->printPretty(OS, Policy);
|
|
case attr::DiagnoseIf:
|
|
return cast<DiagnoseIfAttr>(this)->printPretty(OS, Policy);
|
|
case attr::DisableSanitizerInstrumentation:
|
|
return cast<DisableSanitizerInstrumentationAttr>(this)->printPretty(OS, Policy);
|
|
case attr::DisableTailCalls:
|
|
return cast<DisableTailCallsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::EmptyBases:
|
|
return cast<EmptyBasesAttr>(this)->printPretty(OS, Policy);
|
|
case attr::EnableIf:
|
|
return cast<EnableIfAttr>(this)->printPretty(OS, Policy);
|
|
case attr::EnforceTCB:
|
|
return cast<EnforceTCBAttr>(this)->printPretty(OS, Policy);
|
|
case attr::EnforceTCBLeaf:
|
|
return cast<EnforceTCBLeafAttr>(this)->printPretty(OS, Policy);
|
|
case attr::EnumExtensibility:
|
|
return cast<EnumExtensibilityAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Error:
|
|
return cast<ErrorAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ExcludeFromExplicitInstantiation:
|
|
return cast<ExcludeFromExplicitInstantiationAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ExclusiveTrylockFunction:
|
|
return cast<ExclusiveTrylockFunctionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ExternalSourceSymbol:
|
|
return cast<ExternalSourceSymbolAttr>(this)->printPretty(OS, Policy);
|
|
case attr::FallThrough:
|
|
return cast<FallThroughAttr>(this)->printPretty(OS, Policy);
|
|
case attr::FastCall:
|
|
return cast<FastCallAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Final:
|
|
return cast<FinalAttr>(this)->printPretty(OS, Policy);
|
|
case attr::FlagEnum:
|
|
return cast<FlagEnumAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Flatten:
|
|
return cast<FlattenAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Format:
|
|
return cast<FormatAttr>(this)->printPretty(OS, Policy);
|
|
case attr::FormatArg:
|
|
return cast<FormatArgAttr>(this)->printPretty(OS, Policy);
|
|
case attr::FunctionReturnThunks:
|
|
return cast<FunctionReturnThunksAttr>(this)->printPretty(OS, Policy);
|
|
case attr::GNUInline:
|
|
return cast<GNUInlineAttr>(this)->printPretty(OS, Policy);
|
|
case attr::GuardedBy:
|
|
return cast<GuardedByAttr>(this)->printPretty(OS, Policy);
|
|
case attr::GuardedVar:
|
|
return cast<GuardedVarAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HIPManaged:
|
|
return cast<HIPManagedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HLSLGroupSharedAddressSpace:
|
|
return cast<HLSLGroupSharedAddressSpaceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HLSLLoopHint:
|
|
return cast<HLSLLoopHintAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HLSLNumThreads:
|
|
return cast<HLSLNumThreadsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HLSLPackOffset:
|
|
return cast<HLSLPackOffsetAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HLSLParamModifier:
|
|
return cast<HLSLParamModifierAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HLSLROV:
|
|
return cast<HLSLROVAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HLSLResource:
|
|
return cast<HLSLResourceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HLSLResourceBinding:
|
|
return cast<HLSLResourceBindingAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HLSLResourceClass:
|
|
return cast<HLSLResourceClassAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HLSLSV_DispatchThreadID:
|
|
return cast<HLSLSV_DispatchThreadIDAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HLSLSV_GroupIndex:
|
|
return cast<HLSLSV_GroupIndexAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HLSLShader:
|
|
return cast<HLSLShaderAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Hot:
|
|
return cast<HotAttr>(this)->printPretty(OS, Policy);
|
|
case attr::HybridPatchable:
|
|
return cast<HybridPatchableAttr>(this)->printPretty(OS, Policy);
|
|
case attr::IBAction:
|
|
return cast<IBActionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::IBOutlet:
|
|
return cast<IBOutletAttr>(this)->printPretty(OS, Policy);
|
|
case attr::IBOutletCollection:
|
|
return cast<IBOutletCollectionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::IFunc:
|
|
return cast<IFuncAttr>(this)->printPretty(OS, Policy);
|
|
case attr::InitPriority:
|
|
return cast<InitPriorityAttr>(this)->printPretty(OS, Policy);
|
|
case attr::InitSeg:
|
|
return cast<InitSegAttr>(this)->printPretty(OS, Policy);
|
|
case attr::IntelOclBicc:
|
|
return cast<IntelOclBiccAttr>(this)->printPretty(OS, Policy);
|
|
case attr::InternalLinkage:
|
|
return cast<InternalLinkageAttr>(this)->printPretty(OS, Policy);
|
|
case attr::LTOVisibilityPublic:
|
|
return cast<LTOVisibilityPublicAttr>(this)->printPretty(OS, Policy);
|
|
case attr::LayoutVersion:
|
|
return cast<LayoutVersionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Leaf:
|
|
return cast<LeafAttr>(this)->printPretty(OS, Policy);
|
|
case attr::LifetimeBound:
|
|
return cast<LifetimeBoundAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Likely:
|
|
return cast<LikelyAttr>(this)->printPretty(OS, Policy);
|
|
case attr::LoaderUninitialized:
|
|
return cast<LoaderUninitializedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::LockReturned:
|
|
return cast<LockReturnedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::LocksExcluded:
|
|
return cast<LocksExcludedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::LoopHint:
|
|
return cast<LoopHintAttr>(this)->printPretty(OS, Policy);
|
|
case attr::M68kInterrupt:
|
|
return cast<M68kInterruptAttr>(this)->printPretty(OS, Policy);
|
|
case attr::M68kRTD:
|
|
return cast<M68kRTDAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MIGServerRoutine:
|
|
return cast<MIGServerRoutineAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MSABI:
|
|
return cast<MSABIAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MSAllocator:
|
|
return cast<MSAllocatorAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MSConstexpr:
|
|
return cast<MSConstexprAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MSInheritance:
|
|
return cast<MSInheritanceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MSNoVTable:
|
|
return cast<MSNoVTableAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MSP430Interrupt:
|
|
return cast<MSP430InterruptAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MSStruct:
|
|
return cast<MSStructAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MSVtorDisp:
|
|
return cast<MSVtorDispAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MaxFieldAlignment:
|
|
return cast<MaxFieldAlignmentAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MayAlias:
|
|
return cast<MayAliasAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MaybeUndef:
|
|
return cast<MaybeUndefAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MicroMips:
|
|
return cast<MicroMipsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MinSize:
|
|
return cast<MinSizeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MinVectorWidth:
|
|
return cast<MinVectorWidthAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Mips16:
|
|
return cast<Mips16Attr>(this)->printPretty(OS, Policy);
|
|
case attr::MipsInterrupt:
|
|
return cast<MipsInterruptAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MipsLongCall:
|
|
return cast<MipsLongCallAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MipsShortCall:
|
|
return cast<MipsShortCallAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Mode:
|
|
return cast<ModeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::MustTail:
|
|
return cast<MustTailAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NSConsumed:
|
|
return cast<NSConsumedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NSConsumesSelf:
|
|
return cast<NSConsumesSelfAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NSErrorDomain:
|
|
return cast<NSErrorDomainAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NSReturnsAutoreleased:
|
|
return cast<NSReturnsAutoreleasedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NSReturnsNotRetained:
|
|
return cast<NSReturnsNotRetainedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NSReturnsRetained:
|
|
return cast<NSReturnsRetainedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NVPTXKernel:
|
|
return cast<NVPTXKernelAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Naked:
|
|
return cast<NakedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoAlias:
|
|
return cast<NoAliasAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoBuiltin:
|
|
return cast<NoBuiltinAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoCommon:
|
|
return cast<NoCommonAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoConvergent:
|
|
return cast<NoConvergentAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoDebug:
|
|
return cast<NoDebugAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoDeref:
|
|
return cast<NoDerefAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoDestroy:
|
|
return cast<NoDestroyAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoDuplicate:
|
|
return cast<NoDuplicateAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoEscape:
|
|
return cast<NoEscapeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoInline:
|
|
return cast<NoInlineAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoInstrumentFunction:
|
|
return cast<NoInstrumentFunctionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoMerge:
|
|
return cast<NoMergeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoMicroMips:
|
|
return cast<NoMicroMipsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoMips16:
|
|
return cast<NoMips16Attr>(this)->printPretty(OS, Policy);
|
|
case attr::NoProfileFunction:
|
|
return cast<NoProfileFunctionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoRandomizeLayout:
|
|
return cast<NoRandomizeLayoutAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoReturn:
|
|
return cast<NoReturnAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoSanitize:
|
|
return cast<NoSanitizeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoSpeculativeLoadHardening:
|
|
return cast<NoSpeculativeLoadHardeningAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoSplitStack:
|
|
return cast<NoSplitStackAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoStackProtector:
|
|
return cast<NoStackProtectorAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoThreadSafetyAnalysis:
|
|
return cast<NoThreadSafetyAnalysisAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoThrow:
|
|
return cast<NoThrowAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoUniqueAddress:
|
|
return cast<NoUniqueAddressAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NoUwtable:
|
|
return cast<NoUwtableAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NonAllocating:
|
|
return cast<NonAllocatingAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NonBlocking:
|
|
return cast<NonBlockingAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NonNull:
|
|
return cast<NonNullAttr>(this)->printPretty(OS, Policy);
|
|
case attr::NotTailCalled:
|
|
return cast<NotTailCalledAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OMPAllocateDecl:
|
|
return cast<OMPAllocateDeclAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OMPAssume:
|
|
return cast<OMPAssumeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OMPCaptureKind:
|
|
return cast<OMPCaptureKindAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OMPCaptureNoInit:
|
|
return cast<OMPCaptureNoInitAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OMPDeclareSimdDecl:
|
|
return cast<OMPDeclareSimdDeclAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OMPDeclareTargetDecl:
|
|
return cast<OMPDeclareTargetDeclAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OMPDeclareVariant:
|
|
return cast<OMPDeclareVariantAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OMPReferencedVar:
|
|
return cast<OMPReferencedVarAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OMPThreadPrivateDecl:
|
|
return cast<OMPThreadPrivateDeclAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OSConsumed:
|
|
return cast<OSConsumedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OSConsumesThis:
|
|
return cast<OSConsumesThisAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OSReturnsNotRetained:
|
|
return cast<OSReturnsNotRetainedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OSReturnsRetained:
|
|
return cast<OSReturnsRetainedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OSReturnsRetainedOnNonZero:
|
|
return cast<OSReturnsRetainedOnNonZeroAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OSReturnsRetainedOnZero:
|
|
return cast<OSReturnsRetainedOnZeroAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCBoxable:
|
|
return cast<ObjCBoxableAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCBridge:
|
|
return cast<ObjCBridgeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCBridgeMutable:
|
|
return cast<ObjCBridgeMutableAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCBridgeRelated:
|
|
return cast<ObjCBridgeRelatedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCClassStub:
|
|
return cast<ObjCClassStubAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCDesignatedInitializer:
|
|
return cast<ObjCDesignatedInitializerAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCDirect:
|
|
return cast<ObjCDirectAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCDirectMembers:
|
|
return cast<ObjCDirectMembersAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCException:
|
|
return cast<ObjCExceptionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCExplicitProtocolImpl:
|
|
return cast<ObjCExplicitProtocolImplAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCExternallyRetained:
|
|
return cast<ObjCExternallyRetainedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCGC:
|
|
return cast<ObjCGCAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCIndependentClass:
|
|
return cast<ObjCIndependentClassAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCInertUnsafeUnretained:
|
|
return cast<ObjCInertUnsafeUnretainedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCKindOf:
|
|
return cast<ObjCKindOfAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCMethodFamily:
|
|
return cast<ObjCMethodFamilyAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCNSObject:
|
|
return cast<ObjCNSObjectAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCNonLazyClass:
|
|
return cast<ObjCNonLazyClassAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCNonRuntimeProtocol:
|
|
return cast<ObjCNonRuntimeProtocolAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCOwnership:
|
|
return cast<ObjCOwnershipAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCPreciseLifetime:
|
|
return cast<ObjCPreciseLifetimeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCRequiresPropertyDefs:
|
|
return cast<ObjCRequiresPropertyDefsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCRequiresSuper:
|
|
return cast<ObjCRequiresSuperAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCReturnsInnerPointer:
|
|
return cast<ObjCReturnsInnerPointerAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCRootClass:
|
|
return cast<ObjCRootClassAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCRuntimeName:
|
|
return cast<ObjCRuntimeNameAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCRuntimeVisible:
|
|
return cast<ObjCRuntimeVisibleAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ObjCSubclassingRestricted:
|
|
return cast<ObjCSubclassingRestrictedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OpenCLAccess:
|
|
return cast<OpenCLAccessAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OpenCLConstantAddressSpace:
|
|
return cast<OpenCLConstantAddressSpaceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OpenCLGenericAddressSpace:
|
|
return cast<OpenCLGenericAddressSpaceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OpenCLGlobalAddressSpace:
|
|
return cast<OpenCLGlobalAddressSpaceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OpenCLGlobalDeviceAddressSpace:
|
|
return cast<OpenCLGlobalDeviceAddressSpaceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OpenCLGlobalHostAddressSpace:
|
|
return cast<OpenCLGlobalHostAddressSpaceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OpenCLIntelReqdSubGroupSize:
|
|
return cast<OpenCLIntelReqdSubGroupSizeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OpenCLKernel:
|
|
return cast<OpenCLKernelAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OpenCLLocalAddressSpace:
|
|
return cast<OpenCLLocalAddressSpaceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OpenCLPrivateAddressSpace:
|
|
return cast<OpenCLPrivateAddressSpaceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OpenCLUnrollHint:
|
|
return cast<OpenCLUnrollHintAttr>(this)->printPretty(OS, Policy);
|
|
case attr::OptimizeNone:
|
|
return cast<OptimizeNoneAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Overloadable:
|
|
return cast<OverloadableAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Override:
|
|
return cast<OverrideAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Owner:
|
|
return cast<OwnerAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Ownership:
|
|
return cast<OwnershipAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Packed:
|
|
return cast<PackedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ParamTypestate:
|
|
return cast<ParamTypestateAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Pascal:
|
|
return cast<PascalAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PassObjectSize:
|
|
return cast<PassObjectSizeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PatchableFunctionEntry:
|
|
return cast<PatchableFunctionEntryAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Pcs:
|
|
return cast<PcsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Pointer:
|
|
return cast<PointerAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PragmaClangBSSSection:
|
|
return cast<PragmaClangBSSSectionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PragmaClangDataSection:
|
|
return cast<PragmaClangDataSectionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PragmaClangRelroSection:
|
|
return cast<PragmaClangRelroSectionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PragmaClangRodataSection:
|
|
return cast<PragmaClangRodataSectionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PragmaClangTextSection:
|
|
return cast<PragmaClangTextSectionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PreferredName:
|
|
return cast<PreferredNameAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PreferredType:
|
|
return cast<PreferredTypeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PreserveAll:
|
|
return cast<PreserveAllAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PreserveMost:
|
|
return cast<PreserveMostAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PreserveNone:
|
|
return cast<PreserveNoneAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PtGuardedBy:
|
|
return cast<PtGuardedByAttr>(this)->printPretty(OS, Policy);
|
|
case attr::PtGuardedVar:
|
|
return cast<PtGuardedVarAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Ptr32:
|
|
return cast<Ptr32Attr>(this)->printPretty(OS, Policy);
|
|
case attr::Ptr64:
|
|
return cast<Ptr64Attr>(this)->printPretty(OS, Policy);
|
|
case attr::Pure:
|
|
return cast<PureAttr>(this)->printPretty(OS, Policy);
|
|
case attr::RISCVInterrupt:
|
|
return cast<RISCVInterruptAttr>(this)->printPretty(OS, Policy);
|
|
case attr::RISCVVectorCC:
|
|
return cast<RISCVVectorCCAttr>(this)->printPretty(OS, Policy);
|
|
case attr::RandomizeLayout:
|
|
return cast<RandomizeLayoutAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ReadOnlyPlacement:
|
|
return cast<ReadOnlyPlacementAttr>(this)->printPretty(OS, Policy);
|
|
case attr::RegCall:
|
|
return cast<RegCallAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Reinitializes:
|
|
return cast<ReinitializesAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ReleaseCapability:
|
|
return cast<ReleaseCapabilityAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ReleaseHandle:
|
|
return cast<ReleaseHandleAttr>(this)->printPretty(OS, Policy);
|
|
case attr::RenderScriptKernel:
|
|
return cast<RenderScriptKernelAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ReqdWorkGroupSize:
|
|
return cast<ReqdWorkGroupSizeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::RequiresCapability:
|
|
return cast<RequiresCapabilityAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Restrict:
|
|
return cast<RestrictAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Retain:
|
|
return cast<RetainAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ReturnTypestate:
|
|
return cast<ReturnTypestateAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ReturnsNonNull:
|
|
return cast<ReturnsNonNullAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ReturnsTwice:
|
|
return cast<ReturnsTwiceAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SPtr:
|
|
return cast<SPtrAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SYCLKernel:
|
|
return cast<SYCLKernelAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SYCLSpecialClass:
|
|
return cast<SYCLSpecialClassAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ScopedLockable:
|
|
return cast<ScopedLockableAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Section:
|
|
return cast<SectionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SelectAny:
|
|
return cast<SelectAnyAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Sentinel:
|
|
return cast<SentinelAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SetTypestate:
|
|
return cast<SetTypestateAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SharedTrylockFunction:
|
|
return cast<SharedTrylockFunctionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SizedBy:
|
|
return cast<SizedByAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SizedByOrNull:
|
|
return cast<SizedByOrNullAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SpeculativeLoadHardening:
|
|
return cast<SpeculativeLoadHardeningAttr>(this)->printPretty(OS, Policy);
|
|
case attr::StandaloneDebug:
|
|
return cast<StandaloneDebugAttr>(this)->printPretty(OS, Policy);
|
|
case attr::StdCall:
|
|
return cast<StdCallAttr>(this)->printPretty(OS, Policy);
|
|
case attr::StrictFP:
|
|
return cast<StrictFPAttr>(this)->printPretty(OS, Policy);
|
|
case attr::StrictGuardStackCheck:
|
|
return cast<StrictGuardStackCheckAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Suppress:
|
|
return cast<SuppressAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftAsync:
|
|
return cast<SwiftAsyncAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftAsyncCall:
|
|
return cast<SwiftAsyncCallAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftAsyncContext:
|
|
return cast<SwiftAsyncContextAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftAsyncError:
|
|
return cast<SwiftAsyncErrorAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftAsyncName:
|
|
return cast<SwiftAsyncNameAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftAttr:
|
|
return cast<SwiftAttrAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftBridge:
|
|
return cast<SwiftBridgeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftBridgedTypedef:
|
|
return cast<SwiftBridgedTypedefAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftCall:
|
|
return cast<SwiftCallAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftContext:
|
|
return cast<SwiftContextAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftError:
|
|
return cast<SwiftErrorAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftErrorResult:
|
|
return cast<SwiftErrorResultAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftImportAsNonGeneric:
|
|
return cast<SwiftImportAsNonGenericAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftImportPropertyAsAccessors:
|
|
return cast<SwiftImportPropertyAsAccessorsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftIndirectResult:
|
|
return cast<SwiftIndirectResultAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftName:
|
|
return cast<SwiftNameAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftNewType:
|
|
return cast<SwiftNewTypeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftObjCMembers:
|
|
return cast<SwiftObjCMembersAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftPrivate:
|
|
return cast<SwiftPrivateAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftVersionedAddition:
|
|
return cast<SwiftVersionedAdditionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SwiftVersionedRemoval:
|
|
return cast<SwiftVersionedRemovalAttr>(this)->printPretty(OS, Policy);
|
|
case attr::SysVABI:
|
|
return cast<SysVABIAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TLSModel:
|
|
return cast<TLSModelAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Target:
|
|
return cast<TargetAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TargetClones:
|
|
return cast<TargetClonesAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TargetVersion:
|
|
return cast<TargetVersionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TestTypestate:
|
|
return cast<TestTypestateAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ThisCall:
|
|
return cast<ThisCallAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Thread:
|
|
return cast<ThreadAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TransparentUnion:
|
|
return cast<TransparentUnionAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TrivialABI:
|
|
return cast<TrivialABIAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TryAcquireCapability:
|
|
return cast<TryAcquireCapabilityAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TypeNonNull:
|
|
return cast<TypeNonNullAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TypeNullUnspecified:
|
|
return cast<TypeNullUnspecifiedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TypeNullable:
|
|
return cast<TypeNullableAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TypeNullableResult:
|
|
return cast<TypeNullableResultAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TypeTagForDatatype:
|
|
return cast<TypeTagForDatatypeAttr>(this)->printPretty(OS, Policy);
|
|
case attr::TypeVisibility:
|
|
return cast<TypeVisibilityAttr>(this)->printPretty(OS, Policy);
|
|
case attr::UPtr:
|
|
return cast<UPtrAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Unavailable:
|
|
return cast<UnavailableAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Uninitialized:
|
|
return cast<UninitializedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Unlikely:
|
|
return cast<UnlikelyAttr>(this)->printPretty(OS, Policy);
|
|
case attr::UnsafeBufferUsage:
|
|
return cast<UnsafeBufferUsageAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Unused:
|
|
return cast<UnusedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::UseHandle:
|
|
return cast<UseHandleAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Used:
|
|
return cast<UsedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::UsingIfExists:
|
|
return cast<UsingIfExistsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Uuid:
|
|
return cast<UuidAttr>(this)->printPretty(OS, Policy);
|
|
case attr::VTablePointerAuthentication:
|
|
return cast<VTablePointerAuthenticationAttr>(this)->printPretty(OS, Policy);
|
|
case attr::VecReturn:
|
|
return cast<VecReturnAttr>(this)->printPretty(OS, Policy);
|
|
case attr::VecTypeHint:
|
|
return cast<VecTypeHintAttr>(this)->printPretty(OS, Policy);
|
|
case attr::VectorCall:
|
|
return cast<VectorCallAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Visibility:
|
|
return cast<VisibilityAttr>(this)->printPretty(OS, Policy);
|
|
case attr::WarnUnused:
|
|
return cast<WarnUnusedAttr>(this)->printPretty(OS, Policy);
|
|
case attr::WarnUnusedResult:
|
|
return cast<WarnUnusedResultAttr>(this)->printPretty(OS, Policy);
|
|
case attr::Weak:
|
|
return cast<WeakAttr>(this)->printPretty(OS, Policy);
|
|
case attr::WeakImport:
|
|
return cast<WeakImportAttr>(this)->printPretty(OS, Policy);
|
|
case attr::WeakRef:
|
|
return cast<WeakRefAttr>(this)->printPretty(OS, Policy);
|
|
case attr::WebAssemblyExportName:
|
|
return cast<WebAssemblyExportNameAttr>(this)->printPretty(OS, Policy);
|
|
case attr::WebAssemblyFuncref:
|
|
return cast<WebAssemblyFuncrefAttr>(this)->printPretty(OS, Policy);
|
|
case attr::WebAssemblyImportModule:
|
|
return cast<WebAssemblyImportModuleAttr>(this)->printPretty(OS, Policy);
|
|
case attr::WebAssemblyImportName:
|
|
return cast<WebAssemblyImportNameAttr>(this)->printPretty(OS, Policy);
|
|
case attr::WorkGroupSizeHint:
|
|
return cast<WorkGroupSizeHintAttr>(this)->printPretty(OS, Policy);
|
|
case attr::X86ForceAlignArgPointer:
|
|
return cast<X86ForceAlignArgPointerAttr>(this)->printPretty(OS, Policy);
|
|
case attr::XRayInstrument:
|
|
return cast<XRayInstrumentAttr>(this)->printPretty(OS, Policy);
|
|
case attr::XRayLogArgs:
|
|
return cast<XRayLogArgsAttr>(this)->printPretty(OS, Policy);
|
|
case attr::ZeroCallUsedRegs:
|
|
return cast<ZeroCallUsedRegsAttr>(this)->printPretty(OS, Policy);
|
|
}
|
|
llvm_unreachable("Unexpected attribute kind!");
|
|
}
|
|
|