Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(232)

Unified Diff: src/PNaClTranslator.cpp

Issue 625243002: Convert Subzero's bitcode reader to generate ICE types. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix comment. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/IceTypes.h ('K') | « src/IceTypes.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/PNaClTranslator.cpp
diff --git a/src/PNaClTranslator.cpp b/src/PNaClTranslator.cpp
index af78e2f3e802e3f29af026d6a9f3aa69d2762c20..2c5bb6530ba939407dfdf787cc3380f1640e5ef9 100644
--- a/src/PNaClTranslator.cpp
+++ b/src/PNaClTranslator.cpp
@@ -49,6 +49,74 @@ static cl::opt<bool> AllowErrorRecovery(
cl::desc("Allow error recovery when reading PNaCl bitcode."),
cl::init(false));
+// Models elements in the list of types defined in the types block.
+// These elements can be a (simple) type, or a function type
+// signature.
+class ExtendedType {
+ ExtendedType(const ExtendedType &) = delete;
+ ExtendedType &operator=(const ExtendedType &) = delete;
+
+public:
+ // Discriminator for LLVM-style RTTI.
+ enum ExtendedTypeKind { SimpleExtendedKind, FcnSigExtendedKind };
+ virtual ~ExtendedType() {}
+ ExtendedTypeKind getKind() const { return Kind; }
+ virtual void Print(Ice::Ostream &Stream) const = 0;
+
+protected:
+ explicit ExtendedType(ExtendedTypeKind Kind) : Kind(Kind) {}
+
+private:
+ ExtendedTypeKind Kind;
+};
+
+Ice::Ostream &operator<<(Ice::Ostream &Stream, const ExtendedType &Ty) {
+ Ty.Print(Stream);
+ return Stream;
+}
+
+// Models an ICE type as an extended type.
+class SimpleExtendedType : public ExtendedType {
+ SimpleExtendedType(const SimpleExtendedType &) = delete;
+ SimpleExtendedType &operator=(const SimpleExtendedType &) = delete;
+
+public:
+ explicit SimpleExtendedType(Ice::Type SimpleType)
+ : ExtendedType(SimpleExtendedKind), SimpleType(SimpleType) {}
+
+ ~SimpleExtendedType() final {}
+
+ Ice::Type getType() const { return SimpleType; }
+
+ void Print(Ice::Ostream &Stream) const final { Stream << SimpleType; }
+
+ static bool classof(const ExtendedType *Ty) {
+ return Ty->getKind() == SimpleExtendedKind;
+ }
+
+private:
+ Ice::Type SimpleType;
+};
+
+// Models a function signature as an extended type.
+class FcnSigExtendedType : public ExtendedType {
+ FcnSigExtendedType(const FcnSigExtendedType &) = delete;
+ FcnSigExtendedType &operator=(const FcnSigExtendedType &) = delete;
+
+public:
+ explicit FcnSigExtendedType(Ice::Type ReturnType)
+ : ExtendedType(FcnSigExtendedKind), FcnSig(ReturnType) {}
+ const Ice::FcnSigType &getFcnSig() const { return FcnSig; }
+ void appendArgType(Ice::Type ArgType) { FcnSig.appendArgType(ArgType); }
+ void Print(Ice::Ostream &Stream) const final { Stream << FcnSig; }
+ static bool classof(const ExtendedType *Ty) {
+ return Ty->getKind() == FcnSigExtendedKind;
+ }
+
+private:
+ Ice::FcnSigType FcnSig;
+};
+
// Top-level class to read PNaCl bitcode files, and translate to ICE.
class TopLevelParser : public NaClBitcodeParser {
TopLevelParser(const TopLevelParser &) = delete;
@@ -63,12 +131,13 @@ public:
Header(Header), TypeConverter(getLLVMContext()),
ErrorStatus(ErrorStatus), NumErrors(0), NumFunctionIds(0),
NumFunctionBlocks(0),
- GlobalVarPlaceHolderType(convertToLLVMType(Ice::IceType_i8)) {
+ GlobalVarPlaceHolderType(convertToLLVMType(Ice::IceType_i8)),
+ UndefinedFcnSigType(Ice::IceType_void) {
Mod->setDataLayout(PNaClDataLayout);
setErrStream(Translator.getContext()->getStrDump());
}
- ~TopLevelParser() override {}
+ ~TopLevelParser() override { DeleteContainerPointers(TypeIDValues); }
Jim Stichnoth 2014/10/05 15:35:47 I think that if possible, the memory allocation st
Karl 2014/10/06 21:15:54 Reorganized to no longer allocate extended types.
Ice::Translator &getTranslator() { return Translator; }
@@ -101,18 +170,40 @@ public:
void resizeTypeIDValues(unsigned NewSize) { TypeIDValues.resize(NewSize); }
/// Returns the type associated with the given index.
- Type *getTypeByID(unsigned ID) {
+ Ice::Type getTypeByID(unsigned ID) {
Jim Stichnoth 2014/10/05 15:35:47 Can this be const? I guess not because of setting
jvoung (off chromium) 2014/10/06 14:32:17 I wonder if this should be called "getSimpleTypeBy
Karl 2014/10/06 21:15:54 Done. Added constness and added qualifier to acces
+ // Note: method resizeTypeIDValues expands TypeIDValues
+ // to the specified size, and fills elements with nullptr.
+ ExtendedType *Ty = ID < TypeIDValues.size() ? TypeIDValues[ID] : nullptr;
+ if (Ty == nullptr) {
+ reportTypeIDAsUndefined(ID);
+ } else if (auto SimpleTy = dyn_cast<SimpleExtendedType>(Ty)) {
+ return SimpleTy->getType();
+ } else {
+ reportTypeIDNotSimple(ID, Ty);
+ }
+ // TODO(kschimpf) Remove error recovery once implementation complete.
+ return Ice::IceType_void;
+ }
+
+ /// Returns the type signature associated with the given index.
+ const Ice::FcnSigType &getFcnSigTypeByID(unsigned ID) {
// Note: method resizeTypeIDValues expands TypeIDValues
- // to the specified size, and fills elements with NULL.
- Type *Ty = ID < TypeIDValues.size() ? TypeIDValues[ID] : NULL;
- if (Ty)
- return Ty;
- return reportTypeIDAsUndefined(ID);
+ // to the specified size, and fills elements with nullptr.
+ ExtendedType *Ty = ID < TypeIDValues.size() ? TypeIDValues[ID] : nullptr;
+ if (Ty == nullptr) {
+ reportFcnSigTypeIDAsUndefined(ID);
+ } else if (auto SigTy = dyn_cast<FcnSigExtendedType>(Ty)) {
+ return SigTy->getFcnSig();
+ } else {
+ reportFcnSigTypeIDNotFcnSig(ID, Ty);
+ }
+ // TODO(kschimpf) Remove error recovery once implementation complete.
+ return UndefinedFcnSigType;
}
/// Defines type for ID.
- void setTypeID(unsigned ID, Type *Ty) {
- if (ID < TypeIDValues.size() && TypeIDValues[ID] == NULL) {
+ void setTypeID(unsigned ID, ExtendedType *Ty) {
+ if (ID < TypeIDValues.size() && TypeIDValues[ID] == nullptr) {
TypeIDValues[ID] = Ty;
return;
}
@@ -144,7 +235,7 @@ public:
/// Returns the LLVM IR value associatd with the global value ID.
Value *getGlobalValueByID(unsigned ID) const {
if (ID >= ValueIDValues.size())
- return NULL;
+ return nullptr;
return ValueIDValues[ID];
}
@@ -154,11 +245,11 @@ public:
// TODO(kschimpf): Can this be built when creating global initializers?
if (ID >= ValueIDConstants.size()) {
if (ID >= ValueIDValues.size())
- return NULL;
+ return nullptr;
ValueIDConstants.resize(ValueIDValues.size());
}
Ice::Constant *C = ValueIDConstants[ID];
- if (C != NULL)
+ if (C != nullptr)
return C;
Value *V = ValueIDValues[ID];
assert(isa<GlobalValue>(V));
@@ -188,7 +279,7 @@ public:
/// later.
Constant *getOrCreateGlobalVarRef(unsigned ID) {
if (ID >= ValueIDValues.size())
- return NULL;
+ return nullptr;
if (Value *C = ValueIDValues[ID])
return dyn_cast<Constant>(C);
Constant *C = new GlobalVariable(*Mod, GlobalVarPlaceHolderType, false,
@@ -204,7 +295,7 @@ public:
if (ID < NumFunctionIds || ID >= ValueIDValues.size())
return false;
WeakVH &OldV = ValueIDValues[ID];
- if (OldV == NULL) {
+ if (OldV == nullptr) {
ValueIDValues[ID] = GV;
return true;
}
@@ -234,13 +325,13 @@ public:
}
/// Returns the LLVM integer type with the given number of Bits. If
- /// Bits is not a valid PNaCl type, returns NULL.
+ /// Bits is not a valid PNaCl type, returns nullptr.
Type *getLLVMIntegerType(unsigned Bits) const {
jvoung (off chromium) 2014/10/06 14:32:17 can this be removed now?
Karl 2014/10/06 21:15:54 Removed getLLVMIntegerType and getLLVMVectorType.
jvoung (off chromium) 2014/10/07 15:54:41 Can it be removed from TypeConverter now too?
return TypeConverter.getLLVMIntegerType(Bits);
}
/// Returns the LLVM vector with the given Size and Ty. If not a
- /// valid PNaCl vector type, returns NULL.
+ /// valid PNaCl vector type, returns nullptr.
Type *getLLVMVectorType(unsigned Size, Ice::Type Ty) const {
return TypeConverter.getLLVMVectorType(Size, Ty);
}
@@ -266,7 +357,7 @@ private:
// The number of errors reported.
unsigned NumErrors;
// The types associated with each type ID.
- std::vector<Type *> TypeIDValues;
+ std::vector<ExtendedType *> TypeIDValues;
// The (global) value IDs.
std::vector<WeakVH> ValueIDValues;
// Relocatable constants associated with ValueIDValues.
@@ -281,39 +372,67 @@ private:
// Cached global variable placeholder type. Used for all forward
// references to global variable addresses.
Type *GlobalVarPlaceHolderType;
+ // Models an undefined function type signature.
+ Ice::FcnSigType UndefinedFcnSigType;
bool ParseBlock(unsigned BlockID) override;
- /// Reports that type ID is undefined, and then returns
- /// the void type.
- Type *reportTypeIDAsUndefined(unsigned ID);
+ /// Reports that type ID is undefined.
jvoung (off chromium) 2014/10/06 14:32:17 double vs triple slash consistency Clarify this i
Karl 2014/10/06 21:15:54 Simplified all type id look ups to go through one
+ void reportTypeIDAsUndefined(unsigned ID);
+
+ // Reports that type ID as not a simple type.
+ void reportTypeIDNotSimple(unsigned ID, const ExtendedType *Ty);
+
+ // Reports that type ID is undefined.
jvoung (off chromium) 2014/10/06 14:32:17 Clarify this is for function signature types?
Karl 2014/10/06 21:15:54 Removed. No longer needed.
+ void reportFcnSigTypeIDAsUndefined(unsigned ID);
+
+ // Reports that type ID is not a function signature.
+ void reportFcnSigTypeIDNotFcnSig(unsigned ID, const ExtendedType *Ty);
/// Reports error about bad call to setTypeID.
- void reportBadSetTypeID(unsigned ID, Type *Ty);
+ void reportBadSetTypeID(unsigned ID, ExtendedType *Ty);
Jim Stichnoth 2014/10/05 15:35:48 const ExtendedType * ?
Karl 2014/10/06 21:15:54 Added to reportBadTypeIDAs.
// Reports that there is no corresponding ICE type for LLVMTy, and
// returns ICE::IceType_void.
Ice::Type convertToIceTypeError(Type *LLVMTy);
};
-Type *TopLevelParser::reportTypeIDAsUndefined(unsigned ID) {
+void TopLevelParser::reportTypeIDAsUndefined(unsigned ID) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
StrBuf << "Can't find type for type id: " << ID;
Error(StrBuf.str());
- // TODO(kschimpf) Remove error recovery once implementation complete.
- Type *Ty = TypeConverter.convertToLLVMType(Ice::IceType_void);
- // To reduce error messages, update type list if possible.
- if (ID < TypeIDValues.size())
- TypeIDValues[ID] = Ty;
- return Ty;
}
-void TopLevelParser::reportBadSetTypeID(unsigned ID, Type *Ty) {
+void TopLevelParser::reportTypeIDNotSimple(unsigned ID,
+ const ExtendedType *Ty) {
+ std::string Buffer;
+ raw_string_ostream StrBuf(Buffer);
+ StrBuf << "Type id " << ID << " not simple type. Found: " << *Ty;
+ Error(StrBuf.str());
+};
+
+void TopLevelParser::reportFcnSigTypeIDAsUndefined(unsigned ID) {
+ std::string Buffer;
+ raw_string_ostream StrBuf(Buffer);
+ StrBuf << "Can't find function signature type for type id: " << ID;
+ Error(StrBuf.str());
+}
+
+void TopLevelParser::reportFcnSigTypeIDNotFcnSig(unsigned ID,
+ const ExtendedType *Ty) {
+ std::string Buffer;
+ raw_string_ostream StrBuf(Buffer);
+ StrBuf << "Type id " << ID << " not function signature type. Found:" << *Ty;
+ Error(StrBuf.str());
+}
+
+void TopLevelParser::reportBadSetTypeID(unsigned ID, ExtendedType *Ty) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
if (ID >= TypeIDValues.size()) {
- StrBuf << "Type index " << ID << " out of range: can't install.";
+ StrBuf << "Type index " << ID
+ << " out of range. Can't install type: " << Ty;
} else {
// Must be case that index already defined.
StrBuf << "Type index " << ID << " defined as " << *TypeIDValues[ID]
@@ -380,7 +499,7 @@ protected:
const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
if (Values.size() == Size)
return true;
- ReportRecordSizeError(Size, RecordName, NULL);
+ ReportRecordSizeError(Size, RecordName, nullptr);
return false;
}
@@ -418,7 +537,7 @@ protected:
private:
/// Generates a record size error. ExpectedSize is the number
/// of elements expected. RecordName is the name of the kind of
- /// record that has incorrect size. ContextMessage (if not NULL)
+ /// record that has incorrect size. ContextMessage (if not nullptr)
/// is appended to "record expects" to describe how ExpectedSize
/// should be interpreted.
void ReportRecordSizeError(unsigned ExpectedSize, const char *RecordName,
@@ -477,7 +596,7 @@ private:
};
void TypesParser::ProcessRecord() {
- Type *Ty = NULL;
+ ExtendedType *Ty = nullptr;
const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
switch (Record.GetCode()) {
case naclbitc::TYPE_CODE_NUMENTRY:
@@ -490,49 +609,98 @@ void TypesParser::ProcessRecord() {
// VOID
if (!isValidRecordSize(0, "Type void"))
return;
- Ty = Context->convertToLLVMType(Ice::IceType_void);
+ Ty = new SimpleExtendedType(Ice::IceType_void);
break;
case naclbitc::TYPE_CODE_FLOAT:
// FLOAT
if (!isValidRecordSize(0, "Type float"))
return;
- Ty = Context->convertToLLVMType(Ice::IceType_f32);
+ Ty = new SimpleExtendedType(Ice::IceType_f32);
break;
case naclbitc::TYPE_CODE_DOUBLE:
// DOUBLE
if (!isValidRecordSize(0, "Type double"))
return;
- Ty = Context->convertToLLVMType(Ice::IceType_f64);
+ Ty = new SimpleExtendedType(Ice::IceType_f64);
break;
case naclbitc::TYPE_CODE_INTEGER:
// INTEGER: [width]
if (!isValidRecordSize(1, "Type integer"))
return;
- Ty = Context->getLLVMIntegerType(Values[0]);
- if (Ty == NULL) {
+ switch (Values[0]) {
+ case 1:
+ Ty = new SimpleExtendedType(Ice::IceType_i1);
+ break;
+ case 8:
+ Ty = new SimpleExtendedType(Ice::IceType_i8);
+ break;
+ case 16:
+ Ty = new SimpleExtendedType(Ice::IceType_i16);
+ break;
+ case 32:
+ Ty = new SimpleExtendedType(Ice::IceType_i32);
+ break;
+ case 64:
+ Ty = new SimpleExtendedType(Ice::IceType_i64);
+ break;
+ default:
+ break;
+ }
+ if (Ty == nullptr) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
StrBuf << "Type integer record with invalid bitsize: " << Values[0];
Error(StrBuf.str());
- // TODO(kschimpf) Remove error recovery once implementation complete.
- // Fix type so that we can continue.
- Ty = Context->convertToLLVMType(Ice::IceType_i32);
}
break;
case naclbitc::TYPE_CODE_VECTOR: {
// VECTOR: [numelts, eltty]
if (!isValidRecordSize(2, "Type vector"))
return;
- Type *BaseTy = Context->getTypeByID(Values[1]);
- Ty = Context->getLLVMVectorType(Values[0],
jvoung (off chromium) 2014/10/06 14:32:17 can getLLVMVectorType be removed now?
Karl 2014/10/06 21:15:54 Done.
- Context->convertToIceType(BaseTy));
- if (Ty == NULL) {
+ Ice::Type BaseTy = Context->getTypeByID(Values[1]);
+ Ice::SizeT Size = Values[0];
+ switch (BaseTy) {
+ case Ice::IceType_i1:
+ switch (Size) {
+ case 4:
+ Ty = new SimpleExtendedType(Ice::IceType_v4i1);
+ break;
+ case 8:
+ Ty = new SimpleExtendedType(Ice::IceType_v8i1);
+ break;
+ case 16:
+ Ty = new SimpleExtendedType(Ice::IceType_v16i1);
+ break;
+ default:
+ break;
+ }
+ break;
+ case Ice::IceType_i8:
+ if (Size == 16)
+ Ty = new SimpleExtendedType(Ice::IceType_v16i8);
+ break;
+ case Ice::IceType_i16:
+ if (Size == 8)
+ Ty = new SimpleExtendedType(Ice::IceType_v8i16);
+ break;
+ case Ice::IceType_i32:
+ if (Size == 4)
+ Ty = new SimpleExtendedType(Ice::IceType_v4i32);
+ break;
+ case Ice::IceType_f32:
+ if (Size == 4)
+ Ty = new SimpleExtendedType(Ice::IceType_v4f32);
+ break;
+ default:
+ break;
+ }
+
+ if (Ty == nullptr) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
- StrBuf << "Invalid type vector record: <" << Values[0] << " x " << *BaseTy
+ StrBuf << "Invalid type vector record: <" << Values[0] << " x " << BaseTy
<< ">";
Error(StrBuf.str());
- Ty = Context->convertToLLVMType(Ice::IceType_void);
}
break;
}
@@ -540,11 +708,26 @@ void TypesParser::ProcessRecord() {
// FUNCTION: [vararg, retty, paramty x N]
if (!isValidRecordSizeAtLeast(2, "Type signature"))
return;
- SmallVector<Type *, 8> ArgTys;
+ if (Values[0])
+ Error("Function type can't define varargs");
+ FcnSigExtendedType *FcnTy =
+ new FcnSigExtendedType(Context->getTypeByID(Values[1]));
for (unsigned i = 2, e = Values.size(); i != e; ++i) {
- ArgTys.push_back(Context->getTypeByID(Values[i]));
+ // Check that type void not used as argument type.
+ // Note: PNaCl restrictions can't be checked until we
+ // know the name, because we have to check for intrinsic signatures.
+ Ice::Type ArgTy = Context->getTypeByID(Values[i]);
+ if (ArgTy == Ice::IceType_void) {
+ std::string Buffer;
+ raw_string_ostream StrBuf(Buffer);
+ StrBuf << "Type for parameter " << (i - 1)
+ << " not valid. Found: " << ArgTy;
+ // TODO(kschimpf) Remove error recovery once implementation complete.
+ ArgTy = Ice::IceType_i32;
+ }
+ FcnTy->appendArgType(ArgTy);
}
- Ty = FunctionType::get(Context->getTypeByID(Values[1]), ArgTys, Values[0]);
+ Ty = FcnTy;
break;
}
default:
@@ -552,8 +735,10 @@ void TypesParser::ProcessRecord() {
return;
}
// If Ty not defined, assume error. Use void as filler.
- if (Ty == NULL)
- Ty = Context->convertToLLVMType(Ice::IceType_void);
+ // TODO(kschimpf) Remove error recovery once implementation complete.
+ // Fix type so that we can continue.
+ if (Ty == nullptr)
+ Ty = new SimpleExtendedType(Ice::IceType_void);
Context->setTypeID(NextTypeId++, Ty);
}
@@ -636,7 +821,7 @@ private:
// installs a global variable (with the initializers) into the list
// of ValueIDs.
void installGlobalVar() {
- Constant *Init = NULL;
+ Constant *Init = nullptr;
switch (Initializers.size()) {
case 0:
Error("No initializer for global variable in global vars block");
@@ -740,7 +925,7 @@ void GlobalsParser::ProcessRecord() {
if (!isValidRecordSizeInRange(1, 2, "Globals reloc"))
return;
Constant *BaseVal = Context->getOrCreateGlobalVarRef(Values[0]);
- if (BaseVal == NULL) {
+ if (BaseVal == nullptr) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
StrBuf << "Can't find global relocation value: " << Values[0];
@@ -956,7 +1141,7 @@ private:
uint32_t LocalIndex = NextLocalInstIndex - CachedNumGlobalValueIDs;
if (LocalIndex < LocalOperands.size()) {
Ice::Operand *Op = LocalOperands[LocalIndex];
- if (Op != NULL) {
+ if (Op != nullptr) {
if (Ice::Variable *Var = dyn_cast<Ice::Variable>(Op)) {
if (Var->getType() == Ty) {
++NextLocalInstIndex;
@@ -1007,7 +1192,7 @@ private:
report_fatal_error("Unable to continue");
}
Ice::Operand *Op = LocalOperands[LocalIndex];
- if (Op == NULL) {
+ if (Op == nullptr) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
StrBuf << "Value index " << Index << " not defined!";
@@ -1033,7 +1218,7 @@ private:
// If element not defined, set it.
Ice::Operand *OldOp = LocalOperands[LocalIndex];
- if (OldOp == NULL) {
+ if (OldOp == nullptr) {
LocalOperands[LocalIndex] = Op;
return;
}
@@ -1473,7 +1658,7 @@ void FunctionParser::ProcessRecord() {
if (!isValidRecordSize(3, "function block cast"))
return;
Ice::Operand *Src = getRelativeOperand(Values[0], BaseIndex);
- Type *CastType = Context->getTypeByID(Values[1]);
+ Ice::Type CastType = Context->getTypeByID(Values[1]);
Instruction::CastOps LLVMCastOp;
Ice::InstCast::OpKind CastKind;
if (!naclbitc::DecodeCastOpcode(Values[2], LLVMCastOp) ||
@@ -1484,18 +1669,18 @@ void FunctionParser::ProcessRecord() {
Error(StrBuf.str());
return;
}
- Type *SrcType = Context->convertToLLVMType(Src->getType());
- if (!CastInst::castIsValid(LLVMCastOp, SrcType, CastType)) {
+ Ice::Type SrcType = Src->getType();
+ if (!CastInst::castIsValid(LLVMCastOp, Context->convertToLLVMType(SrcType),
+ Context->convertToLLVMType(CastType))) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
StrBuf << "Illegal cast: " << Instruction::getOpcodeName(LLVMCastOp)
- << " " << *SrcType << " to " << *CastType;
+ << " " << SrcType << " to " << CastType;
Error(StrBuf.str());
return;
}
- CurrentNode->appendInst(Ice::InstCast::create(
- Func, CastKind, getNextInstVar(Context->convertToIceType(CastType)),
- Src));
+ CurrentNode->appendInst(
+ Ice::InstCast::create(Func, CastKind, getNextInstVar(CastType), Src));
break;
}
case naclbitc::FUNC_CODE_INST_VSELECT: {
@@ -1678,7 +1863,7 @@ void FunctionParser::ProcessRecord() {
if (Values.size() == 1) {
// BR: [bb#]
Ice::CfgNode *Block = getBranchBasicBlock(Values[0]);
- if (Block == NULL)
+ if (Block == nullptr)
return;
CurrentNode->appendInst(Ice::InstBr::create(Func, Block));
} else {
@@ -1696,7 +1881,7 @@ void FunctionParser::ProcessRecord() {
}
Ice::CfgNode *ThenBlock = getBranchBasicBlock(Values[0]);
Ice::CfgNode *ElseBlock = getBranchBasicBlock(Values[1]);
- if (ThenBlock == NULL || ElseBlock == NULL)
+ if (ThenBlock == nullptr || ElseBlock == nullptr)
return;
CurrentNode->appendInst(
Ice::InstBr::create(Func, Cond, ThenBlock, ElseBlock));
@@ -1715,8 +1900,7 @@ void FunctionParser::ProcessRecord() {
// already frozen when the problem was noticed.
if (!isValidRecordSizeAtLeast(4, "function block switch"))
return;
- Ice::Type CondTy =
- Context->convertToIceType(Context->getTypeByID(Values[0]));
+ Ice::Type CondTy = Context->getTypeByID(Values[0]);
if (!Ice::isScalarIntegerType(CondTy)) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
@@ -1784,7 +1968,7 @@ void FunctionParser::ProcessRecord() {
Error(StrBuf.str());
return;
}
- Ice::Type Ty = Context->convertToIceType(Context->getTypeByID(Values[0]));
+ Ice::Type Ty = Context->getTypeByID(Values[0]);
if (Ty == Ice::IceType_void) {
Error("Phi record using type void not allowed");
return;
@@ -1835,7 +2019,7 @@ void FunctionParser::ProcessRecord() {
return;
unsigned Alignment;
extractAlignment("Load", Values[1], Alignment);
- Ice::Type Ty = Context->convertToIceType(Context->getTypeByID(Values[2]));
+ Ice::Type Ty = Context->getTypeByID(Values[2]);
if (!isValidLoadStoreAlignment(Alignment, Ty, "Load"))
return;
CurrentNode->appendInst(
@@ -1897,11 +2081,11 @@ void FunctionParser::ProcessRecord() {
uint32_t CalleeIndex = convertRelativeToAbsIndex(Values[1], BaseIndex);
Ice::Operand *Callee = getOperand(CalleeIndex);
Ice::Type ReturnType = Ice::IceType_void;
- const Ice::Intrinsics::FullIntrinsicInfo *IntrinsicInfo = NULL;
+ const Ice::Intrinsics::FullIntrinsicInfo *IntrinsicInfo = nullptr;
if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) {
Function *Fcn =
dyn_cast<Function>(Context->getGlobalValueByID(CalleeIndex));
- if (Fcn == NULL) {
+ if (Fcn == nullptr) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
StrBuf << "Function call to non-function: " << *Callee;
@@ -1928,14 +2112,15 @@ void FunctionParser::ProcessRecord() {
}
}
} else {
- ReturnType = Context->convertToIceType(Context->getTypeByID(Values[2]));
+ ReturnType = Context->getTypeByID(Values[2]);
}
// Create the call instruction.
- Ice::Variable *Dest =
- (ReturnType == Ice::IceType_void) ? NULL : getNextInstVar(ReturnType);
+ Ice::Variable *Dest = (ReturnType == Ice::IceType_void)
+ ? nullptr
+ : getNextInstVar(ReturnType);
Ice::SizeT NumParams = Values.size() - ParamsStartIndex;
- Ice::InstCall *Inst = NULL;
+ Ice::InstCall *Inst = nullptr;
if (IntrinsicInfo) {
Inst =
Ice::InstIntrinsicCall::create(Func, NumParams, Dest, Callee,
@@ -1999,8 +2184,7 @@ void FunctionParser::ProcessRecord() {
// FORWARDTYPEREF: [opval, ty]
if (!isValidRecordSize(2, "function block forward type ref"))
return;
- setOperand(Values[0], createInstVar(Context->convertToIceType(
- Context->getTypeByID(Values[1]))));
+ setOperand(Values[0], createInstVar(Context->getTypeByID(Values[1])));
break;
}
default:
@@ -2049,8 +2233,7 @@ void ConstantsParser::ProcessRecord() {
// SETTYPE: [typeid]
if (!isValidRecordSize(1, "constants block set type"))
return;
- NextConstantType =
- Context->convertToIceType(Context->getTypeByID(Values[0]));
+ NextConstantType = Context->getTypeByID(Values[0]);
if (NextConstantType == Ice::IceType_void)
Error("constants block set type not allowed for void type");
return;
@@ -2255,7 +2438,7 @@ private:
void ModuleValuesymtabParser::setValueName(uint64_t Index, StringType &Name) {
Value *V = Context->getGlobalValueByID(Index);
- if (V == NULL) {
+ if (V == nullptr) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
StrBuf << "Invalid global address ID in valuesymtab: " << Index;
@@ -2319,15 +2502,7 @@ void ModuleParser::ProcessRecord() {
// FUNCTION: [type, callingconv, isproto, linkage]
if (!isValidRecordSize(4, "Function heading"))
return;
- Type *Ty = Context->getTypeByID(Values[0]);
- FunctionType *FTy = dyn_cast<FunctionType>(Ty);
- if (FTy == NULL) {
- std::string Buffer;
- raw_string_ostream StrBuf(Buffer);
- StrBuf << "Function heading expects function type. Found: " << Ty;
- Error(StrBuf.str());
- return;
- }
+ const Ice::FcnSigType &Ty = Context->getFcnSigTypeByID(Values[0]);
CallingConv::ID CallingConv;
if (!naclbitc::DecodeCallingConv(Values[1], CallingConv)) {
std::string Buffer;
@@ -2345,7 +2520,14 @@ void ModuleParser::ProcessRecord() {
Error(StrBuf.str());
return;
}
- Function *Func = Function::Create(FTy, Linkage, "", Context->getModule());
+ SmallVector<Type *, 8> ArgTys;
+ for (Ice::Type ArgType : Ty.getArgList()) {
+ ArgTys.push_back(Context->convertToLLVMType(ArgType));
+ }
+ Function *Func = Function::Create(
+ FunctionType::get(Context->convertToLLVMType(Ty.getReturnType()),
+ ArgTys, false),
+ Linkage, "", Context->getModule());
Func->setCallingConv(CallingConv);
if (Values[2] == 0)
Context->setNextValueIDAsImplementedFunction();
« src/IceTypes.h ('K') | « src/IceTypes.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698