diff options
author | Timm Baeder <tbaeder@redhat.com> | 2024-12-28 14:07:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-28 14:07:01 +0100 |
commit | e86b68ff560aaf5fc723eaa8d8418892b2456e12 (patch) | |
tree | 6e08296a16bd2a8caa50de6414ad75719a67a8d7 /clang/lib/AST/ByteCode/Pointer.cpp | |
parent | 7e749d4fb7327ce2da307ed020c02a07e8279992 (diff) | |
download | llvm-e86b68ff560aaf5fc723eaa8d8418892b2456e12.zip llvm-e86b68ff560aaf5fc723eaa8d8418892b2456e12.tar.gz llvm-e86b68ff560aaf5fc723eaa8d8418892b2456e12.tar.bz2 |
[clang][bytecode] Add support for typeid pointers (#121251)
Add it as another kind of pointer, saving both a `Type*` for the result
of the typeid() expression as well as one for the type of the typeid
expression.
Diffstat (limited to 'clang/lib/AST/ByteCode/Pointer.cpp')
-rw-r--r-- | clang/lib/AST/ByteCode/Pointer.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/clang/lib/AST/ByteCode/Pointer.cpp b/clang/lib/AST/ByteCode/Pointer.cpp index 01e6423..da20259 100644 --- a/clang/lib/AST/ByteCode/Pointer.cpp +++ b/clang/lib/AST/ByteCode/Pointer.cpp @@ -96,6 +96,8 @@ void Pointer::operator=(const Pointer &P) { PointeeStorage.Int = P.PointeeStorage.Int; } else if (P.isFunctionPointer()) { PointeeStorage.Fn = P.PointeeStorage.Fn; + } else if (P.isTypeidPointer()) { + PointeeStorage.Typeid = P.PointeeStorage.Typeid; } else { assert(false && "Unhandled storage kind"); } @@ -132,6 +134,8 @@ void Pointer::operator=(Pointer &&P) { PointeeStorage.Int = P.PointeeStorage.Int; } else if (P.isFunctionPointer()) { PointeeStorage.Fn = P.PointeeStorage.Fn; + } else if (P.isTypeidPointer()) { + PointeeStorage.Typeid = P.PointeeStorage.Typeid; } else { assert(false && "Unhandled storage kind"); } @@ -151,6 +155,14 @@ APValue Pointer::toAPValue(const ASTContext &ASTCtx) const { if (isFunctionPointer()) return asFunctionPointer().toAPValue(ASTCtx); + if (isTypeidPointer()) { + TypeInfoLValue TypeInfo(PointeeStorage.Typeid.TypePtr); + return APValue( + APValue::LValueBase::getTypeInfo( + TypeInfo, QualType(PointeeStorage.Typeid.TypeInfoType, 0)), + CharUnits::Zero(), APValue::NoLValuePath{}); + } + // Build the lvalue base from the block. const Descriptor *Desc = getDeclDesc(); APValue::LValueBase Base; @@ -304,6 +316,8 @@ void Pointer::print(llvm::raw_ostream &OS) const { case Storage::Fn: OS << "(Fn) { " << asFunctionPointer().getFunction() << " + " << Offset << " }"; + case Storage::Typeid: + OS << "(Typeid)"; } } @@ -450,6 +464,8 @@ bool Pointer::hasSameBase(const Pointer &A, const Pointer &B) { return true; if (A.isFunctionPointer() && B.isFunctionPointer()) return true; + if (A.isTypeidPointer() && B.isTypeidPointer()) + return true; if (A.isIntegralPointer() || B.isIntegralPointer()) return A.getSource() == B.getSource(); |