summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/TargetInfo.cpp
diff options
context:
space:
mode:
authorRobert Lytton <robert@xmos.com>2014-05-20 07:19:33 +0000
committerRobert Lytton <robert@xmos.com>2014-05-20 07:19:33 +0000
commitdb8c1cb02ca7f80fff87d3002569da8c18fa6cb0 (patch)
tree35c2b88f61c2ccaf36bb89b8f6e9d3ff89c6ed91 /clang/lib/CodeGen/TargetInfo.cpp
parent5988590363f4c438586785f4895812751adc60b6 (diff)
downloadbcm5719-llvm-db8c1cb02ca7f80fff87d3002569da8c18fa6cb0.tar.gz
bcm5719-llvm-db8c1cb02ca7f80fff87d3002569da8c18fa6cb0.zip
XCore target: sort typestring enum fields alphabetically
llvm-svn: 209196
Diffstat (limited to 'clang/lib/CodeGen/TargetInfo.cpp')
-rw-r--r--clang/lib/CodeGen/TargetInfo.cpp39
1 files changed, 23 insertions, 16 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp
index 4b49c17c302..070896c70c7 100644
--- a/clang/lib/CodeGen/TargetInfo.cpp
+++ b/clang/lib/CodeGen/TargetInfo.cpp
@@ -6131,7 +6131,7 @@ public:
StringRef lookupStr(const IdentifierInfo *ID);
};
-/// TypeString encodings for union fields must be order.
+/// TypeString encodings for enum & union fields must be order.
/// FieldEncoding is a helper for this ordering process.
class FieldEncoding {
bool HasName;
@@ -6390,12 +6390,12 @@ static bool appendRecordType(SmallStringEnc &Enc, const RecordType *RT,
// We collect all encoded fields and order as necessary.
bool IsRecursive = false;
- SmallVector<FieldEncoding, 16> FE;
const RecordDecl *RD = RT->getDecl()->getDefinition();
if (RD && !RD->field_empty()) {
// An incomplete TypeString stub is placed in the cache for this RecordType
// so that recursive calls to this RecordType will use it whilst building a
// complete TypeString for this RecordType.
+ SmallVector<FieldEncoding, 16> FE;
std::string StubEnc(Enc.substr(Start).str());
StubEnc += '}'; // StubEnc now holds a valid incomplete TypeString.
TSC.addIncomplete(ID, std::move(StubEnc));
@@ -6408,15 +6408,14 @@ static bool appendRecordType(SmallStringEnc &Enc, const RecordType *RT,
// See FieldEncoding::operator< for sort algorithm.
if (RT->isUnionType())
std::sort(FE.begin(), FE.end());
- }
-
- // We can now complete the TypeString.
- if (unsigned E = FE.size())
+ // We can now complete the TypeString.
+ unsigned E = FE.size();
for (unsigned I = 0; I != E; ++I) {
if (I)
Enc += ',';
Enc += FE[I].str();
}
+ }
Enc += '}';
TSC.addIfComplete(ID, Enc.substr(Start), IsRecursive);
return true;
@@ -6438,18 +6437,26 @@ static bool appendEnumType(SmallStringEnc &Enc, const EnumType *ET,
if (ID)
Enc += ID->getName();
Enc += "){";
+
+ // We collect all encoded enumerations and order them alphanumerically.
if (const EnumDecl *ED = ET->getDecl()->getDefinition()) {
- auto I = ED->enumerator_begin();
- auto E = ED->enumerator_end();
- while (I != E) {
- Enc += "m(";
- Enc += I->getName();
- Enc += "){";
- I->getInitVal().toString(Enc);
- Enc += '}';
- ++I;
- if (I != E)
+ SmallVector<FieldEncoding, 16> FE;
+ for (auto I = ED->enumerator_begin(), E = ED->enumerator_end(); I != E;
+ ++I) {
+ SmallStringEnc EnumEnc;
+ EnumEnc += "m(";
+ EnumEnc += I->getName();
+ EnumEnc += "){";
+ I->getInitVal().toString(EnumEnc);
+ EnumEnc += '}';
+ FE.push_back(FieldEncoding(!I->getName().empty(), EnumEnc));
+ }
+ std::sort(FE.begin(), FE.end());
+ unsigned E = FE.size();
+ for (unsigned I = 0; I != E; ++I) {
+ if (I)
Enc += ',';
+ Enc += FE[I].str();
}
}
Enc += '}';
OpenPOWER on IntegriCloud