[clang] 15d94a7 - Revert "Canonicalize declaration pointers when forming APValues."
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Sun Sep 27 19:06:13 PDT 2020
On Tue, 22 Sep 2020 at 17:42, Leonard Chan via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: Leonard Chan
> Date: 2020-09-22T17:40:53-07:00
> New Revision: 15d94a7d0f8f0d6b3b5308fff51b286957e45650
>
> URL:
> https://github.com/llvm/llvm-project/commit/15d94a7d0f8f0d6b3b5308fff51b286957e45650
> DIFF:
> https://github.com/llvm/llvm-project/commit/15d94a7d0f8f0d6b3b5308fff51b286957e45650.diff
>
> LOG: Revert "Canonicalize declaration pointers when forming APValues."
>
> This reverts commit 905b9ca26c94fa86339451a528cedde5004fc1bb.
>
> Reverting because this strips `weak` attributes off function
> declarations, leading to the linker error we see at
>
> https://ci.chromium.org/p/fuchsia/builders/ci/clang_toolchain.fuchsia-arm64-debug-subbuild/b8868932035091473008
> .
>
> See https://reviews.llvm.org/rG905b9ca26c94 for reproducer details.
>
Thanks, re-committed with a fix in 9dcd96f728863d40d6f5922ed52732fdd728fb5f.
> Added:
>
>
> Modified:
> clang/include/clang/AST/APValue.h
> clang/lib/AST/APValue.cpp
> clang/lib/AST/Decl.cpp
> clang/lib/AST/DeclBase.cpp
> clang/lib/AST/ExprConstant.cpp
> clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
> clang/test/OpenMP/ordered_messages.cpp
>
> Removed:
>
>
>
>
> ################################################################################
> diff --git a/clang/include/clang/AST/APValue.h
> b/clang/include/clang/AST/APValue.h
> index 6307f8a92e5a..5103cfa8604e 100644
> --- a/clang/include/clang/AST/APValue.h
> +++ b/clang/include/clang/AST/APValue.h
> @@ -174,7 +174,6 @@ class APValue {
> return !(LHS == RHS);
> }
> friend llvm::hash_code hash_value(const LValueBase &Base);
> - friend struct llvm::DenseMapInfo<LValueBase>;
>
> private:
> PtrTy Ptr;
> @@ -202,7 +201,8 @@ class APValue {
>
> public:
> LValuePathEntry() : Value() {}
> - LValuePathEntry(BaseOrMemberType BaseOrMember);
> + LValuePathEntry(BaseOrMemberType BaseOrMember)
> + :
> Value{reinterpret_cast<uintptr_t>(BaseOrMember.getOpaqueValue())} {}
> static LValuePathEntry ArrayIndex(uint64_t Index) {
> LValuePathEntry Result;
> Result.Value = Index;
>
> diff --git a/clang/lib/AST/APValue.cpp b/clang/lib/AST/APValue.cpp
> index 32d3ff7ce1d0..08ae0ff3c67d 100644
> --- a/clang/lib/AST/APValue.cpp
> +++ b/clang/lib/AST/APValue.cpp
> @@ -38,7 +38,7 @@ static_assert(
> "Type is insufficiently aligned");
>
> APValue::LValueBase::LValueBase(const ValueDecl *P, unsigned I, unsigned
> V)
> - : Ptr(P ? cast<ValueDecl>(P->getCanonicalDecl()) : nullptr), Local{I,
> V} {}
> + : Ptr(P), Local{I, V} {}
> APValue::LValueBase::LValueBase(const Expr *P, unsigned I, unsigned V)
> : Ptr(P), Local{I, V} {}
>
> @@ -82,19 +82,13 @@ bool operator==(const APValue::LValueBase &LHS,
> const APValue::LValueBase &RHS) {
> if (LHS.Ptr != RHS.Ptr)
> return false;
> - if (LHS.is<TypeInfoLValue>() || LHS.is<DynamicAllocLValue>())
> + if (LHS.is<TypeInfoLValue>())
> return true;
> return LHS.Local.CallIndex == RHS.Local.CallIndex &&
> LHS.Local.Version == RHS.Local.Version;
> }
> }
>
> -APValue::LValuePathEntry::LValuePathEntry(BaseOrMemberType BaseOrMember) {
> - if (const Decl *D = BaseOrMember.getPointer())
> - BaseOrMember.setPointer(D->getCanonicalDecl());
> - Value = reinterpret_cast<uintptr_t>(BaseOrMember.getOpaqueValue());
> -}
> -
> namespace {
> struct LVBase {
> APValue::LValueBase Base;
> @@ -119,16 +113,14 @@ APValue::LValueBase::operator bool () const {
>
> clang::APValue::LValueBase
> llvm::DenseMapInfo<clang::APValue::LValueBase>::getEmptyKey() {
> - clang::APValue::LValueBase B;
> - B.Ptr = DenseMapInfo<const ValueDecl*>::getEmptyKey();
> - return B;
> + return clang::APValue::LValueBase(
> + DenseMapInfo<const ValueDecl*>::getEmptyKey());
> }
>
> clang::APValue::LValueBase
> llvm::DenseMapInfo<clang::APValue::LValueBase>::getTombstoneKey() {
> - clang::APValue::LValueBase B;
> - B.Ptr = DenseMapInfo<const ValueDecl*>::getTombstoneKey();
> - return B;
> + return clang::APValue::LValueBase(
> + DenseMapInfo<const ValueDecl*>::getTombstoneKey());
> }
>
> namespace clang {
> @@ -781,10 +773,8 @@ void APValue::MakeMemberPointer(const ValueDecl
> *Member, bool IsDerivedMember,
> assert(isAbsent() && "Bad state change");
> MemberPointerData *MPD = new ((void*)(char*)Data.buffer)
> MemberPointerData;
> Kind = MemberPointer;
> - MPD->MemberAndIsDerivedMember.setPointer(
> - Member ? cast<ValueDecl>(Member->getCanonicalDecl()) : nullptr);
> + MPD->MemberAndIsDerivedMember.setPointer(Member);
> MPD->MemberAndIsDerivedMember.setInt(IsDerivedMember);
> MPD->resizePath(Path.size());
> - for (unsigned I = 0; I != Path.size(); ++I)
> - MPD->getPath()[I] = Path[I]->getCanonicalDecl();
> + memcpy(MPD->getPath(), Path.data(), Path.size()*sizeof(const
> CXXRecordDecl*));
> }
>
> diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
> index ae38e3dd2a72..0ee1399d42df 100644
> --- a/clang/lib/AST/Decl.cpp
> +++ b/clang/lib/AST/Decl.cpp
> @@ -4686,7 +4686,7 @@ char *Buffer = new (getASTContext(), 1)
> char[Name.size() + 1];
> void ValueDecl::anchor() {}
>
> bool ValueDecl::isWeak() const {
> - for (const auto *I : getMostRecentDecl()->attrs())
> + for (const auto *I : attrs())
> if (isa<WeakAttr>(I) || isa<WeakRefAttr>(I))
> return true;
>
>
> diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
> index ab2b55c0762e..f4314d0bd961 100644
> --- a/clang/lib/AST/DeclBase.cpp
> +++ b/clang/lib/AST/DeclBase.cpp
> @@ -720,7 +720,7 @@ bool Decl::isWeakImported() const {
> if (!canBeWeakImported(IsDefinition))
> return false;
>
> - for (const auto *A : getMostRecentDecl()->attrs()) {
> + for (const auto *A : attrs()) {
> if (isa<WeakImportAttr>(A))
> return true;
>
>
> diff --git a/clang/lib/AST/ExprConstant.cpp
> b/clang/lib/AST/ExprConstant.cpp
> index 8e43b62662ee..e8f132dd4803 100644
> --- a/clang/lib/AST/ExprConstant.cpp
> +++ b/clang/lib/AST/ExprConstant.cpp
> @@ -1978,11 +1978,18 @@ static bool HasSameBase(const LValue &A, const
> LValue &B) {
> return false;
>
> if (A.getLValueBase().getOpaqueValue() !=
> - B.getLValueBase().getOpaqueValue())
> - return false;
> + B.getLValueBase().getOpaqueValue()) {
> + const Decl *ADecl = GetLValueBaseDecl(A);
> + if (!ADecl)
> + return false;
> + const Decl *BDecl = GetLValueBaseDecl(B);
> + if (!BDecl || ADecl->getCanonicalDecl() != BDecl->getCanonicalDecl())
> + return false;
> + }
>
> - return A.getLValueCallIndex() == B.getLValueCallIndex() &&
> - A.getLValueVersion() == B.getLValueVersion();
> + return IsGlobalLValue(A.getLValueBase()) ||
> + (A.getLValueCallIndex() == B.getLValueCallIndex() &&
> + A.getLValueVersion() == B.getLValueVersion());
> }
>
> static void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) {
> @@ -3101,8 +3108,7 @@ static bool evaluateVarDeclInit(EvalInfo &Info,
> const Expr *E,
>
> // If we're currently evaluating the initializer of this declaration,
> use that
> // in-flight value.
> - if (declaresSameEntity(Info.EvaluatingDecl.dyn_cast<const ValueDecl
> *>(),
> - VD)) {
> + if (Info.EvaluatingDecl.dyn_cast<const ValueDecl*>() == VD) {
> Result = Info.EvaluatingDeclValue;
> return true;
> }
>
> diff --git a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
> b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
> index 3720b277af7a..8d51dbde7177 100644
> --- a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
> +++ b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
> @@ -24,10 +24,11 @@ constexpr double &ni3; // expected-error {{declaration
> of reference variable 'ni
>
> constexpr int nc1 = i; // expected-error {{constexpr variable 'nc1' must
> be initialized by a constant expression}} expected-note {{read of non-const
> variable 'i' is not allowed in a constant expression}}
> constexpr C nc2 = C(); // expected-error {{cannot have non-literal type
> 'const C'}}
> -int &f(); // expected-note 2{{declared here}}
> +int &f(); // expected-note {{declared here}}
> constexpr int &nc3 = f(); // expected-error {{constexpr variable 'nc3'
> must be initialized by a constant expression}} expected-note
> {{non-constexpr function 'f' cannot be used in a constant expression}}
> constexpr int nc4(i); // expected-error {{constexpr variable 'nc4' must
> be initialized by a constant expression}} expected-note {{read of non-const
> variable 'i' is not allowed in a constant expression}}
> constexpr C nc5((C())); // expected-error {{cannot have non-literal type
> 'const C'}}
> +int &f(); // expected-note {{here}}
> constexpr int &nc6(f()); // expected-error {{constexpr variable 'nc6'
> must be initialized by a constant expression}} expected-note
> {{non-constexpr function 'f'}}
>
> struct pixel {
>
> diff --git a/clang/test/OpenMP/ordered_messages.cpp
> b/clang/test/OpenMP/ordered_messages.cpp
> index 8a3a86443eb8..f6b9dbd6d27f 100644
> --- a/clang/test/OpenMP/ordered_messages.cpp
> +++ b/clang/test/OpenMP/ordered_messages.cpp
> @@ -16,9 +16,6 @@ void xxx(int argc) {
> }
>
> int foo();
> -#if __cplusplus >= 201103L
> -// expected-note at -2 {{declared here}}
> -#endif
>
> template <class T>
> T foo() {
> @@ -179,7 +176,7 @@ T foo() {
>
> int foo() {
> #if __cplusplus >= 201103L
> -// expected-note at -2 {{declared here}}
> +// expected-note at -2 2 {{declared here}}
> #endif
> int k;
> #pragma omp for ordered
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200927/32961d28/attachment-0001.html>
More information about the cfe-commits
mailing list