[PATCH] D133941: [clang][Interp] Record item types in InterpStack
Timm Bäder via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 15 07:11:53 PDT 2022
tbaeder created this revision.
tbaeder added reviewers: aaron.ballman, shafik, erichkeane, tahonermann.
Herald added a project: All.
tbaeder requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Since I've run into this a few times now...
When `push()`ing something on the stack, we need to later `pop()` the correct type of value, otherwise we run into problems.
This s just an idea and I've disabled it if `NDEBUG` is defined. The current tests all still work though, which is good.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D133941
Files:
clang/lib/AST/Interp/InterpStack.h
Index: clang/lib/AST/Interp/InterpStack.h
===================================================================
--- clang/lib/AST/Interp/InterpStack.h
+++ clang/lib/AST/Interp/InterpStack.h
@@ -13,7 +13,9 @@
#ifndef LLVM_CLANG_AST_INTERP_INTERPSTACK_H
#define LLVM_CLANG_AST_INTERP_INTERPSTACK_H
+#include "PrimType.h"
#include <memory>
+#include <vector>
namespace clang {
namespace interp {
@@ -29,10 +31,17 @@
/// Constructs a value in place on the top of the stack.
template <typename T, typename... Tys> void push(Tys &&... Args) {
new (grow(aligned_size<T>())) T(std::forward<Tys>(Args)...);
+#ifndef NDEBUG
+ ItemTypes.push_back(toPrimType<T>());
+#endif
}
/// Returns the value from the top of the stack and removes it.
template <typename T> T pop() {
+#ifndef NDEBUG
+ assert(ItemTypes.back() == toPrimType<T>());
+ ItemTypes.pop_back();
+#endif
auto *Ptr = &peek<T>();
auto Value = std::move(*Ptr);
Ptr->~T();
@@ -42,6 +51,10 @@
/// Discards the top value from the stack.
template <typename T> void discard() {
+#ifndef NDEBUG
+ assert(ItemTypes.back() == toPrimType<T>());
+ ItemTypes.pop_back();
+#endif
auto *Ptr = &peek<T>();
Ptr->~T();
shrink(aligned_size<T>());
@@ -111,6 +124,43 @@
StackChunk *Chunk = nullptr;
/// Total size of the stack.
size_t StackSize = 0;
+
+#ifndef NDEBUG
+ /// vector recording the type of data we pushed into the stack.
+ std::vector<PrimType> ItemTypes;
+
+ template <typename T> static constexpr PrimType toPrimType() {
+ if constexpr (std::is_same<T, Pointer>::value)
+ return PT_Ptr;
+ else if (std::is_same<T, bool>::value || std::is_same<T, Boolean>::value)
+ return PT_Bool;
+ else if (std::is_same<T, int8_t>::value ||
+ std::is_same<T, Integral<8, true>>::value)
+ return PT_Sint8;
+ else if (std::is_same<T, uint8_t>::value ||
+ std::is_same<T, Integral<8, false>>::value)
+ return PT_Uint8;
+ else if (std::is_same<T, int16_t>::value ||
+ std::is_same<T, Integral<16, true>>::value)
+ return PT_Sint16;
+ else if (std::is_same<T, uint16_t>::value ||
+ std::is_same<T, Integral<16, false>>::value)
+ return PT_Uint16;
+ else if (std::is_same<T, int32_t>::value ||
+ std::is_same<T, Integral<32, true>>::value)
+ return PT_Sint32;
+ else if (std::is_same<T, uint32_t>::value ||
+ std::is_same<T, Integral<32, false>>::value)
+ return PT_Uint32;
+ else if (std::is_same<T, int64_t>::value ||
+ std::is_same<T, Integral<64, true>>::value)
+ return PT_Sint64;
+ else if (std::is_same<T, uint64_t>::value ||
+ std::is_same<T, Integral<64, false>>::value)
+ return PT_Uint64;
+ assert(false);
+ }
+#endif
};
} // namespace interp
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D133941.460398.patch
Type: text/x-patch
Size: 2855 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220915/db3ae278/attachment-0001.bin>
More information about the cfe-commits
mailing list