зеркало из https://github.com/microsoft/clang-1.git
Make assertions for all addresses passed to ProgramPoint that they have at least an 8-byte alignment.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50310 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
dc34300db9
Коммит
6e5977f0a8
|
@ -31,14 +31,18 @@ protected:
|
|||
uintptr_t Data;
|
||||
|
||||
ProgramPoint(const void* Ptr, Kind k) {
|
||||
setRawData(Ptr, k);
|
||||
}
|
||||
|
||||
ProgramPoint() : Data(0) {}
|
||||
|
||||
void setRawData(const void* Ptr, Kind k) {
|
||||
assert ((reinterpret_cast<uintptr_t>(const_cast<void*>(Ptr)) & 0x7) == 0
|
||||
&& "Address must have at least an 8-byte alignment.");
|
||||
|
||||
Data = reinterpret_cast<uintptr_t>(const_cast<void*>(Ptr)) | k;
|
||||
}
|
||||
|
||||
ProgramPoint() : Data(0) {}
|
||||
|
||||
public:
|
||||
unsigned getKind() const { return Data & 0x7; }
|
||||
void* getRawPtr() const { return reinterpret_cast<void*>(Data & ~0x7); }
|
||||
|
@ -114,10 +118,8 @@ public:
|
|||
/// This ctor forces the BlockEdge to be constructed using an explicitly
|
||||
/// allocated pair object that is stored in the CFG. This is usually
|
||||
/// used to construct edges representing jumps using computed gotos.
|
||||
BlockEdge(CFG& cfg, const CFGBlock* B1, const CFGBlock* B2, bool) {
|
||||
Data = reinterpret_cast<uintptr_t>(cfg.getBlockEdgeImpl(B1, B2))
|
||||
| BlockEdgeAuxKind;
|
||||
}
|
||||
BlockEdge(CFG& cfg, const CFGBlock* B1, const CFGBlock* B2, bool)
|
||||
: ProgramPoint(cfg.getBlockEdgeImpl(B1, B2), BlockEdgeAuxKind) {}
|
||||
|
||||
|
||||
CFGBlock* getSrc() const;
|
||||
|
|
|
@ -19,15 +19,14 @@ using namespace clang;
|
|||
BlockEdge::BlockEdge(CFG& cfg, const CFGBlock* B1, const CFGBlock* B2) {
|
||||
if (B1->succ_size() == 1) {
|
||||
assert (*(B1->succ_begin()) == B2);
|
||||
Data = reinterpret_cast<uintptr_t>(B1) | BlockEdgeSrcKind;
|
||||
setRawData(B1, BlockEdgeSrcKind);
|
||||
}
|
||||
else if (B2->pred_size() == 1) {
|
||||
assert (*(B2->pred_begin()) == B1);
|
||||
Data = reinterpret_cast<uintptr_t>(B2) | BlockEdgeDstKind;
|
||||
setRawData(B2, BlockEdgeDstKind);
|
||||
}
|
||||
else
|
||||
Data = reinterpret_cast<uintptr_t>(cfg.getBlockEdgeImpl(B1,B2))
|
||||
| BlockEdgeAuxKind;
|
||||
setRawData(cfg.getBlockEdgeImpl(B1,B2), BlockEdgeAuxKind);
|
||||
}
|
||||
|
||||
CFGBlock* BlockEdge::getSrc() const {
|
||||
|
|
Загрузка…
Ссылка в новой задаче