Home | History | Annotate | Download | only in src
      1 //===- subzero/src/PNaClTranslator.cpp - ICE from bitcode -----------------===//
      2 //
      3 //                        The Subzero Code Generator
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 ///
     10 /// \file
     11 /// \brief Implements the interface for translation from PNaCl bitcode files to
     12 /// ICE to machine code.
     13 ///
     14 //===----------------------------------------------------------------------===//
     15 
     16 #include "PNaClTranslator.h"
     17 
     18 #include "IceCfg.h"
     19 #include "IceCfgNode.h"
     20 #include "IceClFlags.h"
     21 #include "IceDefs.h"
     22 #include "IceGlobalInits.h"
     23 #include "IceInst.h"
     24 #include "IceOperand.h"
     25 #include "IceRangeSpec.h"
     26 
     27 #ifdef __clang__
     28 #pragma clang diagnostic push
     29 #pragma clang diagnostic ignored "-Wunused-parameter"
     30 #endif // __clang__
     31 
     32 #include "llvm/ADT/Hashing.h"
     33 #include "llvm/ADT/SmallString.h"
     34 #include "llvm/Bitcode/NaCl/NaClBitcodeDecoders.h"
     35 #include "llvm/Bitcode/NaCl/NaClBitcodeDefs.h"
     36 #include "llvm/Bitcode/NaCl/NaClBitcodeHeader.h"
     37 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h"
     38 #include "llvm/Bitcode/NaCl/NaClReaderWriter.h"
     39 #include "llvm/Support/Format.h"
     40 #include "llvm/Support/MemoryBuffer.h"
     41 #include "llvm/Support/raw_ostream.h"
     42 
     43 #ifdef __clang__
     44 #pragma clang diagnostic pop
     45 #endif // __clang__
     46 
     47 #include <unordered_set>
     48 
     49 // Define a hash function for SmallString's, so that it can be used in hash
     50 // tables.
     51 namespace std {
     52 template <unsigned InternalLen> struct hash<llvm::SmallString<InternalLen>> {
     53   size_t operator()(const llvm::SmallString<InternalLen> &Key) const {
     54     return llvm::hash_combine_range(Key.begin(), Key.end());
     55   }
     56 };
     57 } // end of namespace std
     58 
     59 namespace {
     60 using namespace llvm;
     61 
     62 // Models elements in the list of types defined in the types block. These
     63 // elements can be undefined, a (simple) type, or a function type signature.
     64 // Note that an extended type is undefined on construction. Use methods
     65 // setAsSimpleType and setAsFuncSigType to define the extended type.
     66 class ExtendedType {
     67   ExtendedType &operator=(const ExtendedType &Ty) = delete;
     68 
     69 public:
     70   /// Discriminator for LLVM-style RTTI.
     71   enum TypeKind { Undefined, Simple, FuncSig };
     72 
     73   ExtendedType() = default;
     74   ExtendedType(const ExtendedType &Ty) = default;
     75 
     76   virtual ~ExtendedType() = default;
     77 
     78   ExtendedType::TypeKind getKind() const { return Kind; }
     79   void dump(Ice::Ostream &Stream) const;
     80 
     81   /// Changes the extended type to a simple type with the given / value.
     82   void setAsSimpleType(Ice::Type Ty) {
     83     assert(Kind == Undefined);
     84     Kind = Simple;
     85     Signature.setReturnType(Ty);
     86   }
     87 
     88   /// Changes the extended type to an (empty) function signature type.
     89   void setAsFunctionType() {
     90     assert(Kind == Undefined);
     91     Kind = FuncSig;
     92   }
     93 
     94 protected:
     95   // Note: For simple types, the return type of the signature will be used to
     96   // hold the simple type.
     97   Ice::FuncSigType Signature;
     98 
     99 private:
    100   ExtendedType::TypeKind Kind = Undefined;
    101 };
    102 
    103 Ice::Ostream &operator<<(Ice::Ostream &Stream, const ExtendedType &Ty) {
    104   if (!Ice::BuildDefs::dump())
    105     return Stream;
    106   Ty.dump(Stream);
    107   return Stream;
    108 }
    109 
    110 Ice::Ostream &operator<<(Ice::Ostream &Stream, ExtendedType::TypeKind Kind) {
    111   if (!Ice::BuildDefs::dump())
    112     return Stream;
    113   Stream << "ExtendedType::";
    114   switch (Kind) {
    115   case ExtendedType::Undefined:
    116     Stream << "Undefined";
    117     break;
    118   case ExtendedType::Simple:
    119     Stream << "Simple";
    120     break;
    121   case ExtendedType::FuncSig:
    122     Stream << "FuncSig";
    123     break;
    124   }
    125   return Stream;
    126 }
    127 
    128 // Models an ICE type as an extended type.
    129 class SimpleExtendedType : public ExtendedType {
    130   SimpleExtendedType() = delete;
    131   SimpleExtendedType(const SimpleExtendedType &) = delete;
    132   SimpleExtendedType &operator=(const SimpleExtendedType &) = delete;
    133 
    134 public:
    135   Ice::Type getType() const { return Signature.getReturnType(); }
    136 
    137   static bool classof(const ExtendedType *Ty) {
    138     return Ty->getKind() == Simple;
    139   }
    140 };
    141 
    142 // Models a function signature as an extended type.
    143 class FuncSigExtendedType : public ExtendedType {
    144   FuncSigExtendedType() = delete;
    145   FuncSigExtendedType(const FuncSigExtendedType &) = delete;
    146   FuncSigExtendedType &operator=(const FuncSigExtendedType &) = delete;
    147 
    148 public:
    149   const Ice::FuncSigType &getSignature() const { return Signature; }
    150   void setReturnType(Ice::Type ReturnType) {
    151     Signature.setReturnType(ReturnType);
    152   }
    153   void appendArgType(Ice::Type ArgType) { Signature.appendArgType(ArgType); }
    154   static bool classof(const ExtendedType *Ty) {
    155     return Ty->getKind() == FuncSig;
    156   }
    157 };
    158 
    159 void ExtendedType::dump(Ice::Ostream &Stream) const {
    160   if (!Ice::BuildDefs::dump())
    161     return;
    162   Stream << Kind;
    163   switch (Kind) {
    164   case Simple: {
    165     Stream << " " << Signature.getReturnType();
    166     break;
    167   }
    168   case FuncSig: {
    169     Stream << " " << Signature;
    170   }
    171   default:
    172     break;
    173   }
    174 }
    175 
    176 // Models integer literals as a sequence of bits. Used to read integer values
    177 // from bitcode files. Based on llvm::APInt.
    178 class BitcodeInt {
    179   BitcodeInt() = delete;
    180   BitcodeInt(const BitcodeInt &) = delete;
    181   BitcodeInt &operator=(const BitcodeInt &) = delete;
    182 
    183 public:
    184   BitcodeInt(Ice::SizeT Bits, uint64_t Val) : BitWidth(Bits), Val(Val) {
    185     assert(Bits && "bitwidth too small");
    186     assert(Bits <= BITS_PER_WORD && "bitwidth too big");
    187     clearUnusedBits();
    188   }
    189 
    190   int64_t getSExtValue() const {
    191     return static_cast<int64_t>(Val << (BITS_PER_WORD - BitWidth)) >>
    192            (BITS_PER_WORD - BitWidth);
    193   }
    194 
    195   template <typename IntType, typename FpType>
    196   inline FpType convertToFp() const {
    197     static_assert(sizeof(IntType) == sizeof(FpType),
    198                   "IntType and FpType should be the same width");
    199     assert(BitWidth == sizeof(IntType) * CHAR_BIT);
    200     auto V = static_cast<IntType>(Val);
    201     return Ice::Utils::bitCopy<FpType>(V);
    202   }
    203 
    204 private:
    205   /// Bits in the (internal) value.
    206   static const Ice::SizeT BITS_PER_WORD = sizeof(uint64_t) * CHAR_BIT;
    207 
    208   uint32_t BitWidth; /// The number of bits in the floating point number.
    209   uint64_t Val;      /// The (64-bit) equivalent integer value.
    210 
    211   /// Clear unused high order bits.
    212   void clearUnusedBits() {
    213     // If all bits are used, we want to leave the value alone.
    214     if (BitWidth == BITS_PER_WORD)
    215       return;
    216 
    217     // Mask out the high bits.
    218     Val &= ~static_cast<uint64_t>(0) >> (BITS_PER_WORD - BitWidth);
    219   }
    220 };
    221 
    222 class BlockParserBaseClass;
    223 
    224 // Top-level class to read PNaCl bitcode files, and translate to ICE.
    225 class TopLevelParser final : public NaClBitcodeParser {
    226   TopLevelParser() = delete;
    227   TopLevelParser(const TopLevelParser &) = delete;
    228   TopLevelParser &operator=(const TopLevelParser &) = delete;
    229 
    230 public:
    231   TopLevelParser(Ice::Translator &Translator, NaClBitstreamCursor &Cursor,
    232                  Ice::ErrorCode &ErrorStatus)
    233       : NaClBitcodeParser(Cursor), Translator(Translator),
    234         ErrorStatus(ErrorStatus),
    235         VariableDeclarations(new Ice::VariableDeclarationList()) {}
    236 
    237   ~TopLevelParser() override = default;
    238 
    239   Ice::Translator &getTranslator() const { return Translator; }
    240 
    241   /// Generates error with given Message, occurring at BitPosition within the
    242   /// bitcode file. Always returns true.
    243   bool ErrorAt(naclbitc::ErrorLevel Level, uint64_t BitPosition,
    244                const std::string &Message) override;
    245 
    246   /// Generates error message with respect to the current block parser.
    247   bool blockError(const std::string &Message);
    248 
    249   /// Changes the size of the type list to the given size.
    250   void resizeTypeIDValues(size_t NewSize) { TypeIDValues.resize(NewSize); }
    251 
    252   size_t getNumTypeIDValues() const { return TypeIDValues.size(); }
    253 
    254   /// Returns a pointer to the pool where globals are allocated.
    255   Ice::VariableDeclarationList *getGlobalVariablesPool() {
    256     return VariableDeclarations.get();
    257   }
    258 
    259   /// Returns the undefined type associated with type ID. Note: Returns extended
    260   /// type ready to be defined.
    261   ExtendedType *getTypeByIDForDefining(NaClBcIndexSize_t ID) {
    262     // Get corresponding element, verifying the value is still undefined (and
    263     // hence allowed to be defined).
    264     ExtendedType *Ty = getTypeByIDAsKind(ID, ExtendedType::Undefined);
    265     if (Ty)
    266       return Ty;
    267     if (ID >= TypeIDValues.size()) {
    268       if (ID >= NaClBcIndexSize_t_Max) {
    269         std::string Buffer;
    270         raw_string_ostream StrBuf(Buffer);
    271         StrBuf << "Can't define more than " << NaClBcIndexSize_t_Max
    272                << " types\n";
    273         blockError(StrBuf.str());
    274         // Recover by using existing type slot.
    275         return &TypeIDValues[0];
    276       }
    277       Ice::Utils::reserveAndResize(TypeIDValues, ID + 1);
    278     }
    279     return &TypeIDValues[ID];
    280   }
    281 
    282   /// Returns the type associated with the given index.
    283   Ice::Type getSimpleTypeByID(NaClBcIndexSize_t ID) {
    284     const ExtendedType *Ty = getTypeByIDAsKind(ID, ExtendedType::Simple);
    285     if (Ty == nullptr)
    286       // Return error recovery value.
    287       return Ice::IceType_void;
    288     return cast<SimpleExtendedType>(Ty)->getType();
    289   }
    290 
    291   /// Returns the type signature associated with the given index.
    292   const Ice::FuncSigType &getFuncSigTypeByID(NaClBcIndexSize_t ID) {
    293     const ExtendedType *Ty = getTypeByIDAsKind(ID, ExtendedType::FuncSig);
    294     if (Ty == nullptr)
    295       // Return error recovery value.
    296       return UndefinedFuncSigType;
    297     return cast<FuncSigExtendedType>(Ty)->getSignature();
    298   }
    299 
    300   /// Sets the next function ID to the given LLVM function.
    301   void setNextFunctionID(Ice::FunctionDeclaration *Fcn) {
    302     FunctionDeclarations.push_back(Fcn);
    303   }
    304 
    305   /// Returns the value id that should be associated with the the current
    306   /// function block. Increments internal counters during call so that it will
    307   /// be in correct position for next function block.
    308   NaClBcIndexSize_t getNextFunctionBlockValueID() {
    309     size_t NumDeclaredFunctions = FunctionDeclarations.size();
    310     while (NextDefiningFunctionID < NumDeclaredFunctions &&
    311            FunctionDeclarations[NextDefiningFunctionID]->isProto())
    312       ++NextDefiningFunctionID;
    313     if (NextDefiningFunctionID >= NumDeclaredFunctions)
    314       Fatal("More function blocks than defined function addresses");
    315     return NextDefiningFunctionID++;
    316   }
    317 
    318   /// Returns the function associated with ID.
    319   Ice::FunctionDeclaration *getFunctionByID(NaClBcIndexSize_t ID) {
    320     if (ID < FunctionDeclarations.size())
    321       return FunctionDeclarations[ID];
    322     return reportGetFunctionByIDError(ID);
    323   }
    324 
    325   /// Returns the constant associated with the given global value ID.
    326   Ice::Constant *getGlobalConstantByID(NaClBcIndexSize_t ID) {
    327     assert(ID < ValueIDConstants.size());
    328     return ValueIDConstants[ID];
    329   }
    330 
    331   /// Install names for all global values without names. Called after the global
    332   /// value symbol table is processed, but before any function blocks are
    333   /// processed.
    334   void installGlobalNames() {
    335     assert(VariableDeclarations);
    336     installGlobalVarNames();
    337     installFunctionNames();
    338   }
    339 
    340   void verifyFunctionTypeSignatures();
    341 
    342   void createValueIDs() {
    343     assert(VariableDeclarations);
    344     ValueIDConstants.reserve(VariableDeclarations->size() +
    345                              FunctionDeclarations.size());
    346     createValueIDsForFunctions();
    347     createValueIDsForGlobalVars();
    348   }
    349 
    350   /// Returns the number of function declarations in the bitcode file.
    351   size_t getNumFunctionIDs() const { return FunctionDeclarations.size(); }
    352 
    353   /// Returns the number of global declarations (i.e. IDs) defined in the
    354   /// bitcode file.
    355   size_t getNumGlobalIDs() const {
    356     if (VariableDeclarations) {
    357       return FunctionDeclarations.size() + VariableDeclarations->size();
    358     } else {
    359       return ValueIDConstants.size();
    360     }
    361   }
    362 
    363   /// Adds the given global declaration to the end of the list of global
    364   /// declarations.
    365   void addGlobalDeclaration(Ice::VariableDeclaration *Decl) {
    366     assert(VariableDeclarations);
    367     VariableDeclarations->push_back(Decl);
    368   }
    369 
    370   /// Returns the global variable declaration with the given index.
    371   Ice::VariableDeclaration *getGlobalVariableByID(NaClBcIndexSize_t Index) {
    372     assert(VariableDeclarations);
    373     if (Index < VariableDeclarations->size())
    374       return VariableDeclarations->at(Index);
    375     return reportGetGlobalVariableByIDError(Index);
    376   }
    377 
    378   /// Returns the global declaration (variable or function) with the given
    379   /// Index.
    380   Ice::GlobalDeclaration *getGlobalDeclarationByID(NaClBcIndexSize_t Index) {
    381     size_t NumFunctionIds = FunctionDeclarations.size();
    382     if (Index < NumFunctionIds)
    383       return getFunctionByID(Index);
    384     else
    385       return getGlobalVariableByID(Index - NumFunctionIds);
    386   }
    387 
    388   /// Returns true if a module block has been parsed.
    389   bool parsedModuleBlock() const { return ParsedModuleBlock; }
    390 
    391   /// Returns the list of parsed global variable declarations. Releases
    392   /// ownership of the current list of global variables. Note: only returns
    393   /// non-null pointer on first call. All successive calls return a null
    394   /// pointer.
    395   std::unique_ptr<Ice::VariableDeclarationList> getGlobalVariables() {
    396     // Before returning, check that ValidIDConstants has already been built.
    397     assert(!VariableDeclarations ||
    398            VariableDeclarations->size() <= ValueIDConstants.size());
    399     return std::move(VariableDeclarations);
    400   }
    401 
    402   // Upper limit of alignment power allowed by LLVM
    403   static constexpr uint32_t AlignPowerLimit = 29;
    404 
    405   // Extracts the corresponding Alignment to use, given the AlignPower (i.e.
    406   // 2**(AlignPower-1), or 0 if AlignPower == 0). Parser defines the block
    407   // context the alignment check appears in, and Prefix defines the context the
    408   // alignment appears in.
    409   uint32_t extractAlignment(NaClBitcodeParser *Parser, const char *Prefix,
    410                             uint32_t AlignPower) {
    411     if (AlignPower <= AlignPowerLimit + 1)
    412       return (1 << AlignPower) >> 1;
    413     std::string Buffer;
    414     raw_string_ostream StrBuf(Buffer);
    415     StrBuf << Prefix << " alignment greater than 2**" << AlignPowerLimit
    416            << ". Found: 2**" << (AlignPower - 1);
    417     Parser->Error(StrBuf.str());
    418     // Error recover with value that is always acceptable.
    419     return 1;
    420   }
    421 
    422 private:
    423   // The translator associated with the parser.
    424   Ice::Translator &Translator;
    425 
    426   // ErrorStatus should only be updated while this lock is locked.
    427   Ice::GlobalLockType ErrorReportingLock;
    428   // The exit status that should be set to true if an error occurs.
    429   Ice::ErrorCode &ErrorStatus;
    430 
    431   // The types associated with each type ID.
    432   std::vector<ExtendedType> TypeIDValues;
    433   // The set of functions (prototype and defined).
    434   Ice::FunctionDeclarationList FunctionDeclarations;
    435   // The ID of the next possible defined function ID in FunctionDeclarations.
    436   // FunctionDeclarations is filled first. It's the set of functions (either
    437   // defined or isproto). Then function definitions are encountered/parsed and
    438   // NextDefiningFunctionID is incremented to track the next actually-defined
    439   // function.
    440   size_t NextDefiningFunctionID = 0;
    441   // The set of global variables.
    442   std::unique_ptr<Ice::VariableDeclarationList> VariableDeclarations;
    443   // Relocatable constants associated with global declarations.
    444   Ice::ConstantList ValueIDConstants;
    445   // Error recovery value to use when getFuncSigTypeByID fails.
    446   Ice::FuncSigType UndefinedFuncSigType;
    447   // Defines if a module block has already been parsed.
    448   bool ParsedModuleBlock = false;
    449 
    450   bool ParseBlock(unsigned BlockID) override;
    451 
    452   // Gets extended type associated with the given index, assuming the extended
    453   // type is of the WantedKind. Generates error message if corresponding
    454   // extended type of WantedKind can't be found, and returns nullptr.
    455   ExtendedType *getTypeByIDAsKind(NaClBcIndexSize_t ID,
    456                                   ExtendedType::TypeKind WantedKind) {
    457     ExtendedType *Ty = nullptr;
    458     if (ID < TypeIDValues.size()) {
    459       Ty = &TypeIDValues[ID];
    460       if (Ty->getKind() == WantedKind)
    461         return Ty;
    462     }
    463     // Generate an error message and set ErrorStatus.
    464     this->reportBadTypeIDAs(ID, Ty, WantedKind);
    465     return nullptr;
    466   }
    467 
    468   // Gives Decl a name if it doesn't already have one. Prefix and NameIndex are
    469   // used to generate the name. NameIndex is automatically incremented if a new
    470   // name is created. DeclType is literal text describing the type of name being
    471   // created. Also generates a warning if created names may conflict with named
    472   // declarations.
    473   void installDeclarationName(Ice::GlobalDeclaration *Decl,
    474                               const std::string &Prefix, const char *DeclType,
    475                               NaClBcIndexSize_t &NameIndex) {
    476     if (Decl->hasName()) {
    477       Translator.checkIfUnnamedNameSafe(Decl->getName().toString(), DeclType,
    478                                         Prefix);
    479     } else {
    480       Ice::GlobalContext *Ctx = Translator.getContext();
    481       // Synthesize a dummy name if any of the following is true:
    482       // - DUMP is enabled
    483       // - The symbol is external
    484       // - The -timing-funcs flag is enabled
    485       // - Some RangeSpec is initialized with actual names
    486       if (Ice::BuildDefs::dump() || !Decl->isInternal() ||
    487           Ice::RangeSpec::hasNames() || Ice::getFlags().getTimeEachFunction()) {
    488         Decl->setName(Ctx, Translator.createUnnamedName(Prefix, NameIndex));
    489       } else {
    490         Decl->setName(Ctx);
    491       }
    492       ++NameIndex;
    493     }
    494   }
    495 
    496   // Installs names for global variables without names.
    497   void installGlobalVarNames() {
    498     assert(VariableDeclarations);
    499     const std::string &GlobalPrefix = Ice::getFlags().getDefaultGlobalPrefix();
    500     if (!GlobalPrefix.empty()) {
    501       NaClBcIndexSize_t NameIndex = 0;
    502       for (Ice::VariableDeclaration *Var : *VariableDeclarations) {
    503         installDeclarationName(Var, GlobalPrefix, "global", NameIndex);
    504       }
    505     }
    506   }
    507 
    508   // Installs names for functions without names.
    509   void installFunctionNames() {
    510     const std::string &FunctionPrefix =
    511         Ice::getFlags().getDefaultFunctionPrefix();
    512     if (!FunctionPrefix.empty()) {
    513       NaClBcIndexSize_t NameIndex = 0;
    514       for (Ice::FunctionDeclaration *Func : FunctionDeclarations) {
    515         installDeclarationName(Func, FunctionPrefix, "function", NameIndex);
    516       }
    517     }
    518   }
    519 
    520   // Builds a constant symbol named Name.  IsExternal is true iff the symbol is
    521   // external.
    522   Ice::Constant *getConstantSym(Ice::GlobalString Name, bool IsExternal) const {
    523     Ice::GlobalContext *Ctx = getTranslator().getContext();
    524     if (IsExternal) {
    525       return Ctx->getConstantExternSym(Name);
    526     } else {
    527       const Ice::RelocOffsetT Offset = 0;
    528       return Ctx->getConstantSym(Offset, Name);
    529     }
    530   }
    531 
    532   void reportLinkageError(const char *Kind,
    533                           const Ice::GlobalDeclaration &Decl) {
    534     std::string Buffer;
    535     raw_string_ostream StrBuf(Buffer);
    536     StrBuf << Kind << " " << Decl.getName()
    537            << " has incorrect linkage: " << Decl.getLinkageName();
    538     if (Decl.isExternal())
    539       StrBuf << "\n  Use flag -allow-externally-defined-symbols to override";
    540     Error(StrBuf.str());
    541   }
    542 
    543   // Converts function declarations into constant value IDs.
    544   void createValueIDsForFunctions() {
    545     Ice::GlobalContext *Ctx = getTranslator().getContext();
    546     for (const Ice::FunctionDeclaration *Func : FunctionDeclarations) {
    547       if (!Func->verifyLinkageCorrect(Ctx))
    548         reportLinkageError("Function", *Func);
    549       Ice::Constant *C = getConstantSym(Func->getName(), Func->isProto());
    550       ValueIDConstants.push_back(C);
    551     }
    552   }
    553 
    554   // Converts global variable declarations into constant value IDs.
    555   void createValueIDsForGlobalVars() {
    556     for (const Ice::VariableDeclaration *Decl : *VariableDeclarations) {
    557       if (!Decl->verifyLinkageCorrect())
    558         reportLinkageError("Global", *Decl);
    559       Ice::Constant *C =
    560           getConstantSym(Decl->getName(), !Decl->hasInitializer());
    561       ValueIDConstants.push_back(C);
    562     }
    563   }
    564 
    565   // Reports that type ID is undefined, or not of the WantedType.
    566   void reportBadTypeIDAs(NaClBcIndexSize_t ID, const ExtendedType *Ty,
    567                          ExtendedType::TypeKind WantedType);
    568 
    569   // Reports that there is no function declaration for ID. Returns an error
    570   // recovery value to use.
    571   Ice::FunctionDeclaration *reportGetFunctionByIDError(NaClBcIndexSize_t ID);
    572 
    573   // Reports that there is not global variable declaration for ID. Returns an
    574   // error recovery value to use.
    575   Ice::VariableDeclaration *
    576   reportGetGlobalVariableByIDError(NaClBcIndexSize_t Index);
    577 
    578   // Reports that there is no corresponding ICE type for LLVMTy, and returns
    579   // Ice::IceType_void.
    580   Ice::Type convertToIceTypeError(Type *LLVMTy);
    581 };
    582 
    583 bool TopLevelParser::ErrorAt(naclbitc::ErrorLevel Level, uint64_t Bit,
    584                              const std::string &Message) {
    585   Ice::GlobalContext *Context = Translator.getContext();
    586   {
    587     std::unique_lock<Ice::GlobalLockType> _(ErrorReportingLock);
    588     ErrorStatus.assign(Ice::EC_Bitcode);
    589   }
    590   { // Lock while printing out error message.
    591     Ice::OstreamLocker L(Context);
    592     raw_ostream &OldErrStream = setErrStream(Context->getStrError());
    593     NaClBitcodeParser::ErrorAt(Level, Bit, Message);
    594     setErrStream(OldErrStream);
    595   }
    596   if (Level >= naclbitc::Error && !Ice::getFlags().getAllowErrorRecovery())
    597     Fatal();
    598   return true;
    599 }
    600 
    601 void TopLevelParser::reportBadTypeIDAs(NaClBcIndexSize_t ID,
    602                                        const ExtendedType *Ty,
    603                                        ExtendedType::TypeKind WantedType) {
    604   std::string Buffer;
    605   raw_string_ostream StrBuf(Buffer);
    606   if (Ty == nullptr) {
    607     StrBuf << "Can't find extended type for type id: " << ID;
    608   } else {
    609     StrBuf << "Type id " << ID << " not " << WantedType << ". Found: " << *Ty;
    610   }
    611   blockError(StrBuf.str());
    612 }
    613 
    614 Ice::FunctionDeclaration *
    615 TopLevelParser::reportGetFunctionByIDError(NaClBcIndexSize_t ID) {
    616   std::string Buffer;
    617   raw_string_ostream StrBuf(Buffer);
    618   StrBuf << "Function index " << ID
    619          << " not allowed. Out of range. Must be less than "
    620          << FunctionDeclarations.size();
    621   blockError(StrBuf.str());
    622   if (!FunctionDeclarations.empty())
    623     return FunctionDeclarations[0];
    624   Fatal();
    625 }
    626 
    627 Ice::VariableDeclaration *
    628 TopLevelParser::reportGetGlobalVariableByIDError(NaClBcIndexSize_t Index) {
    629   std::string Buffer;
    630   raw_string_ostream StrBuf(Buffer);
    631   StrBuf << "Global index " << Index
    632          << " not allowed. Out of range. Must be less than "
    633          << VariableDeclarations->size();
    634   blockError(StrBuf.str());
    635   if (!VariableDeclarations->empty())
    636     return VariableDeclarations->at(0);
    637   Fatal();
    638 }
    639 
    640 Ice::Type TopLevelParser::convertToIceTypeError(Type *LLVMTy) {
    641   std::string Buffer;
    642   raw_string_ostream StrBuf(Buffer);
    643   StrBuf << "Invalid LLVM type: " << *LLVMTy;
    644   Error(StrBuf.str());
    645   return Ice::IceType_void;
    646 }
    647 
    648 void TopLevelParser::verifyFunctionTypeSignatures() {
    649   const Ice::GlobalContext *Ctx = getTranslator().getContext();
    650   for (Ice::FunctionDeclaration *FuncDecl : FunctionDeclarations) {
    651     if (!FuncDecl->validateTypeSignature(Ctx))
    652       Error(FuncDecl->getTypeSignatureError(Ctx));
    653   }
    654 }
    655 
    656 // Base class for parsing blocks within the bitcode file. Note: Because this is
    657 // the base class of block parsers, we generate error messages if ParseBlock or
    658 // ParseRecord is not overridden in derived classes.
    659 class BlockParserBaseClass : public NaClBitcodeParser {
    660   BlockParserBaseClass() = delete;
    661   BlockParserBaseClass(const BlockParserBaseClass &) = delete;
    662   BlockParserBaseClass &operator=(const BlockParserBaseClass &) = delete;
    663 
    664 public:
    665   // Constructor for the top-level module block parser.
    666   BlockParserBaseClass(unsigned BlockID, TopLevelParser *Context)
    667       : NaClBitcodeParser(BlockID, Context), Context(Context) {}
    668 
    669   BlockParserBaseClass(unsigned BlockID, BlockParserBaseClass *EnclosingParser,
    670                        NaClBitstreamCursor &Cursor)
    671       : NaClBitcodeParser(BlockID, EnclosingParser, Cursor),
    672         Context(EnclosingParser->Context) {}
    673 
    674   ~BlockParserBaseClass() override {}
    675 
    676   // Returns the printable name of the type of block being parsed.
    677   virtual const char *getBlockName() const {
    678     // If this class is used, it is parsing an unknown block.
    679     return "unknown";
    680   }
    681 
    682   // Generates an error Message with the Bit address prefixed to it.
    683   bool ErrorAt(naclbitc::ErrorLevel Level, uint64_t Bit,
    684                const std::string &Message) override;
    685 
    686 protected:
    687   // The context parser that contains the decoded state.
    688   TopLevelParser *Context;
    689   // True if ErrorAt has been called in this block.
    690   bool BlockHasError = false;
    691 
    692   // Constructor for nested block parsers.
    693   BlockParserBaseClass(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
    694       : NaClBitcodeParser(BlockID, EnclosingParser),
    695         Context(EnclosingParser->Context) {}
    696 
    697   // Gets the translator associated with the bitcode parser.
    698   Ice::Translator &getTranslator() const { return Context->getTranslator(); }
    699 
    700   // Default implementation. Reports that block is unknown and skips its
    701   // contents.
    702   bool ParseBlock(unsigned BlockID) override;
    703 
    704   // Default implementation. Reports that the record is not understood.
    705   void ProcessRecord() override;
    706 
    707   // Checks if the size of the record is Size. Return true if valid. Otherwise
    708   // generates an error and returns false.
    709   bool isValidRecordSize(size_t Size, const char *RecordName) {
    710     const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
    711     if (Values.size() == Size)
    712       return true;
    713     reportRecordSizeError(Size, RecordName, nullptr);
    714     return false;
    715   }
    716 
    717   // Checks if the size of the record is at least as large as the LowerLimit.
    718   // Returns true if valid. Otherwise generates an error and returns false.
    719   bool isValidRecordSizeAtLeast(size_t LowerLimit, const char *RecordName) {
    720     const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
    721     if (Values.size() >= LowerLimit)
    722       return true;
    723     reportRecordSizeError(LowerLimit, RecordName, "at least");
    724     return false;
    725   }
    726 
    727   // Checks if the size of the record is no larger than the
    728   // UpperLimit.  Returns true if valid. Otherwise generates an error and
    729   // returns false.
    730   bool isValidRecordSizeAtMost(size_t UpperLimit, const char *RecordName) {
    731     const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
    732     if (Values.size() <= UpperLimit)
    733       return true;
    734     reportRecordSizeError(UpperLimit, RecordName, "no more than");
    735     return false;
    736   }
    737 
    738   // Checks if the size of the record is at least as large as the LowerLimit,
    739   // and no larger than the UpperLimit. Returns true if valid. Otherwise
    740   // generates an error and returns false.
    741   bool isValidRecordSizeInRange(size_t LowerLimit, size_t UpperLimit,
    742                                 const char *RecordName) {
    743     return isValidRecordSizeAtLeast(LowerLimit, RecordName) ||
    744            isValidRecordSizeAtMost(UpperLimit, RecordName);
    745   }
    746 
    747 private:
    748   /// Generates a record size error. ExpectedSize is the number of elements
    749   /// expected. RecordName is the name of the kind of record that has incorrect
    750   /// size. ContextMessage (if not nullptr) is appended to "record expects" to
    751   /// describe how ExpectedSize should be interpreted.
    752   void reportRecordSizeError(size_t ExpectedSize, const char *RecordName,
    753                              const char *ContextMessage);
    754 };
    755 
    756 bool TopLevelParser::blockError(const std::string &Message) {
    757   // TODO(kschimpf): Remove this method. This method used to redirect
    758   // block-level errors to the block we are in, rather than the top-level
    759   // block. This gave better bit location for error messages. However, with
    760   // parallel parsing, we can't keep a field to redirect (there could be many
    761   // and we don't know which block parser applies). Hence, This redirect can't
    762   // be applied anymore.
    763   return Error(Message);
    764 }
    765 
    766 // Generates an error Message with the bit address prefixed to it.
    767 bool BlockParserBaseClass::ErrorAt(naclbitc::ErrorLevel Level, uint64_t Bit,
    768                                    const std::string &Message) {
    769   BlockHasError = true;
    770   std::string Buffer;
    771   raw_string_ostream StrBuf(Buffer);
    772   // Note: If dump routines have been turned off, the error messages will not
    773   // be readable. Hence, replace with simple error. We also use the simple form
    774   // for unit tests.
    775   if (Ice::getFlags().getGenerateUnitTestMessages()) {
    776     StrBuf << "Invalid " << getBlockName() << " record: <" << Record.GetCode();
    777     for (const uint64_t Val : Record.GetValues()) {
    778       StrBuf << " " << Val;
    779     }
    780     StrBuf << ">";
    781   } else {
    782     StrBuf << Message;
    783   }
    784   return Context->ErrorAt(Level, Record.GetCursor().getErrorBitNo(Bit),
    785                           StrBuf.str());
    786 }
    787 
    788 void BlockParserBaseClass::reportRecordSizeError(size_t ExpectedSize,
    789                                                  const char *RecordName,
    790                                                  const char *ContextMessage) {
    791   std::string Buffer;
    792   raw_string_ostream StrBuf(Buffer);
    793   const char *BlockName = getBlockName();
    794   const char FirstChar = toupper(*BlockName);
    795   StrBuf << FirstChar << (BlockName + 1) << " " << RecordName
    796          << " record expects";
    797   if (ContextMessage)
    798     StrBuf << " " << ContextMessage;
    799   StrBuf << " " << ExpectedSize << " argument";
    800   if (ExpectedSize > 1)
    801     StrBuf << "s";
    802   StrBuf << ". Found: " << Record.GetValues().size();
    803   Error(StrBuf.str());
    804 }
    805 
    806 bool BlockParserBaseClass::ParseBlock(unsigned BlockID) {
    807   // If called, derived class doesn't know how to handle block. Report error
    808   // and skip.
    809   std::string Buffer;
    810   raw_string_ostream StrBuf(Buffer);
    811   StrBuf << "Don't know how to parse block id: " << BlockID;
    812   Error(StrBuf.str());
    813   SkipBlock();
    814   return false;
    815 }
    816 
    817 void BlockParserBaseClass::ProcessRecord() {
    818   // If called, derived class doesn't know how to handle.
    819   std::string Buffer;
    820   raw_string_ostream StrBuf(Buffer);
    821   StrBuf << "Don't know how to process " << getBlockName()
    822          << " record:" << Record;
    823   Error(StrBuf.str());
    824 }
    825 
    826 // Class to parse a types block.
    827 class TypesParser final : public BlockParserBaseClass {
    828   TypesParser() = delete;
    829   TypesParser(const TypesParser &) = delete;
    830   TypesParser &operator=(const TypesParser &) = delete;
    831 
    832 public:
    833   TypesParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
    834       : BlockParserBaseClass(BlockID, EnclosingParser),
    835         Timer(Ice::TimerStack::TT_parseTypes, getTranslator().getContext()) {}
    836 
    837   ~TypesParser() override {
    838     if (ExpectedNumTypes != Context->getNumTypeIDValues()) {
    839       std::string Buffer;
    840       raw_string_ostream StrBuf(Buffer);
    841       StrBuf << "Types block expected " << ExpectedNumTypes
    842              << " types but found: " << NextTypeId;
    843       Error(StrBuf.str());
    844     }
    845   }
    846 
    847 private:
    848   Ice::TimerMarker Timer;
    849   // The type ID that will be associated with the next type defining record in
    850   // the types block.
    851   NaClBcIndexSize_t NextTypeId = 0;
    852 
    853   // The expected number of types, based on record TYPE_CODE_NUMENTRY.
    854   NaClBcIndexSize_t ExpectedNumTypes = 0;
    855 
    856   void ProcessRecord() override;
    857 
    858   const char *getBlockName() const override { return "type"; }
    859 
    860   void setNextTypeIDAsSimpleType(Ice::Type Ty) {
    861     Context->getTypeByIDForDefining(NextTypeId++)->setAsSimpleType(Ty);
    862   }
    863 };
    864 
    865 void TypesParser::ProcessRecord() {
    866   const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
    867   switch (Record.GetCode()) {
    868   case naclbitc::TYPE_CODE_NUMENTRY: {
    869     // NUMENTRY: [numentries]
    870     if (!isValidRecordSize(1, "count"))
    871       return;
    872     uint64_t Size = Values[0];
    873     if (Size > NaClBcIndexSize_t_Max) {
    874       std::string Buffer;
    875       raw_string_ostream StrBuf(Buffer);
    876       StrBuf << "Size to big for count record: " << Size;
    877       Error(StrBuf.str());
    878       ExpectedNumTypes = NaClBcIndexSize_t_Max;
    879     }
    880     // The code double checks that Expected size and the actual size at the end
    881     // of the block. To reduce allocations we preallocate the space.
    882     //
    883     // However, if the number is large, we suspect that the number is
    884     // (possibly) incorrect. In that case, we preallocate a smaller space.
    885     constexpr uint64_t DefaultLargeResizeValue = 1000000;
    886     Context->resizeTypeIDValues(std::min(Size, DefaultLargeResizeValue));
    887     ExpectedNumTypes = Size;
    888     return;
    889   }
    890   case naclbitc::TYPE_CODE_VOID:
    891     // VOID
    892     if (!isValidRecordSize(0, "void"))
    893       return;
    894     setNextTypeIDAsSimpleType(Ice::IceType_void);
    895     return;
    896   case naclbitc::TYPE_CODE_FLOAT:
    897     // FLOAT
    898     if (!isValidRecordSize(0, "float"))
    899       return;
    900     setNextTypeIDAsSimpleType(Ice::IceType_f32);
    901     return;
    902   case naclbitc::TYPE_CODE_DOUBLE:
    903     // DOUBLE
    904     if (!isValidRecordSize(0, "double"))
    905       return;
    906     setNextTypeIDAsSimpleType(Ice::IceType_f64);
    907     return;
    908   case naclbitc::TYPE_CODE_INTEGER:
    909     // INTEGER: [width]
    910     if (!isValidRecordSize(1, "integer"))
    911       return;
    912     switch (Values[0]) {
    913     case 1:
    914       setNextTypeIDAsSimpleType(Ice::IceType_i1);
    915       return;
    916     case 8:
    917       setNextTypeIDAsSimpleType(Ice::IceType_i8);
    918       return;
    919     case 16:
    920       setNextTypeIDAsSimpleType(Ice::IceType_i16);
    921       return;
    922     case 32:
    923       setNextTypeIDAsSimpleType(Ice::IceType_i32);
    924       return;
    925     case 64:
    926       setNextTypeIDAsSimpleType(Ice::IceType_i64);
    927       return;
    928     default:
    929       break;
    930     }
    931     {
    932       std::string Buffer;
    933       raw_string_ostream StrBuf(Buffer);
    934       StrBuf << "Type integer record with invalid bitsize: " << Values[0];
    935       Error(StrBuf.str());
    936     }
    937     return;
    938   case naclbitc::TYPE_CODE_VECTOR: {
    939     // VECTOR: [numelts, eltty]
    940     if (!isValidRecordSize(2, "vector"))
    941       return;
    942     Ice::Type BaseTy = Context->getSimpleTypeByID(Values[1]);
    943     Ice::SizeT Size = Values[0];
    944     switch (BaseTy) {
    945     case Ice::IceType_i1:
    946       switch (Size) {
    947       case 4:
    948         setNextTypeIDAsSimpleType(Ice::IceType_v4i1);
    949         return;
    950       case 8:
    951         setNextTypeIDAsSimpleType(Ice::IceType_v8i1);
    952         return;
    953       case 16:
    954         setNextTypeIDAsSimpleType(Ice::IceType_v16i1);
    955         return;
    956       default:
    957         break;
    958       }
    959       break;
    960     case Ice::IceType_i8:
    961       if (Size == 16) {
    962         setNextTypeIDAsSimpleType(Ice::IceType_v16i8);
    963         return;
    964       }
    965       break;
    966     case Ice::IceType_i16:
    967       if (Size == 8) {
    968         setNextTypeIDAsSimpleType(Ice::IceType_v8i16);
    969         return;
    970       }
    971       break;
    972     case Ice::IceType_i32:
    973       if (Size == 4) {
    974         setNextTypeIDAsSimpleType(Ice::IceType_v4i32);
    975         return;
    976       }
    977       break;
    978     case Ice::IceType_f32:
    979       if (Size == 4) {
    980         setNextTypeIDAsSimpleType(Ice::IceType_v4f32);
    981         return;
    982       }
    983       break;
    984     default:
    985       break;
    986     }
    987     {
    988       std::string Buffer;
    989       raw_string_ostream StrBuf(Buffer);
    990       StrBuf << "Invalid type vector record: <" << Values[0] << " x " << BaseTy
    991              << ">";
    992       Error(StrBuf.str());
    993     }
    994     return;
    995   }
    996   case naclbitc::TYPE_CODE_FUNCTION: {
    997     // FUNCTION: [vararg, retty, paramty x N]
    998     if (!isValidRecordSizeAtLeast(2, "signature"))
    999       return;
   1000     if (Values[0])
   1001       Error("Function type can't define varargs");
   1002     ExtendedType *Ty = Context->getTypeByIDForDefining(NextTypeId++);
   1003     Ty->setAsFunctionType();
   1004     auto *FuncTy = cast<FuncSigExtendedType>(Ty);
   1005     FuncTy->setReturnType(Context->getSimpleTypeByID(Values[1]));
   1006     for (size_t i = 2, e = Values.size(); i != e; ++i) {
   1007       // Check that type void not used as argument type. Note: PNaCl
   1008       // restrictions can't be checked until we know the name, because we have
   1009       // to check for intrinsic signatures.
   1010       Ice::Type ArgTy = Context->getSimpleTypeByID(Values[i]);
   1011       if (ArgTy == Ice::IceType_void) {
   1012         std::string Buffer;
   1013         raw_string_ostream StrBuf(Buffer);
   1014         StrBuf << "Type for parameter " << (i - 1)
   1015                << " not valid. Found: " << ArgTy;
   1016         ArgTy = Ice::IceType_i32;
   1017       }
   1018       FuncTy->appendArgType(ArgTy);
   1019     }
   1020     return;
   1021   }
   1022   default:
   1023     BlockParserBaseClass::ProcessRecord();
   1024     return;
   1025   }
   1026   llvm_unreachable("Unknown type block record not processed!");
   1027 }
   1028 
   1029 /// Parses the globals block (i.e. global variable declarations and
   1030 /// corresponding initializers).
   1031 class GlobalsParser final : public BlockParserBaseClass {
   1032   GlobalsParser() = delete;
   1033   GlobalsParser(const GlobalsParser &) = delete;
   1034   GlobalsParser &operator=(const GlobalsParser &) = delete;
   1035 
   1036 public:
   1037   GlobalsParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
   1038       : BlockParserBaseClass(BlockID, EnclosingParser),
   1039         Timer(Ice::TimerStack::TT_parseGlobals, getTranslator().getContext()),
   1040         NumFunctionIDs(Context->getNumFunctionIDs()),
   1041         DummyGlobalVar(Ice::VariableDeclaration::create(
   1042             Context->getGlobalVariablesPool())),
   1043         CurGlobalVar(DummyGlobalVar) {
   1044     Context->getGlobalVariablesPool()->willNotBeEmitted(DummyGlobalVar);
   1045   }
   1046 
   1047   ~GlobalsParser() override = default;
   1048 
   1049   const char *getBlockName() const override { return "globals"; }
   1050 
   1051 private:
   1052   using GlobalVarsMapType =
   1053       std::unordered_map<NaClBcIndexSize_t, Ice::VariableDeclaration *>;
   1054 
   1055   Ice::TimerMarker Timer;
   1056 
   1057   // Holds global variables generated/referenced in the global variables block.
   1058   GlobalVarsMapType GlobalVarsMap;
   1059 
   1060   // Holds the number of defined function IDs.
   1061   NaClBcIndexSize_t NumFunctionIDs;
   1062 
   1063   // Holds the specified number of global variables by the count record in the
   1064   // global variables block.
   1065   NaClBcIndexSize_t SpecifiedNumberVars = 0;
   1066 
   1067   // Keeps track of how many initializers are expected for the global variable
   1068   // declaration being built.
   1069   NaClBcIndexSize_t InitializersNeeded = 0;
   1070 
   1071   // The index of the next global variable declaration.
   1072   NaClBcIndexSize_t NextGlobalID = 0;
   1073 
   1074   // Dummy global variable declaration to guarantee CurGlobalVar is always
   1075   // defined (allowing code to not need to check if CurGlobalVar is nullptr).
   1076   Ice::VariableDeclaration *DummyGlobalVar;
   1077 
   1078   // Holds the current global variable declaration being built.
   1079   Ice::VariableDeclaration *CurGlobalVar;
   1080 
   1081   // Returns the global variable associated with the given Index.
   1082   Ice::VariableDeclaration *getGlobalVarByID(NaClBcIndexSize_t Index) {
   1083     Ice::VariableDeclaration *&Decl = GlobalVarsMap[Index];
   1084     if (Decl == nullptr)
   1085       Decl =
   1086           Ice::VariableDeclaration::create(Context->getGlobalVariablesPool());
   1087     return Decl;
   1088   }
   1089 
   1090   // Returns the global declaration associated with the given index.
   1091   Ice::GlobalDeclaration *getGlobalDeclByID(NaClBcIndexSize_t Index) {
   1092     if (Index < NumFunctionIDs)
   1093       return Context->getFunctionByID(Index);
   1094     return getGlobalVarByID(Index - NumFunctionIDs);
   1095   }
   1096 
   1097   // If global variables parsed correctly, install them into the top-level
   1098   // context.
   1099   void installGlobalVariables() {
   1100     // Verify specified number of globals matches number found.
   1101     size_t NumGlobals = GlobalVarsMap.size();
   1102     if (SpecifiedNumberVars != NumGlobals ||
   1103         SpecifiedNumberVars != NextGlobalID) {
   1104       std::string Buffer;
   1105       raw_string_ostream StrBuf(Buffer);
   1106       StrBuf << getBlockName() << " block expects " << SpecifiedNumberVars
   1107              << " global variables. Found: " << GlobalVarsMap.size();
   1108       Error(StrBuf.str());
   1109       return;
   1110     }
   1111     // Install global variables into top-level context.
   1112     for (size_t I = 0; I < NumGlobals; ++I)
   1113       Context->addGlobalDeclaration(GlobalVarsMap[I]);
   1114   }
   1115 
   1116   void ExitBlock() override {
   1117     verifyNoMissingInitializers();
   1118     installGlobalVariables();
   1119     BlockParserBaseClass::ExitBlock();
   1120   }
   1121 
   1122   void ProcessRecord() override;
   1123 
   1124   // Checks if the number of initializers for the CurGlobalVar is the same as
   1125   // the number found in the bitcode file. If different, and error message is
   1126   // generated, and the internal state of the parser is fixed so this condition
   1127   // is no longer violated.
   1128   void verifyNoMissingInitializers() {
   1129     size_t NumInits = CurGlobalVar->getInitializers().size();
   1130     if (InitializersNeeded != NumInits) {
   1131       std::string Buffer;
   1132       raw_string_ostream StrBuf(Buffer);
   1133       StrBuf << "Global variable @g" << NextGlobalID << " expected "
   1134              << InitializersNeeded << " initializer";
   1135       if (InitializersNeeded > 1)
   1136         StrBuf << "s";
   1137       StrBuf << ". Found: " << NumInits;
   1138       Error(StrBuf.str());
   1139       InitializersNeeded = NumInits;
   1140     }
   1141   }
   1142 };
   1143 
   1144 void GlobalsParser::ProcessRecord() {
   1145   const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
   1146   switch (Record.GetCode()) {
   1147   case naclbitc::GLOBALVAR_COUNT:
   1148     // COUNT: [n]
   1149     if (!isValidRecordSize(1, "count"))
   1150       return;
   1151     if (SpecifiedNumberVars || NextGlobalID) {
   1152       Error("Globals count record not first in block.");
   1153       return;
   1154     }
   1155     SpecifiedNumberVars = Values[0];
   1156     return;
   1157   case naclbitc::GLOBALVAR_VAR: {
   1158     // VAR: [align, isconst]
   1159     if (!isValidRecordSize(2, "variable"))
   1160       return;
   1161     verifyNoMissingInitializers();
   1162     // Always build the global variable, even if IR generation is turned off.
   1163     // This is needed because we need a placeholder in the top-level context
   1164     // when no IR is generated.
   1165     uint32_t Alignment =
   1166         Context->extractAlignment(this, "Global variable", Values[0]);
   1167     CurGlobalVar = getGlobalVarByID(NextGlobalID);
   1168     InitializersNeeded = 1;
   1169     CurGlobalVar->setAlignment(Alignment);
   1170     CurGlobalVar->setIsConstant(Values[1] != 0);
   1171     ++NextGlobalID;
   1172     return;
   1173   }
   1174   case naclbitc::GLOBALVAR_COMPOUND:
   1175     // COMPOUND: [size]
   1176     if (!isValidRecordSize(1, "compound"))
   1177       return;
   1178     if (!CurGlobalVar->getInitializers().empty()) {
   1179       Error("Globals compound record not first initializer");
   1180       return;
   1181     }
   1182     if (Values[0] < 2) {
   1183       std::string Buffer;
   1184       raw_string_ostream StrBuf(Buffer);
   1185       StrBuf << getBlockName()
   1186              << " compound record size invalid. Found: " << Values[0];
   1187       Error(StrBuf.str());
   1188       return;
   1189     }
   1190     InitializersNeeded = Values[0];
   1191     return;
   1192   case naclbitc::GLOBALVAR_ZEROFILL: {
   1193     // ZEROFILL: [size]
   1194     if (!isValidRecordSize(1, "zerofill"))
   1195       return;
   1196     auto *Pool = Context->getGlobalVariablesPool();
   1197     CurGlobalVar->addInitializer(
   1198         Ice::VariableDeclaration::ZeroInitializer::create(Pool, Values[0]));
   1199     return;
   1200   }
   1201   case naclbitc::GLOBALVAR_DATA: {
   1202     // DATA: [b0, b1, ...]
   1203     if (!isValidRecordSizeAtLeast(1, "data"))
   1204       return;
   1205     auto *Pool = Context->getGlobalVariablesPool();
   1206     CurGlobalVar->addInitializer(
   1207         Ice::VariableDeclaration::DataInitializer::create(Pool, Values));
   1208     return;
   1209   }
   1210   case naclbitc::GLOBALVAR_RELOC: {
   1211     // RELOC: [val, [addend]]
   1212     if (!isValidRecordSizeInRange(1, 2, "reloc"))
   1213       return;
   1214     NaClBcIndexSize_t Index = Values[0];
   1215     NaClBcIndexSize_t IndexLimit = SpecifiedNumberVars + NumFunctionIDs;
   1216     if (Index >= IndexLimit) {
   1217       std::string Buffer;
   1218       raw_string_ostream StrBuf(Buffer);
   1219       StrBuf << "Relocation index " << Index << " to big. Expect index < "
   1220              << IndexLimit;
   1221       Error(StrBuf.str());
   1222     }
   1223     uint64_t Offset = 0;
   1224     if (Values.size() == 2) {
   1225       Offset = Values[1];
   1226       if (Offset > std::numeric_limits<uint32_t>::max()) {
   1227         std::string Buffer;
   1228         raw_string_ostream StrBuf(Buffer);
   1229         StrBuf << "Addend of global reloc record too big: " << Offset;
   1230         Error(StrBuf.str());
   1231       }
   1232     }
   1233     auto *Pool = Context->getGlobalVariablesPool();
   1234     Ice::GlobalContext *Ctx = getTranslator().getContext();
   1235     CurGlobalVar->addInitializer(
   1236         Ice::VariableDeclaration::RelocInitializer::create(
   1237             Pool, getGlobalDeclByID(Index),
   1238             {Ice::RelocOffset::create(Ctx, Offset)}));
   1239     return;
   1240   }
   1241   default:
   1242     BlockParserBaseClass::ProcessRecord();
   1243     return;
   1244   }
   1245 }
   1246 
   1247 /// Base class for parsing a valuesymtab block in the bitcode file.
   1248 class ValuesymtabParser : public BlockParserBaseClass {
   1249   ValuesymtabParser() = delete;
   1250   ValuesymtabParser(const ValuesymtabParser &) = delete;
   1251   void operator=(const ValuesymtabParser &) = delete;
   1252 
   1253 public:
   1254   ValuesymtabParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
   1255       : BlockParserBaseClass(BlockID, EnclosingParser) {}
   1256 
   1257   ~ValuesymtabParser() override = default;
   1258 
   1259   const char *getBlockName() const override { return "valuesymtab"; }
   1260 
   1261 protected:
   1262   using StringType = SmallString<128>;
   1263 
   1264   // Returns the name to identify the kind of symbol table this is
   1265   // in error messages.
   1266   virtual const char *getTableKind() const = 0;
   1267 
   1268   // Associates Name with the value defined by the given Index.
   1269   virtual void setValueName(NaClBcIndexSize_t Index, StringType &Name) = 0;
   1270 
   1271   // Associates Name with the value defined by the given Index;
   1272   virtual void setBbName(NaClBcIndexSize_t Index, StringType &Name) = 0;
   1273 
   1274   // Reports that the assignment of Name to the value associated with
   1275   // index is not possible, for the given Context.
   1276   void reportUnableToAssign(const char *Context, NaClBcIndexSize_t Index,
   1277                             StringType &Name);
   1278 
   1279 private:
   1280   using NamesSetType = std::unordered_set<StringType>;
   1281   NamesSetType ValueNames;
   1282   NamesSetType BlockNames;
   1283 
   1284   void ProcessRecord() override;
   1285 
   1286   // Extracts out ConvertedName. Returns true if unique wrt to Names.
   1287   bool convertToString(NamesSetType &Names, StringType &ConvertedName) {
   1288     const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
   1289     for (size_t i = 1, e = Values.size(); i != e; ++i) {
   1290       ConvertedName += static_cast<char>(Values[i]);
   1291     }
   1292     auto Pair = Names.insert(ConvertedName);
   1293     return Pair.second;
   1294   }
   1295 
   1296   void ReportDuplicateName(const char *NameCat, StringType &Name);
   1297 };
   1298 
   1299 void ValuesymtabParser::reportUnableToAssign(const char *Context,
   1300                                              NaClBcIndexSize_t Index,
   1301                                              StringType &Name) {
   1302   std::string Buffer;
   1303   raw_string_ostream StrBuf(Buffer);
   1304   StrBuf << getTableKind() << " " << getBlockName() << ": " << Context
   1305          << " name '" << Name << "' can't be associated with index " << Index;
   1306   Error(StrBuf.str());
   1307 }
   1308 
   1309 void ValuesymtabParser::ReportDuplicateName(const char *NameCat,
   1310                                             StringType &Name) {
   1311   std::string Buffer;
   1312   raw_string_ostream StrBuf(Buffer);
   1313   StrBuf << getTableKind() << " " << getBlockName() << " defines duplicate "
   1314          << NameCat << " name: '" << Name << "'";
   1315   Error(StrBuf.str());
   1316 }
   1317 
   1318 void ValuesymtabParser::ProcessRecord() {
   1319   const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
   1320   StringType ConvertedName;
   1321   switch (Record.GetCode()) {
   1322   case naclbitc::VST_CODE_ENTRY: {
   1323     // VST_ENTRY: [ValueId, namechar x N]
   1324     if (!isValidRecordSizeAtLeast(2, "value entry"))
   1325       return;
   1326     if (convertToString(ValueNames, ConvertedName))
   1327       setValueName(Values[0], ConvertedName);
   1328     else
   1329       ReportDuplicateName("value", ConvertedName);
   1330     return;
   1331   }
   1332   case naclbitc::VST_CODE_BBENTRY: {
   1333     // VST_BBENTRY: [BbId, namechar x N]
   1334     if (!isValidRecordSizeAtLeast(2, "basic block entry"))
   1335       return;
   1336     if (convertToString(BlockNames, ConvertedName))
   1337       setBbName(Values[0], ConvertedName);
   1338     else
   1339       ReportDuplicateName("block", ConvertedName);
   1340     return;
   1341   }
   1342   default:
   1343     break;
   1344   }
   1345   // If reached, don't know how to handle record.
   1346   BlockParserBaseClass::ProcessRecord();
   1347   return;
   1348 }
   1349 
   1350 /// Parses function blocks in the bitcode file.
   1351 class FunctionParser final : public BlockParserBaseClass {
   1352   FunctionParser() = delete;
   1353   FunctionParser(const FunctionParser &) = delete;
   1354   FunctionParser &operator=(const FunctionParser &) = delete;
   1355 
   1356 public:
   1357   FunctionParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser,
   1358                  NaClBcIndexSize_t FcnId)
   1359       : BlockParserBaseClass(BlockID, EnclosingParser),
   1360         Timer(Ice::TimerStack::TT_parseFunctions, getTranslator().getContext()),
   1361         Func(nullptr), FuncDecl(Context->getFunctionByID(FcnId)),
   1362         CachedNumGlobalValueIDs(Context->getNumGlobalIDs()),
   1363         NextLocalInstIndex(Context->getNumGlobalIDs()) {}
   1364 
   1365   FunctionParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser,
   1366                  NaClBcIndexSize_t FcnId, NaClBitstreamCursor &Cursor)
   1367       : BlockParserBaseClass(BlockID, EnclosingParser, Cursor),
   1368         Timer(Ice::TimerStack::TT_parseFunctions, getTranslator().getContext()),
   1369         Func(nullptr), FuncDecl(Context->getFunctionByID(FcnId)),
   1370         CachedNumGlobalValueIDs(Context->getNumGlobalIDs()),
   1371         NextLocalInstIndex(Context->getNumGlobalIDs()) {}
   1372 
   1373   std::unique_ptr<Ice::Cfg> parseFunction(uint32_t SeqNumber) {
   1374     bool ParserResult;
   1375     Ice::GlobalContext *Ctx = getTranslator().getContext();
   1376     {
   1377       Ice::TimerMarker T(Ctx, FuncDecl->getName().toStringOrEmpty());
   1378       // Note: The Cfg is created, even when IR generation is disabled. This is
   1379       // done to install a CfgLocalAllocator for various internal containers.
   1380       Ice::GlobalContext *Ctx = getTranslator().getContext();
   1381       Func = Ice::Cfg::create(Ctx, SeqNumber);
   1382 
   1383       Ice::CfgLocalAllocatorScope _(Func.get());
   1384 
   1385       // TODO(kschimpf) Clean up API to add a function signature to a CFG.
   1386       const Ice::FuncSigType &Signature = FuncDecl->getSignature();
   1387 
   1388       Func->setFunctionName(FuncDecl->getName());
   1389       Func->setReturnType(Signature.getReturnType());
   1390       Func->setInternal(FuncDecl->getLinkage() == GlobalValue::InternalLinkage);
   1391       CurrentNode = installNextBasicBlock();
   1392       Func->setEntryNode(CurrentNode);
   1393       for (Ice::Type ArgType : Signature.getArgList()) {
   1394         Func->addArg(getNextInstVar(ArgType));
   1395       }
   1396 
   1397       ParserResult = ParseThisBlock();
   1398     }
   1399 
   1400     if (ParserResult || BlockHasError)
   1401       Func->setError("Unable to parse function");
   1402 
   1403     return std::move(Func);
   1404   }
   1405 
   1406   ~FunctionParser() override = default;
   1407 
   1408   const char *getBlockName() const override { return "function"; }
   1409 
   1410   Ice::Cfg *getFunc() const { return Func.get(); }
   1411 
   1412   size_t getNumGlobalIDs() const { return CachedNumGlobalValueIDs; }
   1413 
   1414   void setNextLocalInstIndex(Ice::Operand *Op) {
   1415     setOperand(NextLocalInstIndex++, Op);
   1416   }
   1417 
   1418   // Set the next constant ID to the given constant C.
   1419   void setNextConstantID(Ice::Constant *C) { setNextLocalInstIndex(C); }
   1420 
   1421   // Returns the value referenced by the given value Index.
   1422   Ice::Operand *getOperand(NaClBcIndexSize_t Index) {
   1423     if (Index < CachedNumGlobalValueIDs) {
   1424       return Context->getGlobalConstantByID(Index);
   1425     }
   1426     NaClBcIndexSize_t LocalIndex = Index - CachedNumGlobalValueIDs;
   1427     if (LocalIndex >= LocalOperands.size())
   1428       reportGetOperandUndefined(Index);
   1429     Ice::Operand *Op = LocalOperands[LocalIndex];
   1430     if (Op == nullptr)
   1431       reportGetOperandUndefined(Index);
   1432     return Op;
   1433   }
   1434 
   1435 private:
   1436   Ice::TimerMarker Timer;
   1437   // The number of words in the bitstream defining the function block.
   1438   uint64_t NumBytesDefiningFunction = 0;
   1439   // Maximum number of records that can appear in the function block, based on
   1440   // the number of bytes defining the function block.
   1441   uint64_t MaxRecordsInBlock = 0;
   1442   // The corresponding ICE function defined by the function block.
   1443   std::unique_ptr<Ice::Cfg> Func;
   1444   // The index to the current basic block being built.
   1445   NaClBcIndexSize_t CurrentBbIndex = 0;
   1446   // The number of basic blocks declared for the function block.
   1447   NaClBcIndexSize_t DeclaredNumberBbs = 0;
   1448   // The basic block being built.
   1449   Ice::CfgNode *CurrentNode = nullptr;
   1450   // The corresponding function declaration.
   1451   Ice::FunctionDeclaration *FuncDecl;
   1452   // Holds the dividing point between local and global absolute value indices.
   1453   size_t CachedNumGlobalValueIDs;
   1454   // Holds operands local to the function block, based on indices defined in
   1455   // the bitcode file.
   1456   Ice::OperandList LocalOperands;
   1457   // Holds the index within LocalOperands corresponding to the next instruction
   1458   // that generates a value.
   1459   NaClBcIndexSize_t NextLocalInstIndex;
   1460   // True if the last processed instruction was a terminating instruction.
   1461   bool InstIsTerminating = false;
   1462 
   1463   bool ParseBlock(unsigned BlockID) override;
   1464 
   1465   void ProcessRecord() override;
   1466 
   1467   void EnterBlock(unsigned NumWords) override {
   1468     // Note: Bitstream defines words as 32-bit values.
   1469     NumBytesDefiningFunction = NumWords * sizeof(uint32_t);
   1470     // We know that all records are minimally defined by a two-bit abreviation.
   1471     MaxRecordsInBlock = NumBytesDefiningFunction * (CHAR_BIT >> 1);
   1472   }
   1473 
   1474   void ExitBlock() override;
   1475 
   1476   // Creates and appends a new basic block to the list of basic blocks.
   1477   Ice::CfgNode *installNextBasicBlock() {
   1478     Ice::CfgNode *Node = Func->makeNode();
   1479     return Node;
   1480   }
   1481 
   1482   // Returns the Index-th basic block in the list of basic blocks.
   1483   Ice::CfgNode *getBasicBlock(NaClBcIndexSize_t Index) {
   1484     if (Index >= Func->getNumNodes()) {
   1485       std::string Buffer;
   1486       raw_string_ostream StrBuf(Buffer);
   1487       StrBuf << "Reference to basic block " << Index
   1488              << " not found. Must be less than " << Func->getNumNodes();
   1489       Error(StrBuf.str());
   1490       Index = 0;
   1491     }
   1492     return Func->getNodes()[Index];
   1493   }
   1494 
   1495   // Returns the Index-th basic block in the list of basic blocks. Assumes
   1496   // Index corresponds to a branch instruction. Hence, if the branch references
   1497   // the entry block, it also generates a corresponding error.
   1498   Ice::CfgNode *getBranchBasicBlock(NaClBcIndexSize_t Index) {
   1499     if (Index == 0) {
   1500       Error("Branch to entry block not allowed");
   1501     }
   1502     return getBasicBlock(Index);
   1503   }
   1504 
   1505   // Generate an instruction variable with type Ty.
   1506   Ice::Variable *createInstVar(Ice::Type Ty) {
   1507     if (Ty == Ice::IceType_void) {
   1508       Error("Can't define instruction value using type void");
   1509       // Recover since we can't throw an exception.
   1510       Ty = Ice::IceType_i32;
   1511     }
   1512     return Func->makeVariable(Ty);
   1513   }
   1514 
   1515   // Generates the next available local variable using the given type.
   1516   Ice::Variable *getNextInstVar(Ice::Type Ty) {
   1517     assert(NextLocalInstIndex >= CachedNumGlobalValueIDs);
   1518     // Before creating one, see if a forwardtyperef has already defined it.
   1519     NaClBcIndexSize_t LocalIndex = NextLocalInstIndex - CachedNumGlobalValueIDs;
   1520     if (LocalIndex < LocalOperands.size()) {
   1521       Ice::Operand *Op = LocalOperands[LocalIndex];
   1522       if (Op != nullptr) {
   1523         if (auto *Var = dyn_cast<Ice::Variable>(Op)) {
   1524           if (Var->getType() == Ty) {
   1525             ++NextLocalInstIndex;
   1526             return Var;
   1527           }
   1528         }
   1529         std::string Buffer;
   1530         raw_string_ostream StrBuf(Buffer);
   1531         StrBuf << "Illegal forward referenced instruction ("
   1532                << NextLocalInstIndex << "): " << *Op;
   1533         Error(StrBuf.str());
   1534         ++NextLocalInstIndex;
   1535         return createInstVar(Ty);
   1536       }
   1537     }
   1538     Ice::Variable *Var = createInstVar(Ty);
   1539     setOperand(NextLocalInstIndex++, Var);
   1540     return Var;
   1541   }
   1542 
   1543   // Converts a relative index (wrt to BaseIndex) to an absolute value index.
   1544   NaClBcIndexSize_t convertRelativeToAbsIndex(NaClRelBcIndexSize_t Id,
   1545                                               NaClRelBcIndexSize_t BaseIndex) {
   1546     if (BaseIndex < Id) {
   1547       std::string Buffer;
   1548       raw_string_ostream StrBuf(Buffer);
   1549       StrBuf << "Invalid relative value id: " << Id
   1550              << " (must be <= " << BaseIndex << ")";
   1551       Error(StrBuf.str());
   1552       return 0;
   1553     }
   1554     return BaseIndex - Id;
   1555   }
   1556 
   1557   // Sets element Index (in the local operands list) to Op.
   1558   void setOperand(NaClBcIndexSize_t Index, Ice::Operand *Op) {
   1559     assert(Op);
   1560     // Check if simple push works.
   1561     NaClBcIndexSize_t LocalIndex = Index - CachedNumGlobalValueIDs;
   1562     if (LocalIndex == LocalOperands.size()) {
   1563       LocalOperands.push_back(Op);
   1564       return;
   1565     }
   1566 
   1567     // Must be forward reference, expand vector to accommodate.
   1568     if (LocalIndex >= LocalOperands.size()) {
   1569       if (LocalIndex > MaxRecordsInBlock) {
   1570         std::string Buffer;
   1571         raw_string_ostream StrBuf(Buffer);
   1572         StrBuf << "Forward reference @" << Index << " too big. Have "
   1573                << CachedNumGlobalValueIDs << " globals and function contains "
   1574                << NumBytesDefiningFunction << " bytes";
   1575         Fatal(StrBuf.str());
   1576         // Recover by using index one beyond the maximal allowed.
   1577         LocalIndex = MaxRecordsInBlock;
   1578       }
   1579       Ice::Utils::reserveAndResize(LocalOperands, LocalIndex + 1);
   1580     }
   1581 
   1582     // If element not defined, set it.
   1583     Ice::Operand *OldOp = LocalOperands[LocalIndex];
   1584     if (OldOp == nullptr) {
   1585       LocalOperands[LocalIndex] = Op;
   1586       return;
   1587     }
   1588 
   1589     // See if forward reference matches.
   1590     if (OldOp == Op)
   1591       return;
   1592 
   1593     // Error has occurred.
   1594     std::string Buffer;
   1595     raw_string_ostream StrBuf(Buffer);
   1596     StrBuf << "Multiple definitions for index " << Index << ": " << *Op
   1597            << " and " << *OldOp;
   1598     Error(StrBuf.str());
   1599     LocalOperands[LocalIndex] = Op;
   1600   }
   1601 
   1602   // Returns the relative operand (wrt to BaseIndex) referenced by the given
   1603   // value Index.
   1604   Ice::Operand *getRelativeOperand(NaClBcIndexSize_t Index,
   1605                                    NaClBcIndexSize_t BaseIndex) {
   1606     return getOperand(convertRelativeToAbsIndex(Index, BaseIndex));
   1607   }
   1608 
   1609   // Returns the absolute index of the next value generating instruction.
   1610   NaClBcIndexSize_t getNextInstIndex() const { return NextLocalInstIndex; }
   1611 
   1612   // Generates type error message for binary operator Op operating on Type
   1613   // OpTy.
   1614   void reportInvalidBinaryOp(Ice::InstArithmetic::OpKind Op, Ice::Type OpTy);
   1615 
   1616   // Validates if integer logical Op, for type OpTy, is valid. Returns true if
   1617   // valid. Otherwise generates error message and returns false.
   1618   bool isValidIntegerLogicalOp(Ice::InstArithmetic::OpKind Op, Ice::Type OpTy) {
   1619     if (Ice::isIntegerType(OpTy))
   1620       return true;
   1621     reportInvalidBinaryOp(Op, OpTy);
   1622     return false;
   1623   }
   1624 
   1625   // Validates if integer (or vector of integers) arithmetic Op, for type OpTy,
   1626   // is valid. Returns true if valid. Otherwise generates error message and
   1627   // returns false.
   1628   bool isValidIntegerArithOp(Ice::InstArithmetic::OpKind Op, Ice::Type OpTy) {
   1629     if (Ice::isIntegerArithmeticType(OpTy))
   1630       return true;
   1631     reportInvalidBinaryOp(Op, OpTy);
   1632     return false;
   1633   }
   1634 
   1635   // Checks if floating arithmetic Op, for type OpTy, is valid. Returns true if
   1636   // valid. Otherwise generates an error message and returns false;
   1637   bool isValidFloatingArithOp(Ice::InstArithmetic::OpKind Op, Ice::Type OpTy) {
   1638     if (Ice::isFloatingType(OpTy))
   1639       return true;
   1640     reportInvalidBinaryOp(Op, OpTy);
   1641     return false;
   1642   }
   1643 
   1644   // Checks if the type of operand Op is the valid pointer type, for the given
   1645   // InstructionName. Returns true if valid. Otherwise generates an error
   1646   // message and returns false.
   1647   bool isValidPointerType(Ice::Operand *Op, const char *InstructionName) {
   1648     Ice::Type PtrType = Ice::getPointerType();
   1649     if (Op->getType() == PtrType)
   1650       return true;
   1651     std::string Buffer;
   1652     raw_string_ostream StrBuf(Buffer);
   1653     StrBuf << InstructionName << " address not " << PtrType
   1654            << ". Found: " << Op->getType();
   1655     Error(StrBuf.str());
   1656     return false;
   1657   }
   1658 
   1659   // Checks if loading/storing a value of type Ty is allowed. Returns true if
   1660   // Valid. Otherwise generates an error message and returns false.
   1661   bool isValidLoadStoreType(Ice::Type Ty, const char *InstructionName) {
   1662     if (isLoadStoreType(Ty))
   1663       return true;
   1664     std::string Buffer;
   1665     raw_string_ostream StrBuf(Buffer);
   1666     StrBuf << InstructionName << " type not allowed: " << Ty << "*";
   1667     Error(StrBuf.str());
   1668     return false;
   1669   }
   1670 
   1671   // Checks if loading/storing a value of type Ty is allowed for the given
   1672   // Alignment. Otherwise generates an error message and returns false.
   1673   bool isValidLoadStoreAlignment(size_t Alignment, Ice::Type Ty,
   1674                                  const char *InstructionName) {
   1675     if (!isValidLoadStoreType(Ty, InstructionName))
   1676       return false;
   1677     if (isAllowedAlignment(Alignment, Ty))
   1678       return true;
   1679     std::string Buffer;
   1680     raw_string_ostream StrBuf(Buffer);
   1681     StrBuf << InstructionName << " " << Ty << "*: not allowed for alignment "
   1682            << Alignment;
   1683     Error(StrBuf.str());
   1684     return false;
   1685   }
   1686 
   1687   // Defines if the given alignment is valid for the given type. Simplified
   1688   // version of PNaClABIProps::isAllowedAlignment, based on API's offered for
   1689   // Ice::Type.
   1690   bool isAllowedAlignment(size_t Alignment, Ice::Type Ty) const {
   1691     return Alignment == typeAlignInBytes(Ty) ||
   1692            (Alignment == 1 && !isVectorType(Ty));
   1693   }
   1694 
   1695   // Types of errors that can occur for insertelement and extractelement
   1696   // instructions.
   1697   enum VectorIndexCheckValue {
   1698     VectorIndexNotVector,
   1699     VectorIndexNotConstant,
   1700     VectorIndexNotInRange,
   1701     VectorIndexNotI32,
   1702     VectorIndexValid
   1703   };
   1704 
   1705   void dumpVectorIndexCheckValue(raw_ostream &Stream,
   1706                                  VectorIndexCheckValue Value) const {
   1707     if (!Ice::BuildDefs::dump())
   1708       return;
   1709     switch (Value) {
   1710     case VectorIndexNotVector:
   1711       Stream << "Vector index on non vector";
   1712       break;
   1713     case VectorIndexNotConstant:
   1714       Stream << "Vector index not integer constant";
   1715       break;
   1716     case VectorIndexNotInRange:
   1717       Stream << "Vector index not in range of vector";
   1718       break;
   1719     case VectorIndexNotI32:
   1720       Stream << "Vector index not of type " << Ice::IceType_i32;
   1721       break;
   1722     case VectorIndexValid:
   1723       Stream << "Valid vector index";
   1724       break;
   1725     }
   1726   }
   1727 
   1728   // Returns whether the given vector index (for insertelement and
   1729   // extractelement instructions) is valid.
   1730   VectorIndexCheckValue validateVectorIndex(const Ice::Operand *Vec,
   1731                                             const Ice::Operand *Index) const {
   1732     Ice::Type VecType = Vec->getType();
   1733     if (!Ice::isVectorType(VecType))
   1734       return VectorIndexNotVector;
   1735     const auto *C = dyn_cast<Ice::ConstantInteger32>(Index);
   1736     if (C == nullptr)
   1737       return VectorIndexNotConstant;
   1738     if (static_cast<size_t>(C->getValue()) >= typeNumElements(VecType))
   1739       return VectorIndexNotInRange;
   1740     if (Index->getType() != Ice::IceType_i32)
   1741       return VectorIndexNotI32;
   1742     return VectorIndexValid;
   1743   }
   1744 
   1745   // Takes the PNaCl bitcode binary operator Opcode, and the opcode type Ty,
   1746   // and sets Op to the corresponding ICE binary opcode. Returns true if able
   1747   // to convert, false otherwise.
   1748   bool convertBinopOpcode(unsigned Opcode, Ice::Type Ty,
   1749                           Ice::InstArithmetic::OpKind &Op) {
   1750     switch (Opcode) {
   1751     default: {
   1752       std::string Buffer;
   1753       raw_string_ostream StrBuf(Buffer);
   1754       StrBuf << "Binary opcode " << Opcode << "not understood for type " << Ty;
   1755       Error(StrBuf.str());
   1756       Op = Ice::InstArithmetic::Add;
   1757       return false;
   1758     }
   1759     case naclbitc::BINOP_ADD:
   1760       if (Ice::isIntegerType(Ty)) {
   1761         Op = Ice::InstArithmetic::Add;
   1762         return isValidIntegerArithOp(Op, Ty);
   1763       } else {
   1764         Op = Ice::InstArithmetic::Fadd;
   1765         return isValidFloatingArithOp(Op, Ty);
   1766       }
   1767     case naclbitc::BINOP_SUB:
   1768       if (Ice::isIntegerType(Ty)) {
   1769         Op = Ice::InstArithmetic::Sub;
   1770         return isValidIntegerArithOp(Op, Ty);
   1771       } else {
   1772         Op = Ice::InstArithmetic::Fsub;
   1773         return isValidFloatingArithOp(Op, Ty);
   1774       }
   1775     case naclbitc::BINOP_MUL:
   1776       if (Ice::isIntegerType(Ty)) {
   1777         Op = Ice::InstArithmetic::Mul;
   1778         return isValidIntegerArithOp(Op, Ty);
   1779       } else {
   1780         Op = Ice::InstArithmetic::Fmul;
   1781         return isValidFloatingArithOp(Op, Ty);
   1782       }
   1783     case naclbitc::BINOP_UDIV:
   1784       Op = Ice::InstArithmetic::Udiv;
   1785       return isValidIntegerArithOp(Op, Ty);
   1786     case naclbitc::BINOP_SDIV:
   1787       if (Ice::isIntegerType(Ty)) {
   1788         Op = Ice::InstArithmetic::Sdiv;
   1789         return isValidIntegerArithOp(Op, Ty);
   1790       } else {
   1791         Op = Ice::InstArithmetic::Fdiv;
   1792         return isValidFloatingArithOp(Op, Ty);
   1793       }
   1794     case naclbitc::BINOP_UREM:
   1795       Op = Ice::InstArithmetic::Urem;
   1796       return isValidIntegerArithOp(Op, Ty);
   1797     case naclbitc::BINOP_SREM:
   1798       if (Ice::isIntegerType(Ty)) {
   1799         Op = Ice::InstArithmetic::Srem;
   1800         return isValidIntegerArithOp(Op, Ty);
   1801       } else {
   1802         Op = Ice::InstArithmetic::Frem;
   1803         return isValidFloatingArithOp(Op, Ty);
   1804       }
   1805     case naclbitc::BINOP_SHL:
   1806       Op = Ice::InstArithmetic::Shl;
   1807       return isValidIntegerArithOp(Op, Ty);
   1808     case naclbitc::BINOP_LSHR:
   1809       Op = Ice::InstArithmetic::Lshr;
   1810       return isValidIntegerArithOp(Op, Ty);
   1811     case naclbitc::BINOP_ASHR:
   1812       Op = Ice::InstArithmetic::Ashr;
   1813       return isValidIntegerArithOp(Op, Ty);
   1814     case naclbitc::BINOP_AND:
   1815       Op = Ice::InstArithmetic::And;
   1816       return isValidIntegerLogicalOp(Op, Ty);
   1817     case naclbitc::BINOP_OR:
   1818       Op = Ice::InstArithmetic::Or;
   1819       return isValidIntegerLogicalOp(Op, Ty);
   1820     case naclbitc::BINOP_XOR:
   1821       Op = Ice::InstArithmetic::Xor;
   1822       return isValidIntegerLogicalOp(Op, Ty);
   1823     }
   1824   }
   1825 
   1826   /// Simplifies out vector types from Type1 and Type2, if both are vectors of
   1827   /// the same size. Returns true iff both are vectors of the same size, or are
   1828   /// both scalar types.
   1829   static bool simplifyOutCommonVectorType(Ice::Type &Type1, Ice::Type &Type2) {
   1830     bool IsType1Vector = isVectorType(Type1);
   1831     bool IsType2Vector = isVectorType(Type2);
   1832     if (IsType1Vector != IsType2Vector)
   1833       return false;
   1834     if (!IsType1Vector)
   1835       return true;
   1836     if (typeNumElements(Type1) != typeNumElements(Type2))
   1837       return false;
   1838     Type1 = typeElementType(Type1);
   1839     Type2 = typeElementType(Type2);
   1840     return true;
   1841   }
   1842 
   1843   /// Returns true iff an integer truncation from SourceType to TargetType is
   1844   /// valid.
   1845   static bool isIntTruncCastValid(Ice::Type SourceType, Ice::Type TargetType) {
   1846     return Ice::isIntegerType(SourceType) && Ice::isIntegerType(TargetType) &&
   1847            simplifyOutCommonVectorType(SourceType, TargetType) &&
   1848            getScalarIntBitWidth(SourceType) > getScalarIntBitWidth(TargetType);
   1849   }
   1850 
   1851   /// Returns true iff a floating type truncation from SourceType to TargetType
   1852   /// is valid.
   1853   static bool isFloatTruncCastValid(Ice::Type SourceType,
   1854                                     Ice::Type TargetType) {
   1855     return simplifyOutCommonVectorType(SourceType, TargetType) &&
   1856            SourceType == Ice::IceType_f64 && TargetType == Ice::IceType_f32;
   1857   }
   1858 
   1859   /// Returns true iff an integer extension from SourceType to TargetType is
   1860   /// valid.
   1861   static bool isIntExtCastValid(Ice::Type SourceType, Ice::Type TargetType) {
   1862     return isIntTruncCastValid(TargetType, SourceType);
   1863   }
   1864 
   1865   /// Returns true iff a floating type extension from SourceType to TargetType
   1866   /// is valid.
   1867   static bool isFloatExtCastValid(Ice::Type SourceType, Ice::Type TargetType) {
   1868     return isFloatTruncCastValid(TargetType, SourceType);
   1869   }
   1870 
   1871   /// Returns true iff a cast from floating type SourceType to integer type
   1872   /// TargetType is valid.
   1873   static bool isFloatToIntCastValid(Ice::Type SourceType,
   1874                                     Ice::Type TargetType) {
   1875     if (!(Ice::isFloatingType(SourceType) && Ice::isIntegerType(TargetType)))
   1876       return false;
   1877     bool IsSourceVector = isVectorType(SourceType);
   1878     bool IsTargetVector = isVectorType(TargetType);
   1879     if (IsSourceVector != IsTargetVector)
   1880       return false;
   1881     if (IsSourceVector) {
   1882       return typeNumElements(SourceType) == typeNumElements(TargetType);
   1883     }
   1884     return true;
   1885   }
   1886 
   1887   /// Returns true iff a cast from integer type SourceType to floating type
   1888   /// TargetType is valid.
   1889   static bool isIntToFloatCastValid(Ice::Type SourceType,
   1890                                     Ice::Type TargetType) {
   1891     return isFloatToIntCastValid(TargetType, SourceType);
   1892   }
   1893 
   1894   /// Returns the number of bits used to model type Ty when defining the bitcast
   1895   /// instruction.
   1896   static Ice::SizeT bitcastSizeInBits(Ice::Type Ty) {
   1897     if (Ice::isVectorType(Ty))
   1898       return Ice::typeNumElements(Ty) *
   1899              bitcastSizeInBits(Ice::typeElementType(Ty));
   1900     if (Ty == Ice::IceType_i1)
   1901       return 1;
   1902     return Ice::typeWidthInBytes(Ty) * CHAR_BIT;
   1903   }
   1904 
   1905   /// Returns true iff a bitcast from SourceType to TargetType is allowed.
   1906   static bool isBitcastValid(Ice::Type SourceType, Ice::Type TargetType) {
   1907     return bitcastSizeInBits(SourceType) == bitcastSizeInBits(TargetType);
   1908   }
   1909 
   1910   /// Returns true iff the NaCl bitcode Opcode is a valid cast opcode for
   1911   /// converting SourceType to TargetType. Updates CastKind to the corresponding
   1912   /// instruction cast opcode. Also generates an error message when this
   1913   /// function returns false.
   1914   bool convertCastOpToIceOp(uint64_t Opcode, Ice::Type SourceType,
   1915                             Ice::Type TargetType,
   1916                             Ice::InstCast::OpKind &CastKind) {
   1917     bool Result;
   1918     switch (Opcode) {
   1919     default: {
   1920       std::string Buffer;
   1921       raw_string_ostream StrBuf(Buffer);
   1922       StrBuf << "Cast opcode " << Opcode << " not understood.\n";
   1923       Error(StrBuf.str());
   1924       CastKind = Ice::InstCast::Bitcast;
   1925       return false;
   1926     }
   1927     case naclbitc::CAST_TRUNC:
   1928       CastKind = Ice::InstCast::Trunc;
   1929       Result = isIntTruncCastValid(SourceType, TargetType);
   1930       break;
   1931     case naclbitc::CAST_ZEXT:
   1932       CastKind = Ice::InstCast::Zext;
   1933       Result = isIntExtCastValid(SourceType, TargetType);
   1934       break;
   1935     case naclbitc::CAST_SEXT:
   1936       CastKind = Ice::InstCast::Sext;
   1937       Result = isIntExtCastValid(SourceType, TargetType);
   1938       break;
   1939     case naclbitc::CAST_FPTOUI:
   1940       CastKind = Ice::InstCast::Fptoui;
   1941       Result = isFloatToIntCastValid(SourceType, TargetType);
   1942       break;
   1943     case naclbitc::CAST_FPTOSI:
   1944       CastKind = Ice::InstCast::Fptosi;
   1945       Result = isFloatToIntCastValid(SourceType, TargetType);
   1946       break;
   1947     case naclbitc::CAST_UITOFP:
   1948       CastKind = Ice::InstCast::Uitofp;
   1949       Result = isIntToFloatCastValid(SourceType, TargetType);
   1950       break;
   1951     case naclbitc::CAST_SITOFP:
   1952       CastKind = Ice::InstCast::Sitofp;
   1953       Result = isIntToFloatCastValid(SourceType, TargetType);
   1954       break;
   1955     case naclbitc::CAST_FPTRUNC:
   1956       CastKind = Ice::InstCast::Fptrunc;
   1957       Result = isFloatTruncCastValid(SourceType, TargetType);
   1958       break;
   1959     case naclbitc::CAST_FPEXT:
   1960       CastKind = Ice::InstCast::Fpext;
   1961       Result = isFloatExtCastValid(SourceType, TargetType);
   1962       break;
   1963     case naclbitc::CAST_BITCAST:
   1964       CastKind = Ice::InstCast::Bitcast;
   1965       Result = isBitcastValid(SourceType, TargetType);
   1966       break;
   1967     }
   1968     if (!Result) {
   1969       std::string Buffer;
   1970       raw_string_ostream StrBuf(Buffer);
   1971       StrBuf << "Illegal cast: " << Ice::InstCast::getCastName(CastKind) << " "
   1972              << SourceType << " to " << TargetType;
   1973       Error(StrBuf.str());
   1974     }
   1975     return Result;
   1976   }
   1977 
   1978   // Converts PNaCl bitcode Icmp operator to corresponding ICE op. Returns true
   1979   // if able to convert, false otherwise.
   1980   bool convertNaClBitcICmpOpToIce(uint64_t Op,
   1981                                   Ice::InstIcmp::ICond &Cond) const {
   1982     switch (Op) {
   1983     case naclbitc::ICMP_EQ:
   1984       Cond = Ice::InstIcmp::Eq;
   1985       return true;
   1986     case naclbitc::ICMP_NE:
   1987       Cond = Ice::InstIcmp::Ne;
   1988       return true;
   1989     case naclbitc::ICMP_UGT:
   1990       Cond = Ice::InstIcmp::Ugt;
   1991       return true;
   1992     case naclbitc::ICMP_UGE:
   1993       Cond = Ice::InstIcmp::Uge;
   1994       return true;
   1995     case naclbitc::ICMP_ULT:
   1996       Cond = Ice::InstIcmp::Ult;
   1997       return true;
   1998     case naclbitc::ICMP_ULE:
   1999       Cond = Ice::InstIcmp::Ule;
   2000       return true;
   2001     case naclbitc::ICMP_SGT:
   2002       Cond = Ice::InstIcmp::Sgt;
   2003       return true;
   2004     case naclbitc::ICMP_SGE:
   2005       Cond = Ice::InstIcmp::Sge;
   2006       return true;
   2007     case naclbitc::ICMP_SLT:
   2008       Cond = Ice::InstIcmp::Slt;
   2009       return true;
   2010     case naclbitc::ICMP_SLE:
   2011       Cond = Ice::InstIcmp::Sle;
   2012       return true;
   2013     default:
   2014       // Make sure Cond is always initialized.
   2015       Cond = static_cast<Ice::InstIcmp::ICond>(0);
   2016       return false;
   2017     }
   2018   }
   2019 
   2020   // Converts PNaCl bitcode Fcmp operator to corresponding ICE op. Returns true
   2021   // if able to convert, false otherwise.
   2022   bool convertNaClBitcFCompOpToIce(uint64_t Op,
   2023                                    Ice::InstFcmp::FCond &Cond) const {
   2024     switch (Op) {
   2025     case naclbitc::FCMP_FALSE:
   2026       Cond = Ice::InstFcmp::False;
   2027       return true;
   2028     case naclbitc::FCMP_OEQ:
   2029       Cond = Ice::InstFcmp::Oeq;
   2030       return true;
   2031     case naclbitc::FCMP_OGT:
   2032       Cond = Ice::InstFcmp::Ogt;
   2033       return true;
   2034     case naclbitc::FCMP_OGE:
   2035       Cond = Ice::InstFcmp::Oge;
   2036       return true;
   2037     case naclbitc::FCMP_OLT:
   2038       Cond = Ice::InstFcmp::Olt;
   2039       return true;
   2040     case naclbitc::FCMP_OLE:
   2041       Cond = Ice::InstFcmp::Ole;
   2042       return true;
   2043     case naclbitc::FCMP_ONE:
   2044       Cond = Ice::InstFcmp::One;
   2045       return true;
   2046     case naclbitc::FCMP_ORD:
   2047       Cond = Ice::InstFcmp::Ord;
   2048       return true;
   2049     case naclbitc::FCMP_UNO:
   2050       Cond = Ice::InstFcmp::Uno;
   2051       return true;
   2052     case naclbitc::FCMP_UEQ:
   2053       Cond = Ice::InstFcmp::Ueq;
   2054       return true;
   2055     case naclbitc::FCMP_UGT:
   2056       Cond = Ice::InstFcmp::Ugt;
   2057       return true;
   2058     case naclbitc::FCMP_UGE:
   2059       Cond = Ice::InstFcmp::Uge;
   2060       return true;
   2061     case naclbitc::FCMP_ULT:
   2062       Cond = Ice::InstFcmp::Ult;
   2063       return true;
   2064     case naclbitc::FCMP_ULE:
   2065       Cond = Ice::InstFcmp::Ule;
   2066       return true;
   2067     case naclbitc::FCMP_UNE:
   2068       Cond = Ice::InstFcmp::Une;
   2069       return true;
   2070     case naclbitc::FCMP_TRUE:
   2071       Cond = Ice::InstFcmp::True;
   2072       return true;
   2073     default:
   2074       // Make sure Cond is always initialized.
   2075       Cond = static_cast<Ice::InstFcmp::FCond>(0);
   2076       return false;
   2077     }
   2078   }
   2079 
   2080   // Creates an error instruction, generating a value of type Ty, and adds a
   2081   // placeholder so that instruction indices line up. Some instructions, such
   2082   // as a call, will not generate a value if the return type is void. In such
   2083   // cases, a placeholder value for the badly formed instruction is not needed.
   2084   // Hence, if Ty is void, an error instruction is not appended.
   2085   void appendErrorInstruction(Ice::Type Ty) {
   2086     // Note: we don't worry about downstream translation errors because the
   2087     // function will not be translated if any errors occur.
   2088     if (Ty == Ice::IceType_void)
   2089       return;
   2090     Ice::Variable *Var = getNextInstVar(Ty);
   2091     CurrentNode->appendInst(Ice::InstAssign::create(Func.get(), Var, Var));
   2092   }
   2093 
   2094   Ice::Operand *reportGetOperandUndefined(NaClBcIndexSize_t Index) {
   2095     std::string Buffer;
   2096     raw_string_ostream StrBuf(Buffer);
   2097     StrBuf << "Value index " << Index << " not defined!";
   2098     Error(StrBuf.str());
   2099     // Recover and return some value.
   2100     if (!LocalOperands.empty())
   2101       return LocalOperands.front();
   2102     return Context->getGlobalConstantByID(0);
   2103   }
   2104 
   2105   void verifyCallArgTypeMatches(Ice::FunctionDeclaration *Fcn, Ice::SizeT Index,
   2106                                 Ice::Type ArgType, Ice::Type ParamType) {
   2107     if (ArgType != ParamType) {
   2108       std::string Buffer;
   2109       raw_string_ostream StrBuf(Buffer);
   2110       StrBuf << "Argument " << (Index + 1) << " of " << printName(Fcn)
   2111              << " expects " << ParamType << ". Found: " << ArgType;
   2112       Error(StrBuf.str());
   2113     }
   2114   }
   2115 
   2116   const std::string printName(Ice::FunctionDeclaration *Fcn) {
   2117     if (Fcn)
   2118       return Fcn->getName().toString();
   2119     return "function";
   2120   }
   2121 };
   2122 
   2123 void FunctionParser::ExitBlock() {
   2124   // Check if the last instruction in the function was terminating.
   2125   if (!InstIsTerminating) {
   2126     Error("Last instruction in function not terminator");
   2127     // Recover by inserting an unreachable instruction.
   2128     CurrentNode->appendInst(Ice::InstUnreachable::create(Func.get()));
   2129   }
   2130   ++CurrentBbIndex;
   2131   if (CurrentBbIndex != DeclaredNumberBbs) {
   2132     std::string Buffer;
   2133     raw_string_ostream StrBuf(Buffer);
   2134     StrBuf << "Function declared " << DeclaredNumberBbs
   2135            << " basic blocks, but defined " << CurrentBbIndex << ".";
   2136     Error(StrBuf.str());
   2137   }
   2138   // Before translating, check for blocks without instructions, and insert
   2139   // unreachable. This shouldn't happen, but be safe.
   2140   size_t Index = 0;
   2141   for (Ice::CfgNode *Node : Func->getNodes()) {
   2142     if (Node->getInsts().empty()) {
   2143       std::string Buffer;
   2144       raw_string_ostream StrBuf(Buffer);
   2145       StrBuf << "Basic block " << Index << " contains no instructions";
   2146       Error(StrBuf.str());
   2147       Node->appendInst(Ice::InstUnreachable::create(Func.get()));
   2148     }
   2149     ++Index;
   2150   }
   2151   Func->computeInOutEdges();
   2152 }
   2153 
   2154 void FunctionParser::reportInvalidBinaryOp(Ice::InstArithmetic::OpKind Op,
   2155                                            Ice::Type OpTy) {
   2156   std::string Buffer;
   2157   raw_string_ostream StrBuf(Buffer);
   2158   StrBuf << "Invalid operator type for " << Ice::InstArithmetic::getOpName(Op)
   2159          << ". Found " << OpTy;
   2160   Error(StrBuf.str());
   2161 }
   2162 
   2163 void FunctionParser::ProcessRecord() {
   2164   // Note: To better separate parse/IR generation times, when IR generation is
   2165   // disabled we do the following:
   2166   // 1) Delay exiting until after we extract operands.
   2167   // 2) return before we access operands, since all operands will be a nullptr.
   2168   const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
   2169   if (InstIsTerminating) {
   2170     InstIsTerminating = false;
   2171     ++CurrentBbIndex;
   2172     CurrentNode = getBasicBlock(CurrentBbIndex);
   2173   }
   2174   // The base index for relative indexing.
   2175   NaClBcIndexSize_t BaseIndex = getNextInstIndex();
   2176   switch (Record.GetCode()) {
   2177   case naclbitc::FUNC_CODE_DECLAREBLOCKS: {
   2178     // DECLAREBLOCKS: [n]
   2179     if (!isValidRecordSize(1, "count"))
   2180       return;
   2181     if (DeclaredNumberBbs > 0) {
   2182       Error("Duplicate function block count record");
   2183       return;
   2184     }
   2185 
   2186     // Check for bad large sizes, since they can make ridiculous memory
   2187     // requests and hang the user for large amounts of time.
   2188     uint64_t NumBbs = Values[0];
   2189     if (NumBbs > MaxRecordsInBlock) {
   2190       std::string Buffer;
   2191       raw_string_ostream StrBuf(Buffer);
   2192       StrBuf << "Function defines " << NumBbs
   2193              << " basic blocks, which is too big for a function containing "
   2194              << NumBytesDefiningFunction << " bytes";
   2195       Error(StrBuf.str());
   2196       NumBbs = MaxRecordsInBlock;
   2197     }
   2198 
   2199     if (NumBbs == 0) {
   2200       Error("Functions must contain at least one basic block.");
   2201       NumBbs = 1;
   2202     }
   2203 
   2204     DeclaredNumberBbs = NumBbs;
   2205     // Install the basic blocks, skipping bb0 which was created in the
   2206     // constructor.
   2207     for (size_t i = 1; i < NumBbs; ++i)
   2208       installNextBasicBlock();
   2209     return;
   2210   }
   2211   case naclbitc::FUNC_CODE_INST_BINOP: {
   2212     // Note: Old bitcode files may have an additional 'flags' operand, which is
   2213     // ignored.
   2214 
   2215     // BINOP: [opval, opval, opcode, [flags]]
   2216 
   2217     if (!isValidRecordSizeInRange(3, 4, "binop"))
   2218       return;
   2219     Ice::Operand *Op1 = getRelativeOperand(Values[0], BaseIndex);
   2220     Ice::Operand *Op2 = getRelativeOperand(Values[1], BaseIndex);
   2221     Ice::Type Type1 = Op1->getType();
   2222     Ice::Type Type2 = Op2->getType();
   2223     if (Type1 != Type2) {
   2224       std::string Buffer;
   2225       raw_string_ostream StrBuf(Buffer);
   2226       StrBuf << "Binop argument types differ: " << Type1 << " and " << Type2;
   2227       Error(StrBuf.str());
   2228       appendErrorInstruction(Type1);
   2229       return;
   2230     }
   2231 
   2232     Ice::InstArithmetic::OpKind Opcode;
   2233     if (!convertBinopOpcode(Values[2], Type1, Opcode)) {
   2234       appendErrorInstruction(Type1);
   2235       return;
   2236     }
   2237     CurrentNode->appendInst(Ice::InstArithmetic::create(
   2238         Func.get(), Opcode, getNextInstVar(Type1), Op1, Op2));
   2239     return;
   2240   }
   2241   case naclbitc::FUNC_CODE_INST_CAST: {
   2242     // CAST: [opval, destty, castopc]
   2243     if (!isValidRecordSize(3, "cast"))
   2244       return;
   2245     Ice::Operand *Src = getRelativeOperand(Values[0], BaseIndex);
   2246     Ice::Type CastType = Context->getSimpleTypeByID(Values[1]);
   2247     Ice::InstCast::OpKind CastKind;
   2248     if (!convertCastOpToIceOp(Values[2], Src->getType(), CastType, CastKind)) {
   2249       appendErrorInstruction(CastType);
   2250       return;
   2251     }
   2252     CurrentNode->appendInst(Ice::InstCast::create(
   2253         Func.get(), CastKind, getNextInstVar(CastType), Src));
   2254     return;
   2255   }
   2256   case naclbitc::FUNC_CODE_INST_VSELECT: {
   2257     // VSELECT: [opval, opval, pred]
   2258     if (!isValidRecordSize(3, "select"))
   2259       return;
   2260     Ice::Operand *ThenVal = getRelativeOperand(Values[0], BaseIndex);
   2261     Ice::Operand *ElseVal = getRelativeOperand(Values[1], BaseIndex);
   2262     Ice::Operand *CondVal = getRelativeOperand(Values[2], BaseIndex);
   2263     Ice::Type ThenType = ThenVal->getType();
   2264     Ice::Type ElseType = ElseVal->getType();
   2265     if (ThenType != ElseType) {
   2266       std::string Buffer;
   2267       raw_string_ostream StrBuf(Buffer);
   2268       StrBuf << "Select operands not same type. Found " << ThenType << " and "
   2269              << ElseType;
   2270       Error(StrBuf.str());
   2271       appendErrorInstruction(ThenType);
   2272       return;
   2273     }
   2274     Ice::Type CondType = CondVal->getType();
   2275     if (isVectorType(CondType)) {
   2276       if (!isVectorType(ThenType) ||
   2277           typeElementType(CondType) != Ice::IceType_i1 ||
   2278           typeNumElements(ThenType) != typeNumElements(CondType)) {
   2279         std::string Buffer;
   2280         raw_string_ostream StrBuf(Buffer);
   2281         StrBuf << "Select condition type " << CondType
   2282                << " not allowed for values of type " << ThenType;
   2283         Error(StrBuf.str());
   2284         appendErrorInstruction(ThenType);
   2285         return;
   2286       }
   2287     } else if (CondVal->getType() != Ice::IceType_i1) {
   2288       std::string Buffer;
   2289       raw_string_ostream StrBuf(Buffer);
   2290       StrBuf << "Select condition " << CondVal
   2291              << " not type i1. Found: " << CondVal->getType();
   2292       Error(StrBuf.str());
   2293       appendErrorInstruction(ThenType);
   2294       return;
   2295     }
   2296     CurrentNode->appendInst(Ice::InstSelect::create(
   2297         Func.get(), getNextInstVar(ThenType), CondVal, ThenVal, ElseVal));
   2298     return;
   2299   }
   2300   case naclbitc::FUNC_CODE_INST_EXTRACTELT: {
   2301     // EXTRACTELT: [opval, opval]
   2302     if (!isValidRecordSize(2, "extract element"))
   2303       return;
   2304     Ice::Operand *Vec = getRelativeOperand(Values[0], BaseIndex);
   2305     Ice::Operand *Index = getRelativeOperand(Values[1], BaseIndex);
   2306     Ice::Type VecType = Vec->getType();
   2307     VectorIndexCheckValue IndexCheckValue = validateVectorIndex(Vec, Index);
   2308     if (IndexCheckValue != VectorIndexValid) {
   2309       std::string Buffer;
   2310       raw_string_ostream StrBuf(Buffer);
   2311       dumpVectorIndexCheckValue(StrBuf, IndexCheckValue);
   2312       StrBuf << ": extractelement " << VecType << " " << *Vec << ", "
   2313              << Index->getType() << " " << *Index;
   2314       Error(StrBuf.str());
   2315       appendErrorInstruction(VecType);
   2316       return;
   2317     }
   2318     CurrentNode->appendInst(Ice::InstExtractElement::create(
   2319         Func.get(), getNextInstVar(typeElementType(VecType)), Vec, Index));
   2320     return;
   2321   }
   2322   case naclbitc::FUNC_CODE_INST_INSERTELT: {
   2323     // INSERTELT: [opval, opval, opval]
   2324     if (!isValidRecordSize(3, "insert element"))
   2325       return;
   2326     Ice::Operand *Vec = getRelativeOperand(Values[0], BaseIndex);
   2327     Ice::Operand *Elt = getRelativeOperand(Values[1], BaseIndex);
   2328     Ice::Operand *Index = getRelativeOperand(Values[2], BaseIndex);
   2329     Ice::Type VecType = Vec->getType();
   2330     VectorIndexCheckValue IndexCheckValue = validateVectorIndex(Vec, Index);
   2331     if (IndexCheckValue != VectorIndexValid) {
   2332       std::string Buffer;
   2333       raw_string_ostream StrBuf(Buffer);
   2334       dumpVectorIndexCheckValue(StrBuf, IndexCheckValue);
   2335       StrBuf << ": insertelement " << VecType << " " << *Vec << ", "
   2336              << Elt->getType() << " " << *Elt << ", " << Index->getType() << " "
   2337              << *Index;
   2338       Error(StrBuf.str());
   2339       appendErrorInstruction(Elt->getType());
   2340       return;
   2341     }
   2342     if (Ice::typeElementType(VecType) != Elt->getType()) {
   2343       std::string Buffer;
   2344       raw_string_ostream StrBuf(Buffer);
   2345       StrBuf << "Insertelement: Element type "
   2346              << Ice::typeString(Elt->getType()) << " doesn't match vector type "
   2347              << Ice::typeString(VecType);
   2348       Error(StrBuf.str());
   2349       appendErrorInstruction(Elt->getType());
   2350       return;
   2351     }
   2352     CurrentNode->appendInst(Ice::InstInsertElement::create(
   2353         Func.get(), getNextInstVar(VecType), Vec, Elt, Index));
   2354     return;
   2355   }
   2356   case naclbitc::FUNC_CODE_INST_CMP2: {
   2357     // CMP2: [opval, opval, pred]
   2358     if (!isValidRecordSize(3, "compare"))
   2359       return;
   2360     Ice::Operand *Op1 = getRelativeOperand(Values[0], BaseIndex);
   2361     Ice::Operand *Op2 = getRelativeOperand(Values[1], BaseIndex);
   2362     Ice::Type Op1Type = Op1->getType();
   2363     Ice::Type Op2Type = Op2->getType();
   2364     Ice::Type DestType = getCompareResultType(Op1Type);
   2365     if (Op1Type != Op2Type) {
   2366       std::string Buffer;
   2367       raw_string_ostream StrBuf(Buffer);
   2368       StrBuf << "Compare argument types differ: " << Op1Type << " and "
   2369              << Op2Type;
   2370       Error(StrBuf.str());
   2371       appendErrorInstruction(DestType);
   2372       Op2 = Op1;
   2373     }
   2374     if (DestType == Ice::IceType_void) {
   2375       std::string Buffer;
   2376       raw_string_ostream StrBuf(Buffer);
   2377       StrBuf << "Compare not defined for type " << Op1Type;
   2378       Error(StrBuf.str());
   2379       return;
   2380     }
   2381     Ice::Variable *Dest = getNextInstVar(DestType);
   2382     if (isIntegerType(Op1Type)) {
   2383       Ice::InstIcmp::ICond Cond;
   2384       if (!convertNaClBitcICmpOpToIce(Values[2], Cond)) {
   2385         std::string Buffer;
   2386         raw_string_ostream StrBuf(Buffer);
   2387         StrBuf << "Compare record contains unknown integer predicate index: "
   2388                << Values[2];
   2389         Error(StrBuf.str());
   2390         appendErrorInstruction(DestType);
   2391       }
   2392       CurrentNode->appendInst(
   2393           Ice::InstIcmp::create(Func.get(), Cond, Dest, Op1, Op2));
   2394     } else if (isFloatingType(Op1Type)) {
   2395       Ice::InstFcmp::FCond Cond;
   2396       if (!convertNaClBitcFCompOpToIce(Values[2], Cond)) {
   2397         std::string Buffer;
   2398         raw_string_ostream StrBuf(Buffer);
   2399         StrBuf << "Compare record contains unknown float predicate index: "
   2400                << Values[2];
   2401         Error(StrBuf.str());
   2402         appendErrorInstruction(DestType);
   2403       }
   2404       CurrentNode->appendInst(
   2405           Ice::InstFcmp::create(Func.get(), Cond, Dest, Op1, Op2));
   2406     } else {
   2407       // Not sure this can happen, but be safe.
   2408       std::string Buffer;
   2409       raw_string_ostream StrBuf(Buffer);
   2410       StrBuf << "Compare on type not understood: " << Op1Type;
   2411       Error(StrBuf.str());
   2412       appendErrorInstruction(DestType);
   2413       return;
   2414     }
   2415     return;
   2416   }
   2417   case naclbitc::FUNC_CODE_INST_RET: {
   2418     // RET: [opval?]
   2419     InstIsTerminating = true;
   2420     if (!isValidRecordSizeInRange(0, 1, "return"))
   2421       return;
   2422     if (Values.empty()) {
   2423       CurrentNode->appendInst(Ice::InstRet::create(Func.get()));
   2424     } else {
   2425       Ice::Operand *RetVal = getRelativeOperand(Values[0], BaseIndex);
   2426       CurrentNode->appendInst(Ice::InstRet::create(Func.get(), RetVal));
   2427     }
   2428     return;
   2429   }
   2430   case naclbitc::FUNC_CODE_INST_BR: {
   2431     InstIsTerminating = true;
   2432     if (Values.size() == 1) {
   2433       // BR: [bb#]
   2434       Ice::CfgNode *Block = getBranchBasicBlock(Values[0]);
   2435       if (Block == nullptr)
   2436         return;
   2437       CurrentNode->appendInst(Ice::InstBr::create(Func.get(), Block));
   2438     } else {
   2439       // BR: [bb#, bb#, opval]
   2440       if (!isValidRecordSize(3, "branch"))
   2441         return;
   2442       Ice::Operand *Cond = getRelativeOperand(Values[2], BaseIndex);
   2443       if (Cond->getType() != Ice::IceType_i1) {
   2444         std::string Buffer;
   2445         raw_string_ostream StrBuf(Buffer);
   2446         StrBuf << "Branch condition " << *Cond
   2447                << " not i1. Found: " << Cond->getType();
   2448         Error(StrBuf.str());
   2449         return;
   2450       }
   2451       Ice::CfgNode *ThenBlock = getBranchBasicBlock(Values[0]);
   2452       Ice::CfgNode *ElseBlock = getBranchBasicBlock(Values[1]);
   2453       if (ThenBlock == nullptr || ElseBlock == nullptr)
   2454         return;
   2455       CurrentNode->appendInst(
   2456           Ice::InstBr::create(Func.get(), Cond, ThenBlock, ElseBlock));
   2457     }
   2458     return;
   2459   }
   2460   case naclbitc::FUNC_CODE_INST_SWITCH: {
   2461     // SWITCH: [Condty, Cond, BbIndex, NumCases Case ...]
   2462     // where Case = [1, 1, Value, BbIndex].
   2463     //
   2464     // Note: Unlike most instructions, we don't infer the type of Cond, but
   2465     // provide it as a separate field. There are also unnecessary data fields
   2466     // (i.e. constants 1). These were not cleaned up in PNaCl bitcode because
   2467     // the bitcode format was already frozen when the problem was noticed.
   2468     InstIsTerminating = true;
   2469     if (!isValidRecordSizeAtLeast(4, "switch"))
   2470       return;
   2471 
   2472     Ice::Type CondTy = Context->getSimpleTypeByID(Values[0]);
   2473     if (!Ice::isScalarIntegerType(CondTy)) {
   2474       std::string Buffer;
   2475       raw_string_ostream StrBuf(Buffer);
   2476       StrBuf << "Case condition must be non-wide integer. Found: " << CondTy;
   2477       Error(StrBuf.str());
   2478       return;
   2479     }
   2480     Ice::SizeT BitWidth = Ice::getScalarIntBitWidth(CondTy);
   2481     Ice::Operand *Cond = getRelativeOperand(Values[1], BaseIndex);
   2482 
   2483     if (CondTy != Cond->getType()) {
   2484       std::string Buffer;
   2485       raw_string_ostream StrBuf(Buffer);
   2486       StrBuf << "Case condition expects type " << CondTy
   2487              << ". Found: " << Cond->getType();
   2488       Error(StrBuf.str());
   2489       return;
   2490     }
   2491     Ice::CfgNode *DefaultLabel = getBranchBasicBlock(Values[2]);
   2492     if (DefaultLabel == nullptr)
   2493       return;
   2494     uint64_t NumCasesRaw = Values[3];
   2495     if (NumCasesRaw > std::numeric_limits<uint32_t>::max()) {
   2496       std::string Buffer;
   2497       raw_string_ostream StrBuf(Buffer);
   2498       StrBuf << "Too many cases specified in switch: " << NumCasesRaw;
   2499       Error(StrBuf.str());
   2500       NumCasesRaw = std::numeric_limits<uint32_t>::max();
   2501     }
   2502     uint32_t NumCases = NumCasesRaw;
   2503 
   2504     // Now recognize each of the cases.
   2505     if (!isValidRecordSize(4 + NumCases * 4, "switch"))
   2506       return;
   2507     std::unique_ptr<Ice::InstSwitch> Switch(
   2508         Ice::InstSwitch::create(Func.get(), NumCases, Cond, DefaultLabel));
   2509     unsigned ValCaseIndex = 4; // index to beginning of case entry.
   2510     for (uint32_t CaseIndex = 0; CaseIndex < NumCases;
   2511          ++CaseIndex, ValCaseIndex += 4) {
   2512       if (Values[ValCaseIndex] != 1 || Values[ValCaseIndex + 1] != 1) {
   2513         std::string Buffer;
   2514         raw_string_ostream StrBuf(Buffer);
   2515         StrBuf << "Sequence [1, 1, value, label] expected for case entry "
   2516                << "in switch record. (at index" << ValCaseIndex << ")";
   2517         Error(StrBuf.str());
   2518         return;
   2519       }
   2520       BitcodeInt Value(BitWidth,
   2521                        NaClDecodeSignRotatedValue(Values[ValCaseIndex + 2]));
   2522       Ice::CfgNode *Label = getBranchBasicBlock(Values[ValCaseIndex + 3]);
   2523       if (Label == nullptr)
   2524         return;
   2525       Switch->addBranch(CaseIndex, Value.getSExtValue(), Label);
   2526     }
   2527     CurrentNode->appendInst(Switch.release());
   2528     return;
   2529   }
   2530   case naclbitc::FUNC_CODE_INST_UNREACHABLE: {
   2531     // UNREACHABLE: []
   2532     InstIsTerminating = true;
   2533     if (!isValidRecordSize(0, "unreachable"))
   2534       return;
   2535     CurrentNode->appendInst(Ice::InstUnreachable::create(Func.get()));
   2536     return;
   2537   }
   2538   case naclbitc::FUNC_CODE_INST_PHI: {
   2539     // PHI: [ty, val1, bb1, ..., valN, bbN] for n >= 2.
   2540     if (!isValidRecordSizeAtLeast(3, "phi"))
   2541       return;
   2542     Ice::Type Ty = Context->getSimpleTypeByID(Values[0]);
   2543     if ((Values.size() & 0x1) == 0) {
   2544       // Not an odd number of values.
   2545       std::string Buffer;
   2546       raw_string_ostream StrBuf(Buffer);
   2547       StrBuf << "function block phi record size not valid: " << Values.size();
   2548       Error(StrBuf.str());
   2549       appendErrorInstruction(Ty);
   2550       return;
   2551     }
   2552     if (Ty == Ice::IceType_void) {
   2553       Error("Phi record using type void not allowed");
   2554       return;
   2555     }
   2556     Ice::Variable *Dest = getNextInstVar(Ty);
   2557     Ice::InstPhi *Phi =
   2558         Ice::InstPhi::create(Func.get(), Values.size() >> 1, Dest);
   2559     for (size_t i = 1; i < Values.size(); i += 2) {
   2560       Ice::Operand *Op =
   2561           getRelativeOperand(NaClDecodeSignRotatedValue(Values[i]), BaseIndex);
   2562       if (Op->getType() != Ty) {
   2563         std::string Buffer;
   2564         raw_string_ostream StrBuf(Buffer);
   2565         StrBuf << "Value " << *Op << " not type " << Ty
   2566                << " in phi instruction. Found: " << Op->getType();
   2567         Error(StrBuf.str());
   2568         appendErrorInstruction(Ty);
   2569         return;
   2570       }
   2571       Phi->addArgument(Op, getBasicBlock(Values[i + 1]));
   2572     }
   2573     CurrentNode->appendInst(Phi);
   2574     return;
   2575   }
   2576   case naclbitc::FUNC_CODE_INST_ALLOCA: {
   2577     // ALLOCA: [Size, align]
   2578     if (!isValidRecordSize(2, "alloca"))
   2579       return;
   2580     Ice::Operand *ByteCount = getRelativeOperand(Values[0], BaseIndex);
   2581     uint32_t Alignment = Context->extractAlignment(this, "Alloca", Values[1]);
   2582     Ice::Type PtrTy = Ice::getPointerType();
   2583     if (ByteCount->getType() != Ice::IceType_i32) {
   2584       std::string Buffer;
   2585       raw_string_ostream StrBuf(Buffer);
   2586       StrBuf << "Alloca on non-i32 value. Found: " << *ByteCount;
   2587       Error(StrBuf.str());
   2588       appendErrorInstruction(PtrTy);
   2589       return;
   2590     }
   2591     CurrentNode->appendInst(Ice::InstAlloca::create(
   2592         Func.get(), getNextInstVar(PtrTy), ByteCount, Alignment));
   2593     return;
   2594   }
   2595   case naclbitc::FUNC_CODE_INST_LOAD: {
   2596     // LOAD: [address, align, ty]
   2597     if (!isValidRecordSize(3, "load"))
   2598       return;
   2599     Ice::Operand *Address = getRelativeOperand(Values[0], BaseIndex);
   2600     Ice::Type Ty = Context->getSimpleTypeByID(Values[2]);
   2601     uint32_t Alignment = Context->extractAlignment(this, "Load", Values[1]);
   2602     if (!isValidPointerType(Address, "Load")) {
   2603       appendErrorInstruction(Ty);
   2604       return;
   2605     }
   2606     if (!isValidLoadStoreAlignment(Alignment, Ty, "Load")) {
   2607       appendErrorInstruction(Ty);
   2608       return;
   2609     }
   2610     CurrentNode->appendInst(Ice::InstLoad::create(
   2611         Func.get(), getNextInstVar(Ty), Address, Alignment));
   2612     return;
   2613   }
   2614   case naclbitc::FUNC_CODE_INST_STORE: {
   2615     // STORE: [address, value, align]
   2616     if (!isValidRecordSize(3, "store"))
   2617       return;
   2618     Ice::Operand *Address = getRelativeOperand(Values[0], BaseIndex);
   2619     Ice::Operand *Value = getRelativeOperand(Values[1], BaseIndex);
   2620     uint32_t Alignment = Context->extractAlignment(this, "Store", Values[2]);
   2621     if (!isValidPointerType(Address, "Store"))
   2622       return;
   2623     if (!isValidLoadStoreAlignment(Alignment, Value->getType(), "Store"))
   2624       return;
   2625     CurrentNode->appendInst(
   2626         Ice::InstStore::create(Func.get(), Value, Address, Alignment));
   2627     return;
   2628   }
   2629   case naclbitc::FUNC_CODE_INST_CALL:
   2630   case naclbitc::FUNC_CODE_INST_CALL_INDIRECT: {
   2631     // CALL: [cc, fnid, arg0, arg1...]
   2632     // CALL_INDIRECT: [cc, fn, returnty, args...]
   2633     //
   2634     // Note: The difference between CALL and CALL_INDIRECT is that CALL has a
   2635     // reference to an explicit function declaration, while the CALL_INDIRECT
   2636     // is just an address. For CALL, we can infer the return type by looking up
   2637     // the type signature associated with the function declaration. For
   2638     // CALL_INDIRECT we can only infer the type signature via argument types,
   2639     // and the corresponding return type stored in CALL_INDIRECT record.
   2640     Ice::SizeT ParamsStartIndex = 2;
   2641     if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) {
   2642       if (!isValidRecordSizeAtLeast(2, "call"))
   2643         return;
   2644     } else {
   2645       if (!isValidRecordSizeAtLeast(3, "call indirect"))
   2646         return;
   2647       ParamsStartIndex = 3;
   2648     }
   2649 
   2650     uint32_t CalleeIndex = convertRelativeToAbsIndex(Values[1], BaseIndex);
   2651     Ice::Operand *Callee = getOperand(CalleeIndex);
   2652 
   2653     // Pull out signature/return type of call (if possible).
   2654     Ice::FunctionDeclaration *Fcn = nullptr;
   2655     const Ice::FuncSigType *Signature = nullptr;
   2656     Ice::Type ReturnType = Ice::IceType_void;
   2657     const Ice::Intrinsics::FullIntrinsicInfo *IntrinsicInfo = nullptr;
   2658     if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) {
   2659       Fcn = Context->getFunctionByID(CalleeIndex);
   2660       Signature = &Fcn->getSignature();
   2661       ReturnType = Signature->getReturnType();
   2662       Ice::SizeT NumParams = Values.size() - ParamsStartIndex;
   2663       if (NumParams != Signature->getNumArgs()) {
   2664         std::string Buffer;
   2665         raw_string_ostream StrBuf(Buffer);
   2666         StrBuf << "Call to " << printName(Fcn) << " has " << NumParams
   2667                << " parameters. Signature expects: " << Signature->getNumArgs();
   2668         Error(StrBuf.str());
   2669         if (ReturnType != Ice::IceType_void)
   2670           setNextLocalInstIndex(nullptr);
   2671         return;
   2672       }
   2673 
   2674       // Check if this direct call is to an Intrinsic (starts with "llvm.")
   2675       IntrinsicInfo = Fcn->getIntrinsicInfo(getTranslator().getContext());
   2676       if (IntrinsicInfo && IntrinsicInfo->getNumArgs() != NumParams) {
   2677         std::string Buffer;
   2678         raw_string_ostream StrBuf(Buffer);
   2679         StrBuf << "Call to " << printName(Fcn) << " has " << NumParams
   2680                << " parameters. Intrinsic expects: " << Signature->getNumArgs();
   2681         Error(StrBuf.str());
   2682         if (ReturnType != Ice::IceType_void)
   2683           setNextLocalInstIndex(nullptr);
   2684         return;
   2685       }
   2686     } else { // Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL_INDIRECT
   2687       // There is no signature. Assume defined by parameter types.
   2688       ReturnType = Context->getSimpleTypeByID(Values[2]);
   2689       if (Callee != nullptr)
   2690         isValidPointerType(Callee, "Call indirect");
   2691     }
   2692 
   2693     if (Callee == nullptr)
   2694       return;
   2695 
   2696     // Extract out the the call parameters.
   2697     SmallVector<Ice::Operand *, 8> Params;
   2698     for (Ice::SizeT Index = ParamsStartIndex; Index < Values.size(); ++Index) {
   2699       Ice::Operand *Op = getRelativeOperand(Values[Index], BaseIndex);
   2700       if (Op == nullptr) {
   2701         std::string Buffer;
   2702         raw_string_ostream StrBuf(Buffer);
   2703         StrBuf << "Parameter " << (Index - ParamsStartIndex + 1) << " of "
   2704                << printName(Fcn) << " is not defined";
   2705         Error(StrBuf.str());
   2706         if (ReturnType != Ice::IceType_void)
   2707           setNextLocalInstIndex(nullptr);
   2708         return;
   2709       }
   2710       Params.push_back(Op);
   2711     }
   2712 
   2713     // Check return type.
   2714     if (IntrinsicInfo == nullptr && !isCallReturnType(ReturnType)) {
   2715       std::string Buffer;
   2716       raw_string_ostream StrBuf(Buffer);
   2717       StrBuf << "Return type of " << printName(Fcn)
   2718              << " is invalid: " << ReturnType;
   2719       Error(StrBuf.str());
   2720       ReturnType = Ice::IceType_i32;
   2721     }
   2722 
   2723     // Type check call parameters.
   2724     for (Ice::SizeT Index = 0; Index < Params.size(); ++Index) {
   2725       Ice::Operand *Op = Params[Index];
   2726       Ice::Type OpType = Op->getType();
   2727       if (Signature)
   2728         verifyCallArgTypeMatches(Fcn, Index, OpType,
   2729                                  Signature->getArgType(Index));
   2730       else if (!isCallParameterType(OpType)) {
   2731         std::string Buffer;
   2732         raw_string_ostream StrBuf(Buffer);
   2733         StrBuf << "Argument " << *Op << " of " << printName(Fcn)
   2734                << " has invalid type: " << Op->getType();
   2735         Error(StrBuf.str());
   2736         appendErrorInstruction(ReturnType);
   2737         return;
   2738       }
   2739     }
   2740 
   2741     // Extract call information.
   2742     uint64_t CCInfo = Values[0];
   2743     CallingConv::ID CallingConv;
   2744     if (!naclbitc::DecodeCallingConv(CCInfo >> 1, CallingConv)) {
   2745       std::string Buffer;
   2746       raw_string_ostream StrBuf(Buffer);
   2747       StrBuf << "Function call calling convention value " << (CCInfo >> 1)
   2748              << " not understood.";
   2749       Error(StrBuf.str());
   2750       appendErrorInstruction(ReturnType);
   2751       return;
   2752     }
   2753     const bool IsTailCall = (CCInfo & 1);
   2754 
   2755     // Create the call instruction.
   2756     Ice::Variable *Dest = (ReturnType == Ice::IceType_void)
   2757                               ? nullptr
   2758                               : getNextInstVar(ReturnType);
   2759     std::unique_ptr<Ice::InstCall> Instr;
   2760     if (IntrinsicInfo) {
   2761       Instr.reset(Ice::InstIntrinsicCall::create(
   2762           Func.get(), Params.size(), Dest, Callee, IntrinsicInfo->Info));
   2763     } else {
   2764       Instr.reset(Ice::InstCall::create(Func.get(), Params.size(), Dest, Callee,
   2765                                         IsTailCall));
   2766     }
   2767     for (Ice::Operand *Param : Params)
   2768       Instr->addArg(Param);
   2769     CurrentNode->appendInst(Instr.release());
   2770     return;
   2771   }
   2772   case naclbitc::FUNC_CODE_INST_FORWARDTYPEREF: {
   2773     // FORWARDTYPEREF: [opval, ty]
   2774     if (!isValidRecordSize(2, "forward type ref"))
   2775       return;
   2776     Ice::Type OpType = Context->getSimpleTypeByID(Values[1]);
   2777     setOperand(Values[0], createInstVar(OpType));
   2778     return;
   2779   }
   2780   default:
   2781     // Generate error message!
   2782     BlockParserBaseClass::ProcessRecord();
   2783     return;
   2784   }
   2785 }
   2786 
   2787 /// Parses constants within a function block.
   2788 class ConstantsParser final : public BlockParserBaseClass {
   2789   ConstantsParser() = delete;
   2790   ConstantsParser(const ConstantsParser &) = delete;
   2791   ConstantsParser &operator=(const ConstantsParser &) = delete;
   2792 
   2793 public:
   2794   ConstantsParser(unsigned BlockID, FunctionParser *FuncParser)
   2795       : BlockParserBaseClass(BlockID, FuncParser),
   2796         Timer(Ice::TimerStack::TT_parseConstants, getTranslator().getContext()),
   2797         FuncParser(FuncParser) {}
   2798 
   2799   ~ConstantsParser() override = default;
   2800 
   2801   const char *getBlockName() const override { return "constants"; }
   2802 
   2803 private:
   2804   Ice::TimerMarker Timer;
   2805   // The parser of the function block this constants block appears in.
   2806   FunctionParser *FuncParser;
   2807   // The type to use for succeeding constants.
   2808   Ice::Type NextConstantType = Ice::IceType_void;
   2809 
   2810   void ProcessRecord() override;
   2811 
   2812   Ice::GlobalContext *getContext() { return getTranslator().getContext(); }
   2813 
   2814   // Returns true if the type to use for succeeding constants is defined. If
   2815   // false, also generates an error message.
   2816   bool isValidNextConstantType() {
   2817     if (NextConstantType != Ice::IceType_void)
   2818       return true;
   2819     Error("Constant record not preceded by set type record");
   2820     return false;
   2821   }
   2822 };
   2823 
   2824 void ConstantsParser::ProcessRecord() {
   2825   const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
   2826   switch (Record.GetCode()) {
   2827   case naclbitc::CST_CODE_SETTYPE: {
   2828     // SETTYPE: [typeid]
   2829     if (!isValidRecordSize(1, "set type"))
   2830       return;
   2831     NextConstantType = Context->getSimpleTypeByID(Values[0]);
   2832     if (NextConstantType == Ice::IceType_void)
   2833       Error("constants block set type not allowed for void type");
   2834     return;
   2835   }
   2836   case naclbitc::CST_CODE_UNDEF: {
   2837     // UNDEF
   2838     if (!isValidRecordSize(0, "undef"))
   2839       return;
   2840     if (!isValidNextConstantType())
   2841       return;
   2842     FuncParser->setNextConstantID(
   2843         getContext()->getConstantUndef(NextConstantType));
   2844     return;
   2845   }
   2846   case naclbitc::CST_CODE_INTEGER: {
   2847     // INTEGER: [intval]
   2848     if (!isValidRecordSize(1, "integer"))
   2849       return;
   2850     if (!isValidNextConstantType())
   2851       return;
   2852     if (Ice::isScalarIntegerType(NextConstantType)) {
   2853       BitcodeInt Value(Ice::getScalarIntBitWidth(NextConstantType),
   2854                        NaClDecodeSignRotatedValue(Values[0]));
   2855       if (Ice::Constant *C = getContext()->getConstantInt(
   2856               NextConstantType, Value.getSExtValue())) {
   2857         FuncParser->setNextConstantID(C);
   2858         return;
   2859       }
   2860     }
   2861     std::string Buffer;
   2862     raw_string_ostream StrBuf(Buffer);
   2863     StrBuf << "constant block integer record for non-integer type "
   2864            << NextConstantType;
   2865     Error(StrBuf.str());
   2866     return;
   2867   }
   2868   case naclbitc::CST_CODE_FLOAT: {
   2869     // FLOAT: [fpval]
   2870     if (!isValidRecordSize(1, "float"))
   2871       return;
   2872     if (!isValidNextConstantType())
   2873       return;
   2874     switch (NextConstantType) {
   2875     case Ice::IceType_f32: {
   2876       const BitcodeInt Value(32, static_cast<uint32_t>(Values[0]));
   2877       float FpValue = Value.convertToFp<int32_t, float>();
   2878       FuncParser->setNextConstantID(getContext()->getConstantFloat(FpValue));
   2879       return;
   2880     }
   2881     case Ice::IceType_f64: {
   2882       const BitcodeInt Value(64, Values[0]);
   2883       double FpValue = Value.convertToFp<uint64_t, double>();
   2884       FuncParser->setNextConstantID(getContext()->getConstantDouble(FpValue));
   2885       return;
   2886     }
   2887     default: {
   2888       std::string Buffer;
   2889       raw_string_ostream StrBuf(Buffer);
   2890       StrBuf << "constant block float record for non-floating type "
   2891              << NextConstantType;
   2892       Error(StrBuf.str());
   2893       return;
   2894     }
   2895     }
   2896   }
   2897   default:
   2898     // Generate error message!
   2899     BlockParserBaseClass::ProcessRecord();
   2900     return;
   2901   }
   2902 }
   2903 
   2904 // Parses valuesymtab blocks appearing in a function block.
   2905 class FunctionValuesymtabParser final : public ValuesymtabParser {
   2906   FunctionValuesymtabParser() = delete;
   2907   FunctionValuesymtabParser(const FunctionValuesymtabParser &) = delete;
   2908   void operator=(const FunctionValuesymtabParser &) = delete;
   2909 
   2910 public:
   2911   FunctionValuesymtabParser(unsigned BlockID, FunctionParser *EnclosingParser)
   2912       : ValuesymtabParser(BlockID, EnclosingParser),
   2913         Timer(Ice::TimerStack::TT_parseFunctionValuesymtabs,
   2914               getTranslator().getContext()) {}
   2915 
   2916 private:
   2917   Ice::TimerMarker Timer;
   2918   // Returns the enclosing function parser.
   2919   FunctionParser *getFunctionParser() const {
   2920     return reinterpret_cast<FunctionParser *>(GetEnclosingParser());
   2921   }
   2922 
   2923   const char *getTableKind() const override { return "Function"; }
   2924 
   2925   void setValueName(NaClBcIndexSize_t Index, StringType &Name) override;
   2926   void setBbName(NaClBcIndexSize_t Index, StringType &Name) override;
   2927 
   2928   // Reports that the assignment of Name to the value associated with index is
   2929   // not possible, for the given Context.
   2930   void reportUnableToAssign(const char *Context, NaClBcIndexSize_t Index,
   2931                             StringType &Name) {
   2932     std::string Buffer;
   2933     raw_string_ostream StrBuf(Buffer);
   2934     StrBuf << "Function-local " << Context << " name '" << Name
   2935            << "' can't be associated with index " << Index;
   2936     Error(StrBuf.str());
   2937   }
   2938 };
   2939 
   2940 void FunctionValuesymtabParser::setValueName(NaClBcIndexSize_t Index,
   2941                                              StringType &Name) {
   2942   // Note: We check when Index is too small, so that we can error recover
   2943   // (FP->getOperand will create fatal error).
   2944   if (Index < getFunctionParser()->getNumGlobalIDs()) {
   2945     reportUnableToAssign("Global value", Index, Name);
   2946     return;
   2947   }
   2948   Ice::Operand *Op = getFunctionParser()->getOperand(Index);
   2949   if (auto *V = dyn_cast<Ice::Variable>(Op)) {
   2950     if (Ice::BuildDefs::dump()) {
   2951       std::string Nm(Name.data(), Name.size());
   2952       V->setName(getFunctionParser()->getFunc(), Nm);
   2953     }
   2954   } else {
   2955     reportUnableToAssign("Local value", Index, Name);
   2956   }
   2957 }
   2958 
   2959 void FunctionValuesymtabParser::setBbName(NaClBcIndexSize_t Index,
   2960                                           StringType &Name) {
   2961   if (!Ice::BuildDefs::dump())
   2962     return;
   2963   if (Index >= getFunctionParser()->getFunc()->getNumNodes()) {
   2964     reportUnableToAssign("Basic block", Index, Name);
   2965     return;
   2966   }
   2967   std::string Nm(Name.data(), Name.size());
   2968   if (Ice::BuildDefs::dump())
   2969     getFunctionParser()->getFunc()->getNodes()[Index]->setName(Nm);
   2970 }
   2971 
   2972 bool FunctionParser::ParseBlock(unsigned BlockID) {
   2973 #ifndef PNACL_LLVM
   2974   constexpr bool PNaClAllowLocalSymbolTables = true;
   2975 #endif // !PNACL_LLVM
   2976   switch (BlockID) {
   2977   case naclbitc::CONSTANTS_BLOCK_ID: {
   2978     ConstantsParser Parser(BlockID, this);
   2979     return Parser.ParseThisBlock();
   2980   }
   2981   case naclbitc::VALUE_SYMTAB_BLOCK_ID: {
   2982     if (PNaClAllowLocalSymbolTables) {
   2983       FunctionValuesymtabParser Parser(BlockID, this);
   2984       return Parser.ParseThisBlock();
   2985     }
   2986     break;
   2987   }
   2988   default:
   2989     break;
   2990   }
   2991   return BlockParserBaseClass::ParseBlock(BlockID);
   2992 }
   2993 
   2994 /// Parses the module block in the bitcode file.
   2995 class ModuleParser final : public BlockParserBaseClass {
   2996   ModuleParser() = delete;
   2997   ModuleParser(const ModuleParser &) = delete;
   2998   ModuleParser &operator=(const ModuleParser &) = delete;
   2999 
   3000 public:
   3001   ModuleParser(unsigned BlockID, TopLevelParser *Context)
   3002       : BlockParserBaseClass(BlockID, Context),
   3003         Timer(Ice::TimerStack::TT_parseModule,
   3004               Context->getTranslator().getContext()),
   3005         IsParseParallel(Ice::getFlags().isParseParallel()) {}
   3006   ~ModuleParser() override = default;
   3007   const char *getBlockName() const override { return "module"; }
   3008   NaClBitstreamCursor &getCursor() const { return Record.GetCursor(); }
   3009 
   3010 private:
   3011   Ice::TimerMarker Timer;
   3012   // True if we have already installed names for unnamed global declarations,
   3013   // and have generated global constant initializers.
   3014   bool GlobalDeclarationNamesAndInitializersInstalled = false;
   3015   // True if we have already processed the symbol table for the module.
   3016   bool FoundValuesymtab = false;
   3017   const bool IsParseParallel;
   3018 
   3019   // Generates names for unnamed global addresses (i.e. functions and global
   3020   // variables). Then lowers global variable declaration initializers to the
   3021   // target. May be called multiple times. Only the first call will do the
   3022   // installation.
   3023   void installGlobalNamesAndGlobalVarInitializers() {
   3024     if (!GlobalDeclarationNamesAndInitializersInstalled) {
   3025       Context->installGlobalNames();
   3026       Context->createValueIDs();
   3027       Context->verifyFunctionTypeSignatures();
   3028       std::unique_ptr<Ice::VariableDeclarationList> Globals =
   3029           Context->getGlobalVariables();
   3030       if (Globals)
   3031         getTranslator().lowerGlobals(std::move(Globals));
   3032       GlobalDeclarationNamesAndInitializersInstalled = true;
   3033     }
   3034   }
   3035   bool ParseBlock(unsigned BlockID) override;
   3036 
   3037   void ExitBlock() override {
   3038     installGlobalNamesAndGlobalVarInitializers();
   3039     Context->getTranslator().getContext()->waitForWorkerThreads();
   3040   }
   3041 
   3042   void ProcessRecord() override;
   3043 };
   3044 
   3045 class ModuleValuesymtabParser : public ValuesymtabParser {
   3046   ModuleValuesymtabParser() = delete;
   3047   ModuleValuesymtabParser(const ModuleValuesymtabParser &) = delete;
   3048   void operator=(const ModuleValuesymtabParser &) = delete;
   3049 
   3050 public:
   3051   ModuleValuesymtabParser(unsigned BlockID, ModuleParser *MP)
   3052       : ValuesymtabParser(BlockID, MP),
   3053         Timer(Ice::TimerStack::TT_parseModuleValuesymtabs,
   3054               getTranslator().getContext()) {}
   3055 
   3056   ~ModuleValuesymtabParser() override = default;
   3057 
   3058 private:
   3059   Ice::TimerMarker Timer;
   3060   const char *getTableKind() const override { return "Module"; }
   3061   void setValueName(NaClBcIndexSize_t Index, StringType &Name) override;
   3062   void setBbName(NaClBcIndexSize_t Index, StringType &Name) override;
   3063 };
   3064 
   3065 void ModuleValuesymtabParser::setValueName(NaClBcIndexSize_t Index,
   3066                                            StringType &Name) {
   3067   Ice::GlobalDeclaration *Decl = Context->getGlobalDeclarationByID(Index);
   3068   if (llvm::isa<Ice::VariableDeclaration>(Decl) &&
   3069       Decl->isPNaClABIExternalName(Name.str())) {
   3070     // Force linkage of (specific) Global Variables be external for the PNaCl
   3071     // ABI. PNaCl bitcode has a linkage field for Functions, but not for
   3072     // GlobalVariables (because the latter is not needed for pexes, so it has
   3073     // been removed).
   3074     Decl->setLinkage(llvm::GlobalValue::ExternalLinkage);
   3075   }
   3076 
   3077   // Unconditionally capture the name if it is provided in the input file,
   3078   // regardless of whether dump is enabled or whether the symbol is internal vs
   3079   // external.  This fits in well with the lit tests, and most symbols in a
   3080   // conforming pexe are nameless and don't take this path.
   3081   Decl->setName(getTranslator().getContext(),
   3082                 StringRef(Name.data(), Name.size()));
   3083 }
   3084 
   3085 void ModuleValuesymtabParser::setBbName(NaClBcIndexSize_t Index,
   3086                                         StringType &Name) {
   3087   reportUnableToAssign("Basic block", Index, Name);
   3088 }
   3089 
   3090 class CfgParserWorkItem final : public Ice::OptWorkItem {
   3091   CfgParserWorkItem() = delete;
   3092   CfgParserWorkItem(const CfgParserWorkItem &) = delete;
   3093   CfgParserWorkItem &operator=(const CfgParserWorkItem &) = delete;
   3094 
   3095 public:
   3096   CfgParserWorkItem(unsigned BlockID, NaClBcIndexSize_t FcnId,
   3097                     ModuleParser *ModParser, std::unique_ptr<uint8_t[]> Buffer,
   3098                     uintptr_t BufferSize, uint64_t StartBit, uint32_t SeqNumber)
   3099       : BlockID(BlockID), FcnId(FcnId), ModParser(ModParser),
   3100         Buffer(std::move(Buffer)), BufferSize(BufferSize), StartBit(StartBit),
   3101         SeqNumber(SeqNumber) {}
   3102   std::unique_ptr<Ice::Cfg> getParsedCfg() override;
   3103   ~CfgParserWorkItem() override = default;
   3104 
   3105 private:
   3106   const unsigned BlockID;
   3107   const NaClBcIndexSize_t FcnId;
   3108   // Note: ModParser can't be const because the function parser needs to
   3109   // access non-const member functions (of ModuleParser and TopLevelParser).
   3110   // TODO(kschimpf): Fix this issue.
   3111   ModuleParser *ModParser;
   3112   const std::unique_ptr<uint8_t[]> Buffer;
   3113   const uintptr_t BufferSize;
   3114   const uint64_t StartBit;
   3115   const uint32_t SeqNumber;
   3116 };
   3117 
   3118 std::unique_ptr<Ice::Cfg> CfgParserWorkItem::getParsedCfg() {
   3119   NaClBitstreamCursor &OldCursor(ModParser->getCursor());
   3120   llvm::NaClBitstreamReader Reader(OldCursor.getStartWordByteForBit(StartBit),
   3121                                    Buffer.get(), Buffer.get() + BufferSize,
   3122                                    OldCursor.getBitStreamReader());
   3123   NaClBitstreamCursor NewCursor(Reader);
   3124   NewCursor.JumpToBit(NewCursor.getWordBitNo(StartBit));
   3125   FunctionParser Parser(BlockID, ModParser, FcnId, NewCursor);
   3126   return Parser.parseFunction(SeqNumber);
   3127 }
   3128 
   3129 bool ModuleParser::ParseBlock(unsigned BlockID) {
   3130   switch (BlockID) {
   3131   case naclbitc::BLOCKINFO_BLOCK_ID:
   3132     return NaClBitcodeParser::ParseBlock(BlockID);
   3133   case naclbitc::TYPE_BLOCK_ID_NEW: {
   3134     TypesParser Parser(BlockID, this);
   3135     return Parser.ParseThisBlock();
   3136   }
   3137   case naclbitc::GLOBALVAR_BLOCK_ID: {
   3138     GlobalsParser Parser(BlockID, this);
   3139     return Parser.ParseThisBlock();
   3140   }
   3141   case naclbitc::VALUE_SYMTAB_BLOCK_ID: {
   3142     if (FoundValuesymtab)
   3143       Fatal("Duplicate valuesymtab in module");
   3144 
   3145     // If we have already processed a function block (i.e. we have already
   3146     // installed global names and variable initializers) we can no longer accept
   3147     // the value symbol table. Names have already been generated.
   3148     if (GlobalDeclarationNamesAndInitializersInstalled)
   3149       Fatal("Module valuesymtab not allowed after function blocks");
   3150 
   3151     FoundValuesymtab = true;
   3152     ModuleValuesymtabParser Parser(BlockID, this);
   3153     return Parser.ParseThisBlock();
   3154   }
   3155   case naclbitc::FUNCTION_BLOCK_ID: {
   3156     installGlobalNamesAndGlobalVarInitializers();
   3157     Ice::GlobalContext *Ctx = Context->getTranslator().getContext();
   3158     uint32_t SeqNumber = Context->getTranslator().getNextSequenceNumber();
   3159     NaClBcIndexSize_t FcnId = Context->getNextFunctionBlockValueID();
   3160     if (IsParseParallel) {
   3161       // Skip the block and copy into a buffer. Note: We copy into a buffer
   3162       // using the top-level parser to make sure that the underlying
   3163       // buffer reading from the data streamer is not thread safe.
   3164       NaClBitstreamCursor &Cursor = Record.GetCursor();
   3165       uint64_t StartBit = Cursor.GetCurrentBitNo();
   3166       if (SkipBlock())
   3167         return true;
   3168       const uint64_t EndBit = Cursor.GetCurrentBitNo();
   3169       const uintptr_t StartByte = Cursor.getStartWordByteForBit(StartBit);
   3170       const uintptr_t EndByte = Cursor.getEndWordByteForBit(EndBit);
   3171       const uintptr_t BufferSize = EndByte - StartByte;
   3172       std::unique_ptr<uint8_t[]> Buffer((uint8_t *)(new uint8_t[BufferSize]));
   3173       for (size_t i = Cursor.fillBuffer(Buffer.get(), BufferSize, StartByte);
   3174            i < BufferSize; ++i) {
   3175         Buffer[i] = 0;
   3176       }
   3177       Ctx->optQueueBlockingPush(Ice::makeUnique<CfgParserWorkItem>(
   3178           BlockID, FcnId, this, std::move(Buffer), BufferSize, StartBit,
   3179           SeqNumber));
   3180       return false;
   3181     } else {
   3182       FunctionParser Parser(BlockID, this, FcnId);
   3183       std::unique_ptr<Ice::Cfg> Func = Parser.parseFunction(SeqNumber);
   3184       bool Failed = Func->hasError();
   3185       getTranslator().translateFcn(std::move(Func));
   3186       return Failed && !Ice::getFlags().getAllowErrorRecovery();
   3187     }
   3188   }
   3189   default:
   3190     return BlockParserBaseClass::ParseBlock(BlockID);
   3191   }
   3192 }
   3193 
   3194 void ModuleParser::ProcessRecord() {
   3195   const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
   3196   switch (Record.GetCode()) {
   3197   case naclbitc::MODULE_CODE_VERSION: {
   3198     // VERSION: [version#]
   3199     if (!isValidRecordSize(1, "version"))
   3200       return;
   3201     uint64_t Version = Values[0];
   3202     if (Version != 1) {
   3203       std::string Buffer;
   3204       raw_string_ostream StrBuf(Buffer);
   3205       StrBuf << "Unknown bitstream version: " << Version;
   3206       Error(StrBuf.str());
   3207     }
   3208     return;
   3209   }
   3210   case naclbitc::MODULE_CODE_FUNCTION: {
   3211     // FUNCTION:  [type, callingconv, isproto, linkage]
   3212     if (!isValidRecordSize(4, "address"))
   3213       return;
   3214     const Ice::FuncSigType &Signature = Context->getFuncSigTypeByID(Values[0]);
   3215     CallingConv::ID CallingConv;
   3216     if (!naclbitc::DecodeCallingConv(Values[1], CallingConv)) {
   3217       std::string Buffer;
   3218       raw_string_ostream StrBuf(Buffer);
   3219       StrBuf << "Function address has unknown calling convention: "
   3220              << Values[1];
   3221       Error(StrBuf.str());
   3222       return;
   3223     }
   3224     GlobalValue::LinkageTypes Linkage;
   3225     if (!naclbitc::DecodeLinkage(Values[3], Linkage)) {
   3226       std::string Buffer;
   3227       raw_string_ostream StrBuf(Buffer);
   3228       StrBuf << "Function address has unknown linkage. Found " << Values[3];
   3229       Error(StrBuf.str());
   3230       return;
   3231     }
   3232     bool IsProto = Values[2] == 1;
   3233     auto *Func = Ice::FunctionDeclaration::create(
   3234         Context->getTranslator().getContext(), Signature, CallingConv, Linkage,
   3235         IsProto);
   3236     Context->setNextFunctionID(Func);
   3237     return;
   3238   }
   3239   default:
   3240     BlockParserBaseClass::ProcessRecord();
   3241     return;
   3242   }
   3243 }
   3244 
   3245 bool TopLevelParser::ParseBlock(unsigned BlockID) {
   3246   if (BlockID == naclbitc::MODULE_BLOCK_ID) {
   3247     if (ParsedModuleBlock)
   3248       Fatal("Input can't contain more than one module");
   3249     ModuleParser Parser(BlockID, this);
   3250     bool ParseFailed = Parser.ParseThisBlock();
   3251     ParsedModuleBlock = true;
   3252     return ParseFailed;
   3253   }
   3254   // Generate error message by using default block implementation.
   3255   BlockParserBaseClass Parser(BlockID, this);
   3256   return Parser.ParseThisBlock();
   3257 }
   3258 
   3259 } // end of anonymous namespace
   3260 
   3261 namespace Ice {
   3262 
   3263 void PNaClTranslator::translateBuffer(const std::string &IRFilename,
   3264                                       MemoryBuffer *MemBuf) {
   3265   std::unique_ptr<MemoryObject> MemObj(getNonStreamedMemoryObject(
   3266       reinterpret_cast<const unsigned char *>(MemBuf->getBufferStart()),
   3267       reinterpret_cast<const unsigned char *>(MemBuf->getBufferEnd())));
   3268   translate(IRFilename, std::move(MemObj));
   3269 }
   3270 
   3271 void PNaClTranslator::translate(const std::string &IRFilename,
   3272                                 std::unique_ptr<MemoryObject> &&MemObj) {
   3273   // On error, we report_fatal_error to avoid destroying the MemObj. That may
   3274   // still be in use by IceBrowserCompileServer. Otherwise, we need to change
   3275   // the MemObj to be ref-counted, or have a wrapper, or simply leak. We also
   3276   // need a hook to tell the IceBrowserCompileServer to unblock its
   3277   // QueueStreamer.
   3278   // https://code.google.com/p/nativeclient/issues/detail?id=4163
   3279   // Read header and verify it is good.
   3280   NaClBitcodeHeader Header;
   3281   if (Header.Read(MemObj.get())) {
   3282     llvm::report_fatal_error("Invalid PNaCl bitcode header");
   3283   }
   3284   if (!Header.IsSupported()) {
   3285     getContext()->getStrError() << Header.Unsupported();
   3286     if (!Header.IsReadable()) {
   3287       llvm::report_fatal_error("Invalid PNaCl bitcode header");
   3288     }
   3289   }
   3290 
   3291   // Create a bitstream reader to read the bitcode file.
   3292   NaClBitstreamReader InputStreamFile(MemObj.release(), Header);
   3293   NaClBitstreamCursor InputStream(InputStreamFile);
   3294 
   3295   TopLevelParser Parser(*this, InputStream, ErrorStatus);
   3296   while (!InputStream.AtEndOfStream()) {
   3297     if (Parser.Parse()) {
   3298       ErrorStatus.assign(EC_Bitcode);
   3299       return;
   3300     }
   3301   }
   3302 
   3303   if (!Parser.parsedModuleBlock()) {
   3304     std::string Buffer;
   3305     raw_string_ostream StrBuf(Buffer);
   3306     StrBuf << IRFilename << ": Does not contain a module!";
   3307     llvm::report_fatal_error(StrBuf.str());
   3308   }
   3309   if (InputStreamFile.getBitcodeBytes().getExtent() % 4 != 0) {
   3310     llvm::report_fatal_error("Bitcode stream should be a multiple of 4 bytes");
   3311   }
   3312 }
   3313 
   3314 } // end of namespace Ice
   3315