mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
TableGen: Allow implicit casting between string and code
Summary: Perhaps the distinction between the two should be removed entirely in the long term, and the [{ ... }] syntax should just be a convenient way of writing multi-line strings. In the meantime, a lot of existing .td files are quite relaxed about string vs. code, and this change allows switching on more consistent type checks without breaking those. Change-Id: If85e3e04469e41b58e2703b62ac0032d2711713c Reviewers: arsenm, craig.topper, tra, MartinO Subscribers: wdng, llvm-commits Differential Revision: https://reviews.llvm.org/D43557 llvm-svn: 325799
This commit is contained in:
parent
8676dbafd2
commit
c16d749544
@ -141,6 +141,8 @@ public:
|
||||
static CodeRecTy *get() { return &Shared; }
|
||||
|
||||
std::string getAsString() const override { return "code"; }
|
||||
|
||||
bool typeIsConvertibleTo(const RecTy *RHS) const override;
|
||||
};
|
||||
|
||||
/// 'int' - Represent an integer value of no particular size
|
||||
@ -176,6 +178,8 @@ public:
|
||||
static StringRecTy *get() { return &Shared; }
|
||||
|
||||
std::string getAsString() const override;
|
||||
|
||||
bool typeIsConvertibleTo(const RecTy *RHS) const override;
|
||||
};
|
||||
|
||||
/// 'list<Ty>' - Represent a list of values, all of which must be of
|
||||
|
@ -97,10 +97,20 @@ bool IntRecTy::typeIsConvertibleTo(const RecTy *RHS) const {
|
||||
return kind==BitRecTyKind || kind==BitsRecTyKind || kind==IntRecTyKind;
|
||||
}
|
||||
|
||||
bool CodeRecTy::typeIsConvertibleTo(const RecTy *RHS) const {
|
||||
RecTyKind Kind = RHS->getRecTyKind();
|
||||
return Kind == CodeRecTyKind || Kind == StringRecTyKind;
|
||||
}
|
||||
|
||||
std::string StringRecTy::getAsString() const {
|
||||
return "string";
|
||||
}
|
||||
|
||||
bool StringRecTy::typeIsConvertibleTo(const RecTy *RHS) const {
|
||||
RecTyKind Kind = RHS->getRecTyKind();
|
||||
return Kind == StringRecTyKind || Kind == CodeRecTyKind;
|
||||
}
|
||||
|
||||
std::string ListRecTy::getAsString() const {
|
||||
return "list<" + Ty->getAsString() + ">";
|
||||
}
|
||||
@ -433,6 +443,8 @@ StringInit *StringInit::get(StringRef V) {
|
||||
Init *StringInit::convertInitializerTo(RecTy *Ty) const {
|
||||
if (isa<StringRecTy>(Ty))
|
||||
return const_cast<StringInit *>(this);
|
||||
if (isa<CodeRecTy>(Ty))
|
||||
return CodeInit::get(getValue());
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
@ -440,6 +452,8 @@ Init *StringInit::convertInitializerTo(RecTy *Ty) const {
|
||||
Init *CodeInit::convertInitializerTo(RecTy *Ty) const {
|
||||
if (isa<CodeRecTy>(Ty))
|
||||
return const_cast<CodeInit *>(this);
|
||||
if (isa<StringRecTy>(Ty))
|
||||
return StringInit::get(getValue());
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
23
test/TableGen/code.td
Normal file
23
test/TableGen/code.td
Normal file
@ -0,0 +1,23 @@
|
||||
// RUN: llvm-tblgen %s | FileCheck %s
|
||||
// XFAIL: vg_leak
|
||||
|
||||
// CHECK: --- Defs ---
|
||||
|
||||
// TODO: Both of these should result in CodeInits, i.e. print [{...}].
|
||||
// CHECK: def A0 {
|
||||
// CHECK: code Code = "Simple";
|
||||
// CHECK: }
|
||||
|
||||
// CHECK: def B0 {
|
||||
// CHECK: code Code = "With paste 7";
|
||||
// CHECK: }
|
||||
|
||||
class A<code c> {
|
||||
code Code = c;
|
||||
}
|
||||
|
||||
def A0 : A<"Simple">;
|
||||
|
||||
class B<int i> : A<"With paste " # i>;
|
||||
|
||||
def B0 : B<7>;
|
Loading…
Reference in New Issue
Block a user