[clang] 9a33f02 - Revert "Canonicalize declaration pointers when forming APValues."
Arthur Eubanks via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 12 12:37:34 PDT 2020
Author: Arthur Eubanks
Date: 2020-10-12T12:37:24-07:00
New Revision: 9a33f027ac7d73e14ae287e78ab554142d1cbc8f
URL: https://github.com/llvm/llvm-project/commit/9a33f027ac7d73e14ae287e78ab554142d1cbc8f
DIFF: https://github.com/llvm/llvm-project/commit/9a33f027ac7d73e14ae287e78ab554142d1cbc8f.diff
LOG: Revert "Canonicalize declaration pointers when forming APValues."
This reverts commit 9dcd96f728863d40d6f5922ed52732fdd728fb5f.
See https://crbug.com/1134762.
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/lib/CodeGen/CGExprConstant.cpp
clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
clang/test/CodeGenCXX/weak-external.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 ac8ed0818af0..9e9468645fe7 100644
--- a/clang/include/clang/AST/APValue.h
+++ b/clang/include/clang/AST/APValue.h
@@ -177,7 +177,6 @@ class APValue {
return !(LHS == RHS);
}
friend llvm::hash_code hash_value(const LValueBase &Base);
- friend struct llvm::DenseMapInfo<LValueBase>;
private:
PtrTy Ptr;
@@ -205,7 +204,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 7efd0caf3f1d..22145beafd8d 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} {}
@@ -90,19 +90,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());
-}
-
void APValue::LValuePathEntry::profile(llvm::FoldingSetNodeID &ID) const {
ID.AddInteger(Value);
}
@@ -131,16 +125,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 {
@@ -934,10 +926,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 a6c7f30528eb..6bb8aa026ad8 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4686,9 +4686,11 @@ char *Buffer = new (getASTContext(), 1) char[Name.size() + 1];
void ValueDecl::anchor() {}
bool ValueDecl::isWeak() const {
- auto *MostRecent = getMostRecentDecl();
- return MostRecent->hasAttr<WeakAttr>() ||
- MostRecent->hasAttr<WeakRefAttr>() || isWeakImported();
+ for (const auto *I : attrs())
+ if (isa<WeakAttr>(I) || isa<WeakRefAttr>(I))
+ return true;
+
+ return isWeakImported();
}
void ImplicitParamDecl::anchor() {}
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 639a5733b34b..67ca5271929f 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -1982,11 +1982,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) {
@@ -3156,8 +3163,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/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp
index bff4a0c38af9..b0a37531dfe1 100644
--- a/clang/lib/CodeGen/CGExprConstant.cpp
+++ b/clang/lib/CodeGen/CGExprConstant.cpp
@@ -1877,10 +1877,6 @@ ConstantLValue
ConstantLValueEmitter::tryEmitBase(const APValue::LValueBase &base) {
// Handle values.
if (const ValueDecl *D = base.dyn_cast<const ValueDecl*>()) {
- // The constant always points to the canonical declaration. We want to look
- // at properties of the most recent declaration at the point of emission.
- D = cast<ValueDecl>(D->getMostRecentDecl());
-
if (D->hasAttr<WeakRefAttr>())
return CGM.GetWeakRefReference(D).getPointer();
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/CodeGenCXX/weak-external.cpp b/clang/test/CodeGenCXX/weak-external.cpp
index 433fb3c80624..a2c53a59dcd5 100644
--- a/clang/test/CodeGenCXX/weak-external.cpp
+++ b/clang/test/CodeGenCXX/weak-external.cpp
@@ -64,15 +64,3 @@ class _LIBCPP_EXCEPTION_ABI runtime_error
void dummysymbol() {
throw(std::runtime_error("string"));
}
-
-namespace not_weak_on_first {
- int func();
- // CHECK: {{.*}} extern_weak {{.*}} @_ZN17not_weak_on_first4funcEv(
- int func() __attribute__ ((weak));
-
- typedef int (*FuncT)();
-
- extern const FuncT table[] = {
- func,
- };
-}
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
More information about the cfe-commits
mailing list