diff options
author | Karl Schimpf <kschimpf@google.com> | 2013-08-28 14:34:19 -0700 |
---|---|---|
committer | Karl Schimpf <kschimpf@google.com> | 2013-08-28 14:34:19 -0700 |
commit | 493d4ab9edba2be18c916d80aaa100a0e51e1f51 (patch) | |
tree | 0fe55c21475362e19e6aec0404633f26c89f314e /lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp | |
parent | 117111856d5cca5a0286792180ad9e241ea4d701 (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.cpp | 19 |
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: |