mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-04 10:04:33 +00:00
add a StructLayout::getElementContainingOffset method.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@20579 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
977df76722
commit
e7ea48cb61
@ -22,6 +22,7 @@
|
||||
#include "llvm/Constants.h"
|
||||
#include "llvm/Support/GetElementPtrTypeIterator.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include <algorithm>
|
||||
using namespace llvm;
|
||||
|
||||
// Handle the Pass registration stuff necessary to use TargetData's.
|
||||
@ -71,6 +72,22 @@ StructLayout::StructLayout(const StructType *ST, const TargetData &TD) {
|
||||
StructSize = (StructSize/StructAlignment + 1) * StructAlignment;
|
||||
}
|
||||
|
||||
|
||||
/// getElementContainingOffset - Given a valid offset into the structure,
|
||||
/// return the structure index that contains it.
|
||||
unsigned StructLayout::getElementContainingOffset(uint64_t Offset) const {
|
||||
std::vector<uint64_t>::const_iterator SI =
|
||||
std::upper_bound(MemberOffsets.begin(), MemberOffsets.end(),
|
||||
Offset);
|
||||
assert(SI != MemberOffsets.begin() && "Offset not in structure type!");
|
||||
--SI;
|
||||
assert(*SI <= Offset && "upper_bound didn't work");
|
||||
assert((SI == MemberOffsets.begin() || *(SI-1) < Offset) &&
|
||||
(SI+1 == MemberOffsets.end() || *(SI+1) > Offset) &&
|
||||
"Upper bound didn't work!");
|
||||
return SI-MemberOffsets.begin();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// TargetData Class Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
Loading…
Reference in New Issue
Block a user