aboutsummaryrefslogtreecommitdiff
path: root/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp
diff options
context:
space:
mode:
authorKarl Schimpf <kschimpf@google.com>2013-08-28 14:34:19 -0700
committerKarl Schimpf <kschimpf@google.com>2013-08-28 14:34:19 -0700
commit493d4ab9edba2be18c916d80aaa100a0e51e1f51 (patch)
tree0fe55c21475362e19e6aec0404633f26c89f314e /lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp
parent117111856d5cca5a0286792180ad9e241ea4d701 (diff)
Handle pointer conversions for call instructions.
This also should complete the changes associated with removing pointer cast instructions from the PNaCl bitcode file. BUG= https://code.google.com/p/nativeclient/issues/detail?id=3544 R=dschuff@chromium.org, jvoung@chromium.org Review URL: https://codereview.chromium.org/23482002
Diffstat (limited to 'lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp')
-rw-r--r--lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp19
1 files changed, 10 insertions, 9 deletions
diff --git a/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp b/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp
index 060a6d63f4..8cfdf13240 100644
--- a/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp
+++ b/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp
@@ -438,9 +438,6 @@ static bool ExpectsNormalizedPtr(const Value *V, const Instruction *Arg) {
const Instruction *I = dyn_cast<Instruction>(V);
if (I == 0) return false;
- // TODO(kschimpf) Expand this list to any operation that can handle
- // normalized pointers. That is loads and stores, function calls, and
- // instrinsic calls.
switch (I->getOpcode()) {
default:
return false;
@@ -448,6 +445,10 @@ static bool ExpectsNormalizedPtr(const Value *V, const Instruction *Arg) {
return I->getOperand(0) == Arg;
case Instruction::Store:
return I->getOperand(1) == Arg;
+ case Instruction::Call:
+ // For function calls, the function operand is normalized, and for
+ // intrinsic calls, all pointer arguments are normalized.
+ return true;
}
}
@@ -493,12 +494,13 @@ static bool ExpectsScalarValue(const Value *V, const Instruction *Arg) {
const SelectInst *Op = dyn_cast<SelectInst>(I);
return Arg == Op->getTrueValue() || Arg == Op->getFalseValue();
}
+ case Instruction::Call: {
+ // All operands (except the first, which must be a function pointer),
+ // can be scalar values.
+ const CallInst *Call = cast<CallInst>(I);
+ return Call->getCalledValue() != Arg;
+ }
}
- // TODO(kschimpf): Need to think more about how to handle following
- // instructions:
- // case Instruction::IntToPtr:
- // case Instruction::BitCast:
- // case Instruction::Call:
}
}
@@ -526,7 +528,6 @@ static inline bool IsInherentPtr(const Value *V) {
// llvm/lib/Transforms/NaCl/ReplacePtrsWithInts.cpp.
const Value *NaClValueEnumerator::ElideCasts(const Value *V) {
if (PNaClVersion == 1) return V;
- // TODO(kschimpf): Expand this out to cover all cases.
if (const Instruction *I = dyn_cast<Instruction>(V)) {
switch (I->getOpcode()) {
default: