diff options
Diffstat (limited to 'clang/utils/TableGen')
| -rw-r--r-- | clang/utils/TableGen/MveEmitter.cpp | 40 |
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) |

