mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-23 01:25:32 +00:00
move FlattenVariants out of AsmMatcherEmitter into a shared
CodeGenInstruction::FlattenAsmStringVariants method. Use it to simplify the code in AsmWriterInst, which now no longer needs to worry about variants. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117886 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -321,3 +321,52 @@ HasOneImplicitDefWithKnownVT(const CodeGenTarget &TargetInfo) const {
|
||||
return MVT::Other;
|
||||
}
|
||||
|
||||
|
||||
/// FlattenAsmStringVariants - Flatten the specified AsmString to only
|
||||
/// include text from the specified variant, returning the new string.
|
||||
std::string CodeGenInstruction::
|
||||
FlattenAsmStringVariants(StringRef Cur, unsigned Variant) {
|
||||
std::string Res = "";
|
||||
|
||||
for (;;) {
|
||||
// Find the start of the next variant string.
|
||||
size_t VariantsStart = 0;
|
||||
for (size_t e = Cur.size(); VariantsStart != e; ++VariantsStart)
|
||||
if (Cur[VariantsStart] == '{' &&
|
||||
(VariantsStart == 0 || (Cur[VariantsStart-1] != '$' &&
|
||||
Cur[VariantsStart-1] != '\\')))
|
||||
break;
|
||||
|
||||
// Add the prefix to the result.
|
||||
Res += Cur.slice(0, VariantsStart);
|
||||
if (VariantsStart == Cur.size())
|
||||
break;
|
||||
|
||||
++VariantsStart; // Skip the '{'.
|
||||
|
||||
// Scan to the end of the variants string.
|
||||
size_t VariantsEnd = VariantsStart;
|
||||
unsigned NestedBraces = 1;
|
||||
for (size_t e = Cur.size(); VariantsEnd != e; ++VariantsEnd) {
|
||||
if (Cur[VariantsEnd] == '}' && Cur[VariantsEnd-1] != '\\') {
|
||||
if (--NestedBraces == 0)
|
||||
break;
|
||||
} else if (Cur[VariantsEnd] == '{')
|
||||
++NestedBraces;
|
||||
}
|
||||
|
||||
// Select the Nth variant (or empty).
|
||||
StringRef Selection = Cur.slice(VariantsStart, VariantsEnd);
|
||||
for (unsigned i = 0; i != Variant; ++i)
|
||||
Selection = Selection.split('|').second;
|
||||
Res += Selection.split('|').first;
|
||||
|
||||
assert(VariantsEnd != Cur.size() &&
|
||||
"Unterminated variants in assembly string!");
|
||||
Cur = Cur.substr(VariantsEnd + 1);
|
||||
}
|
||||
|
||||
return Res;
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user