Augmented ReadPtr and ReadOwnedPtr to control whether or not a pointer is allowed to be backpatched

or can be registered with the deserializer to backpatch other pointers.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43783 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ted Kremenek 2007-11-06 22:21:14 +00:00
parent 373a733be0
commit b12a82dbf4
2 changed files with 16 additions and 10 deletions

View File

@ -114,33 +114,36 @@ public:
void ReadCStr(std::vector<char>& buff, bool isNullTerm=false);
template <typename T>
inline T* ReadOwnedPtr() {
inline T* ReadOwnedPtr(bool AutoRegister = true) {
unsigned PtrId = ReadInt();
if (PtrId == 0)
return NULL;
T* x = SerializeTrait<T>::Materialize(*this);
RegisterPtr(PtrId,x);
if (AutoRegister)
RegisterPtr(PtrId,x);
return x;
}
template <typename T>
inline void ReadOwnedPtr(T*& Ptr) {
Ptr = ReadOwnedPtr<T>();
inline void ReadOwnedPtr(T*& Ptr, bool AutoRegister = true) {
Ptr = ReadOwnedPtr<T>(AutoRegister);
}
template <typename T>
void ReadPtr(T*& PtrRef) {
ReadUIntPtr(reinterpret_cast<uintptr_t&>(PtrRef));
void ReadPtr(T*& PtrRef, bool AllowBackpatch = true) {
ReadUIntPtr(reinterpret_cast<uintptr_t&>(PtrRef), AllowBackpatch);
}
template <typename T>
void ReadPtr(const T*& PtrRef) {
ReadPtr(const_cast<T*&>(PtrRef));
void ReadPtr(const T*& PtrRef, bool AllowBackpatch = true) {
ReadPtr(const_cast<T*&>(PtrRef), AllowBackpatch);
}
void ReadUIntPtr(uintptr_t& PtrRef);
void ReadUIntPtr(uintptr_t& PtrRef, bool AllowBackpatch = true);
template <typename T>
T& ReadRef() {

View File

@ -152,7 +152,7 @@ void Deserializer::RegisterPtr(unsigned PtrId, const void* Ptr) {
SetPtr(E,Ptr);
}
void Deserializer::ReadUIntPtr(uintptr_t& PtrRef) {
void Deserializer::ReadUIntPtr(uintptr_t& PtrRef, bool AllowBackpatch) {
unsigned PtrId = ReadInt();
if (PtrId == 0) {
@ -169,6 +169,9 @@ void Deserializer::ReadUIntPtr(uintptr_t& PtrRef) {
if (HasFinalPtr(E))
PtrRef = GetFinalPtr(E);
else {
assert (AllowBackpatch &&
"Client forbids backpatching for this pointer.");
// Register backpatch. Check the freelist for a BPNode.
BPNode* N;