mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-11 21:38:19 +00:00
recommit bcreader, handling packed structs correctly. Apparently
people want fast *and* correct. Sheesh. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55102 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -32,9 +32,22 @@ namespace llvm {
|
||||
|
||||
class BitcodeReaderValueList : public User {
|
||||
unsigned Capacity;
|
||||
|
||||
/// ResolveConstants - As we resolve forward-referenced constants, we add
|
||||
/// information about them to this vector. This allows us to resolve them in
|
||||
/// bulk instead of resolving each reference at a time. See the code in
|
||||
/// ResolveConstantForwardRefs for more information about this.
|
||||
///
|
||||
/// The key of this vector is the placeholder constant, the value is the slot
|
||||
/// number that holds the resolved value.
|
||||
typedef std::vector<std::pair<Constant*, unsigned> > ResolveConstantsTy;
|
||||
ResolveConstantsTy ResolveConstants;
|
||||
public:
|
||||
BitcodeReaderValueList() : User(Type::VoidTy, Value::ArgumentVal, 0, 0)
|
||||
, Capacity(0) {}
|
||||
~BitcodeReaderValueList() {
|
||||
assert(ResolveConstants.empty() && "Constants not resolved?");
|
||||
}
|
||||
|
||||
/// Provide fast operand accessors
|
||||
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
|
||||
@ -50,6 +63,7 @@ public:
|
||||
}
|
||||
|
||||
void clear() {
|
||||
assert(ResolveConstants.empty() && "Constants not resolved?");
|
||||
if (OperandList) dropHungoffUses(OperandList);
|
||||
Capacity = 0;
|
||||
}
|
||||
@ -73,15 +87,26 @@ public:
|
||||
if (Idx == size()) {
|
||||
push_back(V);
|
||||
} else if (Value *OldV = getOperand(Idx)) {
|
||||
// If there was a forward reference to this value, replace it.
|
||||
setOperand(Idx, V);
|
||||
OldV->replaceAllUsesWith(V);
|
||||
delete OldV;
|
||||
// Handle constants and non-constants (e.g. instrs) differently for
|
||||
// efficiency.
|
||||
if (Constant *PHC = dyn_cast<Constant>(OldV)) {
|
||||
ResolveConstants.push_back(std::make_pair(PHC, Idx));
|
||||
setOperand(Idx, V);
|
||||
} else {
|
||||
// If there was a forward reference to this value, replace it.
|
||||
setOperand(Idx, V);
|
||||
OldV->replaceAllUsesWith(V);
|
||||
delete OldV;
|
||||
}
|
||||
} else {
|
||||
initVal(Idx, V);
|
||||
}
|
||||
}
|
||||
|
||||
/// ResolveConstantForwardRefs - Once all constants are read, this method bulk
|
||||
/// resolves any forward references.
|
||||
void ResolveConstantForwardRefs();
|
||||
|
||||
private:
|
||||
void initVal(unsigned Idx, Value *V) {
|
||||
if (Idx >= size()) {
|
||||
@ -94,7 +119,8 @@ private:
|
||||
};
|
||||
|
||||
template <>
|
||||
struct OperandTraits<BitcodeReaderValueList> : HungoffOperandTraits</*16 FIXME*/> {
|
||||
struct OperandTraits<BitcodeReaderValueList>
|
||||
: HungoffOperandTraits</*16 FIXME*/> {
|
||||
};
|
||||
|
||||
DEFINE_TRANSPARENT_OPERAND_ACCESSORS(BitcodeReaderValueList, Value)
|
||||
|
Reference in New Issue
Block a user