Loading clang/lib/CodeGen/CodeGenTBAA.cpp +9 −8 Original line number Diff line number Diff line Loading @@ -78,17 +78,18 @@ llvm::MDNode *CodeGenTBAA::getChar() { static bool TypeHasMayAlias(QualType QTy) { // Tagged types have declarations, and therefore may have attributes. if (const TagType *TTy = dyn_cast<TagType>(QTy)) return TTy->getDecl()->hasAttr<MayAliasAttr>(); if (auto *TD = QTy->getAsTagDecl()) if (TD->hasAttr<MayAliasAttr>()) return true; // Typedef types have declarations, and therefore may have attributes. if (const TypedefType *TTy = dyn_cast<TypedefType>(QTy)) { if (TTy->getDecl()->hasAttr<MayAliasAttr>()) // Also look for may_alias as a declaration attribute on a typedef. // FIXME: We should follow GCC and model may_alias as a type attribute // rather than as a declaration attribute. while (auto *TT = QTy->getAs<TypedefType>()) { if (TT->getDecl()->hasAttr<MayAliasAttr>()) return true; // Also, their underlying types may have relevant attributes. return TypeHasMayAlias(TTy->desugar()); QTy = TT->desugar(); } return false; } Loading clang/test/CodeGenCXX/may_alias.cpp 0 → 100644 +25 −0 Original line number Diff line number Diff line // RUN: %clang_cc1 %s -triple %itanium_abi_triple -emit-llvm -O2 -disable-llvm-passes -o - | FileCheck %s // RUN: %clang_cc1 %s -triple %ms_abi_triple -emit-llvm -O2 -disable-llvm-passes -o - | FileCheck %s enum class __attribute__((may_alias)) E {}; template<typename T> struct A { using B __attribute__((may_alias)) = enum {}; }; template<typename T> using Alias = typename A<T>::B; // CHECK-LABEL: define {{.*}}foo // CHECK: load i{{[0-9]*}}, {{.*}}, !tbaa ![[MAY_ALIAS:[^ ,]*]] auto foo(E &r) { return r; } // CHECK-LABEL: define {{.*}}goo // CHECK: load i{{[0-9]*}}, {{.*}}, !tbaa ![[MAY_ALIAS]] auto goo(A<int>::B &r) { return r; } // CHECK-LABEL: define {{.*}}hoo // CHECK: load i{{[0-9]*}}, {{.*}}, !tbaa ![[MAY_ALIAS]] auto hoo(Alias<int> &r) { return r; } // CHECK: ![[CHAR:.*]] = !{!"omnipotent char", !{{.*}}, i64 0} // CHECK: ![[MAY_ALIAS]] = !{![[CHAR]], ![[CHAR]], i64 0} Loading
clang/lib/CodeGen/CodeGenTBAA.cpp +9 −8 Original line number Diff line number Diff line Loading @@ -78,17 +78,18 @@ llvm::MDNode *CodeGenTBAA::getChar() { static bool TypeHasMayAlias(QualType QTy) { // Tagged types have declarations, and therefore may have attributes. if (const TagType *TTy = dyn_cast<TagType>(QTy)) return TTy->getDecl()->hasAttr<MayAliasAttr>(); if (auto *TD = QTy->getAsTagDecl()) if (TD->hasAttr<MayAliasAttr>()) return true; // Typedef types have declarations, and therefore may have attributes. if (const TypedefType *TTy = dyn_cast<TypedefType>(QTy)) { if (TTy->getDecl()->hasAttr<MayAliasAttr>()) // Also look for may_alias as a declaration attribute on a typedef. // FIXME: We should follow GCC and model may_alias as a type attribute // rather than as a declaration attribute. while (auto *TT = QTy->getAs<TypedefType>()) { if (TT->getDecl()->hasAttr<MayAliasAttr>()) return true; // Also, their underlying types may have relevant attributes. return TypeHasMayAlias(TTy->desugar()); QTy = TT->desugar(); } return false; } Loading
clang/test/CodeGenCXX/may_alias.cpp 0 → 100644 +25 −0 Original line number Diff line number Diff line // RUN: %clang_cc1 %s -triple %itanium_abi_triple -emit-llvm -O2 -disable-llvm-passes -o - | FileCheck %s // RUN: %clang_cc1 %s -triple %ms_abi_triple -emit-llvm -O2 -disable-llvm-passes -o - | FileCheck %s enum class __attribute__((may_alias)) E {}; template<typename T> struct A { using B __attribute__((may_alias)) = enum {}; }; template<typename T> using Alias = typename A<T>::B; // CHECK-LABEL: define {{.*}}foo // CHECK: load i{{[0-9]*}}, {{.*}}, !tbaa ![[MAY_ALIAS:[^ ,]*]] auto foo(E &r) { return r; } // CHECK-LABEL: define {{.*}}goo // CHECK: load i{{[0-9]*}}, {{.*}}, !tbaa ![[MAY_ALIAS]] auto goo(A<int>::B &r) { return r; } // CHECK-LABEL: define {{.*}}hoo // CHECK: load i{{[0-9]*}}, {{.*}}, !tbaa ![[MAY_ALIAS]] auto hoo(Alias<int> &r) { return r; } // CHECK: ![[CHAR:.*]] = !{!"omnipotent char", !{{.*}}, i64 0} // CHECK: ![[MAY_ALIAS]] = !{![[CHAR]], ![[CHAR]], i64 0}