diff options
author | Karl Schimpf <kschimpf@google.com> | 2013-09-04 13:34:52 -0700 |
---|---|---|
committer | Karl Schimpf <kschimpf@google.com> | 2013-09-04 13:34:52 -0700 |
commit | d8f9bfbc093e7e0c1fab719bc014ba7c6f94ad6d (patch) | |
tree | f97b1b11573bba4db6a158514f83ee4e3ef77cb3 /lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp | |
parent | f8ea6b0a1ed535c10089d53c93f32cfe0117c812 (diff) |
Remove ARRAY/VECTOR types from PNaCl bitcode files.
The value selector list for switch statements are represented using
ARRAY/VECTOR constants, but this information is not put into the bitcode file.
This CL changes the value enumerator to not emit these constants.
BUG= https://code.google.com/p/nativeclient/issues/detail?id=3649
R=mseaborn@chromium.org
Review URL: https://codereview.chromium.org/23653013
Diffstat (limited to 'lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp')
-rw-r--r-- | lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp b/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp index be31779a3a..a58a421db2 100644 --- a/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp +++ b/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp @@ -94,9 +94,16 @@ NaClValueEnumerator::NaClValueEnumerator(const Module *M, uint32_t PNaClVersion) if (IsElidedCast(I)) continue; - for (User::const_op_iterator OI = I->op_begin(), E = I->op_end(); - OI != E; ++OI) { - EnumerateOperandType(*OI); + if (const SwitchInst *SI = dyn_cast<SwitchInst>(I)) { + // Handle switch instruction specially, so that we don't + // write out unnecessary vector/array types used to model case + // selectors. + EnumerateOperandType(SI->getCondition()); + } else { + for (User::const_op_iterator OI = I->op_begin(), E = I->op_end(); + OI != E; ++OI) { + EnumerateOperandType(*OI); + } } EnumerateType(I->getType()); } @@ -403,13 +410,22 @@ void NaClValueEnumerator::incorporateFunction(const Function &F) { // Add all function-level constants to the value table. for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) { - for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I!=E; ++I) - for (User::const_op_iterator OI = I->op_begin(), E = I->op_end(); - OI != E; ++OI) { - if ((isa<Constant>(*OI) && !isa<GlobalValue>(*OI)) || - isa<InlineAsm>(*OI)) - EnumerateValue(*OI); + for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I!=E; ++I) { + if (const SwitchInst *SI = dyn_cast<SwitchInst>(I)) { + // Handle switch instruction specially, so that we don't write + // out unnecessary vector/array constants used to model case selectors. + if (isa<Constant>(SI->getCondition())) { + EnumerateValue(SI->getCondition()); + } + } else { + for (User::const_op_iterator OI = I->op_begin(), E = I->op_end(); + OI != E; ++OI) { + if ((isa<Constant>(*OI) && !isa<GlobalValue>(*OI)) || + isa<InlineAsm>(*OI)) + EnumerateValue(*OI); + } } + } BasicBlocks.push_back(BB); ValueMap[BB] = BasicBlocks.size(); } |