aboutsummaryrefslogtreecommitdiff
path: root/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp
diff options
context:
space:
mode:
authorKarl Schimpf <kschimpf@google.com>2013-09-04 13:34:52 -0700
committerKarl Schimpf <kschimpf@google.com>2013-09-04 13:34:52 -0700
commitd8f9bfbc093e7e0c1fab719bc014ba7c6f94ad6d (patch)
treef97b1b11573bba4db6a158514f83ee4e3ef77cb3 /lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp
parentf8ea6b0a1ed535c10089d53c93f32cfe0117c812 (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.cpp34
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();
}