[NFC][clang] Move simplifyConstraint to TargetInfo.cpp
This commit is contained in:
parent
d6fae7f921
commit
2da6e6536d
@ -1259,6 +1259,10 @@ public:
|
|||||||
ArrayRef<ConstraintInfo> OutputConstraints,
|
ArrayRef<ConstraintInfo> OutputConstraints,
|
||||||
unsigned &Index) const;
|
unsigned &Index) const;
|
||||||
|
|
||||||
|
std::string
|
||||||
|
simplifyConstraint(StringRef Constraint,
|
||||||
|
SmallVectorImpl<ConstraintInfo> *OutCons = nullptr) const;
|
||||||
|
|
||||||
// Constraint parm will be left pointing at the last character of
|
// Constraint parm will be left pointing at the last character of
|
||||||
// the constraint. In practice, it won't be changed unless the
|
// the constraint. In practice, it won't be changed unless the
|
||||||
// constraint is longer than one character.
|
// constraint is longer than one character.
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "clang/Basic/LangOptions.h"
|
#include "clang/Basic/LangOptions.h"
|
||||||
#include "llvm/ADT/APFloat.h"
|
#include "llvm/ADT/APFloat.h"
|
||||||
#include "llvm/ADT/STLExtras.h"
|
#include "llvm/ADT/STLExtras.h"
|
||||||
|
#include "llvm/ADT/StringExtras.h"
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
#include "llvm/TargetParser/TargetParser.h"
|
#include "llvm/TargetParser/TargetParser.h"
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
@ -1034,3 +1035,51 @@ void TargetInfo::copyAuxTarget(const TargetInfo *Aux) {
|
|||||||
auto *Src = static_cast<const TransferrableTargetInfo*>(Aux);
|
auto *Src = static_cast<const TransferrableTargetInfo*>(Aux);
|
||||||
*Target = *Src;
|
*Target = *Src;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
TargetInfo::simplifyConstraint(StringRef Constraint,
|
||||||
|
SmallVectorImpl<ConstraintInfo> *OutCons) const {
|
||||||
|
std::string Result;
|
||||||
|
|
||||||
|
for (const char *I = Constraint.begin(), *E = Constraint.end(); I < E; I++) {
|
||||||
|
switch (*I) {
|
||||||
|
default:
|
||||||
|
Result += convertConstraint(I);
|
||||||
|
break;
|
||||||
|
// Ignore these
|
||||||
|
case '*':
|
||||||
|
case '?':
|
||||||
|
case '!':
|
||||||
|
case '=': // Will see this and the following in mult-alt constraints.
|
||||||
|
case '+':
|
||||||
|
break;
|
||||||
|
case '#': // Ignore the rest of the constraint alternative.
|
||||||
|
while (I + 1 != E && I[1] != ',')
|
||||||
|
I++;
|
||||||
|
break;
|
||||||
|
case '&':
|
||||||
|
case '%':
|
||||||
|
Result += *I;
|
||||||
|
while (I + 1 != E && I[1] == *I)
|
||||||
|
I++;
|
||||||
|
break;
|
||||||
|
case ',':
|
||||||
|
Result += "|";
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
Result += "imr";
|
||||||
|
break;
|
||||||
|
case '[': {
|
||||||
|
assert(OutCons &&
|
||||||
|
"Must pass output names to constraints with a symbolic name");
|
||||||
|
unsigned Index;
|
||||||
|
bool ResolveResult = resolveSymbolicName(I, *OutCons, Index);
|
||||||
|
assert(ResolveResult && "Could not resolve symbolic name");
|
||||||
|
(void)ResolveResult;
|
||||||
|
Result += llvm::utostr(Index);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
@ -2454,56 +2454,6 @@ void CodeGenFunction::EmitSwitchStmt(const SwitchStmt &S) {
|
|||||||
CaseRangeBlock = SavedCRBlock;
|
CaseRangeBlock = SavedCRBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string
|
|
||||||
SimplifyConstraint(const char *Constraint, const TargetInfo &Target,
|
|
||||||
SmallVectorImpl<TargetInfo::ConstraintInfo> *OutCons=nullptr) {
|
|
||||||
std::string Result;
|
|
||||||
|
|
||||||
while (*Constraint) {
|
|
||||||
switch (*Constraint) {
|
|
||||||
default:
|
|
||||||
Result += Target.convertConstraint(Constraint);
|
|
||||||
break;
|
|
||||||
// Ignore these
|
|
||||||
case '*':
|
|
||||||
case '?':
|
|
||||||
case '!':
|
|
||||||
case '=': // Will see this and the following in mult-alt constraints.
|
|
||||||
case '+':
|
|
||||||
break;
|
|
||||||
case '#': // Ignore the rest of the constraint alternative.
|
|
||||||
while (Constraint[1] && Constraint[1] != ',')
|
|
||||||
Constraint++;
|
|
||||||
break;
|
|
||||||
case '&':
|
|
||||||
case '%':
|
|
||||||
Result += *Constraint;
|
|
||||||
while (Constraint[1] && Constraint[1] == *Constraint)
|
|
||||||
Constraint++;
|
|
||||||
break;
|
|
||||||
case ',':
|
|
||||||
Result += "|";
|
|
||||||
break;
|
|
||||||
case 'g':
|
|
||||||
Result += "imr";
|
|
||||||
break;
|
|
||||||
case '[': {
|
|
||||||
assert(OutCons &&
|
|
||||||
"Must pass output names to constraints with a symbolic name");
|
|
||||||
unsigned Index;
|
|
||||||
bool result = Target.resolveSymbolicName(Constraint, *OutCons, Index);
|
|
||||||
assert(result && "Could not resolve symbolic name"); (void)result;
|
|
||||||
Result += llvm::utostr(Index);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Constraint++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// AddVariableConstraints - Look at AsmExpr and if it is a variable declared
|
/// AddVariableConstraints - Look at AsmExpr and if it is a variable declared
|
||||||
/// as using a particular register add that as a constraint that will be used
|
/// as using a particular register add that as a constraint that will be used
|
||||||
/// in this asm stmt.
|
/// in this asm stmt.
|
||||||
@ -2882,8 +2832,8 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
|
|||||||
|
|
||||||
// Simplify the output constraint.
|
// Simplify the output constraint.
|
||||||
std::string OutputConstraint(S.getOutputConstraint(i));
|
std::string OutputConstraint(S.getOutputConstraint(i));
|
||||||
OutputConstraint = SimplifyConstraint(OutputConstraint.c_str() + 1,
|
OutputConstraint = getTarget().simplifyConstraint(
|
||||||
getTarget(), &OutputConstraintInfos);
|
OutputConstraint.c_str() + 1, &OutputConstraintInfos);
|
||||||
|
|
||||||
const Expr *OutExpr = S.getOutputExpr(i);
|
const Expr *OutExpr = S.getOutputExpr(i);
|
||||||
OutExpr = OutExpr->IgnoreParenNoopCasts(getContext());
|
OutExpr = OutExpr->IgnoreParenNoopCasts(getContext());
|
||||||
@ -3045,8 +2995,8 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
|
|||||||
|
|
||||||
// Simplify the input constraint.
|
// Simplify the input constraint.
|
||||||
std::string InputConstraint(S.getInputConstraint(i));
|
std::string InputConstraint(S.getInputConstraint(i));
|
||||||
InputConstraint = SimplifyConstraint(InputConstraint.c_str(), getTarget(),
|
InputConstraint = getTarget().simplifyConstraint(InputConstraint.c_str(),
|
||||||
&OutputConstraintInfos);
|
&OutputConstraintInfos);
|
||||||
|
|
||||||
InputConstraint = AddVariableConstraints(
|
InputConstraint = AddVariableConstraints(
|
||||||
InputConstraint, *InputExpr->IgnoreParenNoopCasts(getContext()),
|
InputConstraint, *InputExpr->IgnoreParenNoopCasts(getContext()),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user