diff options
author | Evan Cheng <evan.cheng@apple.com> | 2011-04-15 19:35:46 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2011-04-15 19:35:46 +0000 |
commit | b6a638898a92d5cd782209fbeb673fe7846a29eb (patch) | |
tree | c2bac267c9f205add5724341e0d7e9aa74f904be /utils/TableGen | |
parent | c25e8d8cea7af83b5538ac0e521366d06c9720d9 (diff) | |
download | llvm-b6a638898a92d5cd782209fbeb673fe7846a29eb.tar.gz llvm-b6a638898a92d5cd782209fbeb673fe7846a29eb.tar.bz2 llvm-b6a638898a92d5cd782209fbeb673fe7846a29eb.tar.xz |
Increase SubtargetFeatureKV Value and Implies fields to 64 bits since some targets are getting very close to 32 subtarget features. Also teach tablegen to error when there are more than 64 features to guard against undefined behavior. rdar://9282332
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129590 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen')
-rw-r--r-- | utils/TableGen/SubtargetEmitter.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/utils/TableGen/SubtargetEmitter.cpp b/utils/TableGen/SubtargetEmitter.cpp index 8ca4b1c144..928fa4bee9 100644 --- a/utils/TableGen/SubtargetEmitter.cpp +++ b/utils/TableGen/SubtargetEmitter.cpp @@ -33,7 +33,13 @@ void SubtargetEmitter::Enumeration(raw_ostream &OS, OS << "enum {\n"; // For each record - for (unsigned i = 0, N = DefList.size(); i < N;) { + unsigned N = DefList.size(); + if (N > 64) { + errs() << "Too many (> 64) subtarget features!\n"; + exit(1); + } + + for (unsigned i = 0; i < N;) { // Next record Record *Def = DefList[i]; @@ -41,7 +47,7 @@ void SubtargetEmitter::Enumeration(raw_ostream &OS, OS << " " << Def->getName(); // If bit flags then emit expression (1 << i) - if (isBits) OS << " = " << " 1 << " << i; + if (isBits) OS << " = " << " 1ULL << " << i; // Depending on 'if more in the list' emit comma if (++i < N) OS << ","; @@ -88,7 +94,7 @@ void SubtargetEmitter::FeatureKeyValues(raw_ostream &OS) { Feature->getValueAsListOfDefs("Implies"); if (ImpliesList.empty()) { - OS << "0"; + OS << "0ULL"; } else { for (unsigned j = 0, M = ImpliesList.size(); j < M;) { OS << ImpliesList[j]->getName(); @@ -142,7 +148,7 @@ void SubtargetEmitter::CPUKeyValues(raw_ostream &OS) { << "\"Select the " << Name << " processor\", "; if (FeatureList.empty()) { - OS << "0"; + OS << "0ULL"; } else { for (unsigned j = 0, M = FeatureList.size(); j < M;) { OS << FeatureList[j]->getName(); @@ -151,7 +157,7 @@ void SubtargetEmitter::CPUKeyValues(raw_ostream &OS) { } // The "0" is for the "implies" section of this data structure. - OS << ", 0 }"; + OS << ", 0ULL }"; // Depending on 'if more in the list' emit comma if (++i < N) OS << ","; @@ -608,7 +614,7 @@ void SubtargetEmitter::ParseFeaturesFunction(raw_ostream &OS) { << " DEBUG(dbgs() << \"\\nCPU:\" << CPU);\n" << " SubtargetFeatures Features(FS);\n" << " Features.setCPUIfNone(CPU);\n" - << " uint32_t Bits = Features.getBits(SubTypeKV, SubTypeKVSize,\n" + << " uint64_t Bits = Features.getBits(SubTypeKV, SubTypeKVSize,\n" << " FeatureKV, FeatureKVSize);\n"; for (unsigned i = 0; i < Features.size(); i++) { |