summaryrefslogtreecommitdiffstats
path: root/clang/utils/TableGen
diff options
context:
space:
mode:
Diffstat (limited to 'clang/utils/TableGen')
-rw-r--r--clang/utils/TableGen/MveEmitter.cpp40
1 files changed, 32 insertions, 8 deletions
diff --git a/clang/utils/TableGen/MveEmitter.cpp b/clang/utils/TableGen/MveEmitter.cpp
index ddec171d671..aa3b475ea7b 100644
--- a/clang/utils/TableGen/MveEmitter.cpp
+++ b/clang/utils/TableGen/MveEmitter.cpp
@@ -204,6 +204,9 @@ public:
Name = "const " + Name;
return Name + " *";
}
+ std::string llvmName() const override {
+ return "llvm::PointerType::getUnqual(" + Pointee->llvmName() + ")";
+ }
static bool classof(const Type *T) {
return T->typeKind() == TypeKind::Pointer;
@@ -512,6 +515,11 @@ public:
void setVarname(const StringRef s) { VarName = s; }
bool varnameUsed() const { return VarNameUsed; }
+ // Emit code to generate this result as a Value *.
+ virtual std::string asValue() {
+ return varname();
+ }
+
// Code generation happens in multiple passes. This method tracks whether a
// Result has yet been visited in a given pass, without the need for a
// tedious loop in between passes that goes through and resets a 'visited'
@@ -547,6 +555,12 @@ public:
std::string typeName() const override {
return AddressType ? "Address" : Result::typeName();
}
+ // Emit code to generate this result as a Value *.
+ std::string asValue() override {
+ if (AddressType)
+ return "(" + varname() + ".getPointer())";
+ return Result::asValue();
+ }
};
// Result subclass for an integer literal appearing in Tablegen. This may need
@@ -665,7 +679,7 @@ public:
OS << "), llvm::SmallVector<Value *, " << Args.size() << "> {";
const char *Sep = "";
for (auto Arg : Args) {
- OS << Sep << Arg->varname();
+ OS << Sep << Arg->asValue();
Sep = ", ";
}
OS << "})";
@@ -974,17 +988,15 @@ const Type *MveEmitter::getType(DagInit *D, const Type *Param) {
return getPointerType(Pointee, Op->getValueAsBit("const"));
}
- if (Op->isSubClassOf("CTO_Sign")) {
- const ScalarType *ST = cast<ScalarType>(getType(D->getArg(0), Param));
- ScalarTypeKind NewKind = Op->getValueAsBit("signed")
- ? ScalarTypeKind::SignedInt
- : ScalarTypeKind::UnsignedInt;
+ if (Op->getName() == "CTO_CopyKind") {
+ const ScalarType *STSize = cast<ScalarType>(getType(D->getArg(0), Param));
+ const ScalarType *STKind = cast<ScalarType>(getType(D->getArg(1), Param));
for (const auto &kv : ScalarTypes) {
const ScalarType *RT = kv.second.get();
- if (RT->kind() == NewKind && RT->sizeInBits() == ST->sizeInBits())
+ if (RT->kind() == STKind->kind() && RT->sizeInBits() == STSize->sizeInBits())
return RT;
}
- PrintFatalError("Cannot change sign of this type");
+ PrintFatalError("Cannot find a type to satisfy CopyKind");
}
PrintFatalError("Bad operator in type dag expression");
@@ -1025,6 +1037,18 @@ Result::Ptr MveEmitter::getCodeForDag(DagInit *D, const Result::Scope &Scope,
}
}
PrintFatalError("Unsupported type cast");
+ } else if (Op->getName() == "unsignedflag") {
+ if (D->getNumArgs() != 1)
+ PrintFatalError("unsignedflag should have exactly one argument");
+ Record *TypeRec = cast<DefInit>(D->getArg(0))->getDef();
+ if (!TypeRec->isSubClassOf("Type"))
+ PrintFatalError("unsignedflag's argument should be a type");
+ if (const auto *ST = dyn_cast<ScalarType>(getType(TypeRec, Param))) {
+ return std::make_shared<IntLiteralResult>(
+ getScalarType("u32"), ST->kind() == ScalarTypeKind::UnsignedInt);
+ } else {
+ PrintFatalError("unsignedflag's argument should be a scalar type");
+ }
} else {
std::vector<Result::Ptr> Args;
for (unsigned i = 0, e = D->getNumArgs(); i < e; ++i)
OpenPOWER on IntegriCloud