diff options
| author | Dale Johannesen <dalej@apple.com> | 2010-09-16 18:30:55 +0000 |
|---|---|---|
| committer | Dale Johannesen <dalej@apple.com> | 2010-09-16 18:30:55 +0000 |
| commit | e1956e67526da1b81c6f454137fa5cc2ff1a3956 (patch) | |
| tree | e1997b1bcf1f3531e2c50153787ab449961da23f /lib/Transforms | |
| parent | fef2e072c9c3d905e9b5479bedc5c215ba8cc8bc (diff) | |
| download | external_llvm-e1956e67526da1b81c6f454137fa5cc2ff1a3956.zip external_llvm-e1956e67526da1b81c6f454137fa5cc2ff1a3956.tar.gz external_llvm-e1956e67526da1b81c6f454137fa5cc2ff1a3956.tar.bz2 | |
When substituting sunkaddrs into indirect arguments an asm, we were
walking the asm arguments once and stashing their Values. This is
wrong because the same memory location can be in the list twice, and
if the first one has a sunkaddr substituted, the stashed value for the
second one will be wrong (use-after-free). PR 8154.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114104 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
| -rw-r--r-- | lib/Transforms/Scalar/CodeGenPrepare.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/CodeGenPrepare.cpp b/lib/Transforms/Scalar/CodeGenPrepare.cpp index 0228282..437de38 100644 --- a/lib/Transforms/Scalar/CodeGenPrepare.cpp +++ b/lib/Transforms/Scalar/CodeGenPrepare.cpp @@ -738,6 +738,7 @@ bool CodeGenPrepare::OptimizeInlineAsmInst(Instruction *I, CallSite CS, bool MadeChange = false; std::vector<TargetLowering::AsmOperandInfo> TargetConstraints = TLI->ParseConstraints(CS); + unsigned ArgNo = 0; for (unsigned i = 0, e = TargetConstraints.size(); i != e; ++i) { TargetLowering::AsmOperandInfo &OpInfo = TargetConstraints[i]; @@ -746,9 +747,10 @@ bool CodeGenPrepare::OptimizeInlineAsmInst(Instruction *I, CallSite CS, if (OpInfo.ConstraintType == TargetLowering::C_Memory && OpInfo.isIndirect) { - Value *OpVal = OpInfo.CallOperandVal; + Value *OpVal = const_cast<Value *>(CS.getArgument(ArgNo++)); MadeChange |= OptimizeMemoryInst(I, OpVal, OpVal->getType(), SunkAddrs); - } + } else if (OpInfo.Type == InlineAsm::isInput) + ArgNo++; } return MadeChange; |
