Redesign the BuiltinFunctionRefInst to contain an Identifier instead of

a FuncDecl.  This makes it much more straight-forward for SIL passes to
introduce a new one - without doing name lookup in the builtin module!



Swift SVN r10694
This commit is contained in:
Chris Lattner
2013-11-30 01:49:36 +00:00
parent a5cf0fa60a
commit ad05efc481
18 changed files with 98 additions and 93 deletions

View File

@@ -371,11 +371,11 @@ SILGlobalAddrInst::SILGlobalAddrInst(SILLocation Loc, SILGlobalVariable *Global)
{}
const IntrinsicInfo &BuiltinFunctionRefInst::getIntrinsicInfo() const {
return getModule().getIntrinsicInfo(Function->getName());
return getModule().getIntrinsicInfo(getName());
}
const BuiltinInfo &BuiltinFunctionRefInst::getBuiltinInfo() const {
return getModule().getBuiltinInfo(Function->getName());
return getModule().getBuiltinInfo(getName());
}
static unsigned getWordsForBitWidth(unsigned bits) {

View File

@@ -42,7 +42,36 @@ struct ID {
unsigned Number;
int ResultNumber;
};
static void printEscapedString(raw_ostream &OS, StringRef value) {
OS << '"';
for (auto C : value) {
switch (C) {
case '\\': OS << "\\\\"; break;
case '\t': OS << "\\t"; break;
case '\n': OS << "\\n"; break;
case '\r': OS << "\\r"; break;
case '"': OS << "\\\""; break;
case '\'': OS << '\''; break; // no need to escape these
case '\0': OS << "\\0"; break;
default:
auto c = (unsigned char)C;
// Other ASCII control characters should get escaped.
if (c < 0x20) {
static const char hexdigit[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G'
};
OS << "\\x" << hexdigit[c >> 4] << hexdigit[c & 0xF];
} else {
OS << c;
}
break;
}
}
OS << '"';
}
enum SILColorKind {
SC_Type,
};
@@ -555,8 +584,9 @@ public:
}
void visitBuiltinFunctionRefInst(BuiltinFunctionRefInst *BFI) {
OS << "builtin_function_ref " << SILDeclRef(BFI->getReferencedFunction())
<< " : " << BFI->getType();
OS << "builtin_function_ref ";
printEscapedString(OS, BFI->getName().str());
OS << " : " << BFI->getType();
}
void visitGlobalAddrInst(GlobalAddrInst *GAI) {
@@ -583,34 +613,8 @@ public:
OS << " // " << decimal;
}
void visitStringLiteralInst(StringLiteralInst *SLI) {
OS << "string_literal \"";
auto value = SLI->getValue();
for (size_t i = 0, e = value.size(); i != e; ++i) {
switch (value[i]) {
case '\\': OS << "\\\\"; break;
case '\t': OS << "\\t"; break;
case '\n': OS << "\\n"; break;
case '\r': OS << "\\r"; break;
case '"': OS << "\\\""; break;
case '\'': OS << '\''; break; // no need to escape these
case '\0': OS << "\\0"; break;
default:
auto c = (unsigned char) value[i];
// Other ASCII control characters should get escaped.
if (c < 0x20) {
static const char hexdigit[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G'
};
OS << "\\x" << hexdigit[c >> 4] << hexdigit[c & 0xF];
} else {
OS << c;
}
break;
}
}
OS << "\"";
OS << "string_literal ";
printEscapedString(OS, SLI->getValue());
}
void visitLoadInst(LoadInst *LI) {
OS << "load " << getIDAndType(LI->getOperand());

View File

@@ -366,8 +366,6 @@ public:
}
void checkBuiltinFunctionRefInst(BuiltinFunctionRefInst *BFI) {
require(isa<BuiltinModule>(BFI->getReferencedFunction()->getDeclContext()),
"builtin_function_ref must refer to a function in the Builtin module");
auto fnType = requireObjectType(SILFunctionType, BFI,
"result of builtin_function_ref");
require(fnType->isThin(),