| Index: src/PNaClTranslator.cpp
|
| diff --git a/src/PNaClTranslator.cpp b/src/PNaClTranslator.cpp
|
| index 023a433119266995c2ba026c305db89d07112148..d8d1860f1ef760bf1ac5bda1b21f5cb964562d9e 100644
|
| --- a/src/PNaClTranslator.cpp
|
| +++ b/src/PNaClTranslator.cpp
|
| @@ -41,11 +41,10 @@
|
| namespace {
|
| using namespace llvm;
|
|
|
| -// Models elements in the list of types defined in the types block.
|
| -// These elements can be undefined, a (simple) type, or a function type
|
| -// signature. Note that an extended type is undefined on construction.
|
| -// Use methods setAsSimpleType and setAsFuncSigType to define
|
| -// the extended type.
|
| +// Models elements in the list of types defined in the types block. These
|
| +// elements can be undefined, a (simple) type, or a function type signature.
|
| +// Note that an extended type is undefined on construction. Use methods
|
| +// setAsSimpleType and setAsFuncSigType to define the extended type.
|
| class ExtendedType {
|
| ExtendedType &operator=(const ExtendedType &Ty) = delete;
|
|
|
| @@ -61,8 +60,7 @@ public:
|
| ExtendedType::TypeKind getKind() const { return Kind; }
|
| void dump(Ice::Ostream &Stream) const;
|
|
|
| - /// Changes the extended type to a simple type with the given
|
| - /// value.
|
| + /// Changes the extended type to a simple type with the given / value.
|
| void setAsSimpleType(Ice::Type Ty) {
|
| assert(Kind == Undefined);
|
| Kind = Simple;
|
| @@ -76,8 +74,8 @@ public:
|
| }
|
|
|
| protected:
|
| - // Note: For simple types, the return type of the signature will
|
| - // be used to hold the simple type.
|
| + // Note: For simple types, the return type of the signature will be used to
|
| + // hold the simple type.
|
| Ice::FuncSigType Signature;
|
|
|
| private:
|
| @@ -180,16 +178,15 @@ public:
|
| BlockParser = NewBlockParser;
|
| }
|
|
|
| - /// Generates error with given Message, occurring at BitPosition
|
| - /// within the bitcode file. Always returns true.
|
| + /// Generates error with given Message, occurring at BitPosition within the
|
| + /// bitcode file. Always returns true.
|
| bool ErrorAt(naclbitc::ErrorLevel Level, uint64_t BitPosition,
|
| const std::string &Message) final;
|
|
|
| /// Generates error message with respect to the current block parser.
|
| bool blockError(const std::string &Message);
|
|
|
| - /// Returns the number of errors found while parsing the bitcode
|
| - /// file.
|
| + /// Returns the number of errors found while parsing the bitcode file.
|
| unsigned getNumErrors() const { return NumErrors; }
|
|
|
| /// Changes the size of the type list to the given size.
|
| @@ -202,11 +199,11 @@ public:
|
| return Translator.getFlags().getDisableIRGeneration();
|
| }
|
|
|
| - /// Returns the undefined type associated with type ID.
|
| - /// Note: Returns extended type ready to be defined.
|
| + /// Returns the undefined type associated with type ID. Note: Returns extended
|
| + /// type ready to be defined.
|
| ExtendedType *getTypeByIDForDefining(NaClBcIndexSize_t ID) {
|
| - // Get corresponding element, verifying the value is still undefined
|
| - // (and hence allowed to be defined).
|
| + // Get corresponding element, verifying the value is still undefined (and
|
| + // hence allowed to be defined).
|
| ExtendedType *Ty = getTypeByIDAsKind(ID, ExtendedType::Undefined);
|
| if (Ty)
|
| return Ty;
|
| @@ -248,9 +245,9 @@ public:
|
| FunctionDeclarations.push_back(Fcn);
|
| }
|
|
|
| - /// Returns the value id that should be associated with the the
|
| - /// current function block. Increments internal counters during call
|
| - /// so that it will be in correct position for next function block.
|
| + /// Returns the value id that should be associated with the the current
|
| + /// function block. Increments internal counters during call so that it will
|
| + /// be in correct position for next function block.
|
| NaClBcIndexSize_t getNextFunctionBlockValueID() {
|
| size_t NumDeclaredFunctions = FunctionDeclarations.size();
|
| while (NextDefiningFunctionID < NumDeclaredFunctions &&
|
| @@ -274,9 +271,9 @@ public:
|
| return ValueIDConstants[ID];
|
| }
|
|
|
| - /// Install names for all global values without names. Called after
|
| - /// the global value symbol table is processed, but before any
|
| - /// function blocks are processed.
|
| + /// Install names for all global values without names. Called after the global
|
| + /// value symbol table is processed, but before any function blocks are
|
| + /// processed.
|
| void installGlobalNames() {
|
| assert(VariableDeclarations);
|
| installGlobalVarNames();
|
| @@ -294,8 +291,8 @@ public:
|
| /// Returns the number of function declarations in the bitcode file.
|
| size_t getNumFunctionIDs() const { return FunctionDeclarations.size(); }
|
|
|
| - /// Returns the number of global declarations (i.e. IDs) defined in
|
| - /// the bitcode file.
|
| + /// Returns the number of global declarations (i.e. IDs) defined in the
|
| + /// bitcode file.
|
| size_t getNumGlobalIDs() const {
|
| if (VariableDeclarations) {
|
| return FunctionDeclarations.size() + VariableDeclarations->size();
|
| @@ -319,8 +316,8 @@ public:
|
| return reportGetGlobalVariableByIDError(Index);
|
| }
|
|
|
| - /// Returns the global declaration (variable or function) with the
|
| - /// given Index.
|
| + /// Returns the global declaration (variable or function) with the given
|
| + /// Index.
|
| Ice::GlobalDeclaration *getGlobalDeclarationByID(NaClBcIndexSize_t Index) {
|
| size_t NumFunctionIds = FunctionDeclarations.size();
|
| if (Index < NumFunctionIds)
|
| @@ -329,13 +326,12 @@ public:
|
| return getGlobalVariableByID(Index - NumFunctionIds);
|
| }
|
|
|
| - /// Returns the list of parsed global variable
|
| - /// declarations. Releases ownership of the current list of global
|
| - /// variables. Note: only returns non-null pointer on first
|
| - /// call. All successive calls return a null pointer.
|
| + /// Returns the list of parsed global variable declarations. Releases
|
| + /// ownership of the current list of global variables. Note: only returns
|
| + /// non-null pointer on first call. All successive calls return a null
|
| + /// pointer.
|
| std::unique_ptr<Ice::VariableDeclarationList> getGlobalVariables() {
|
| - // Before returning, check that ValidIDConstants has already been
|
| - // built.
|
| + // Before returning, check that ValidIDConstants has already been built.
|
| assert(!VariableDeclarations ||
|
| VariableDeclarations->size() <= ValueIDConstants.size());
|
| return std::move(VariableDeclarations);
|
| @@ -364,16 +360,14 @@ private:
|
| Ice::ConstantList ValueIDConstants;
|
| // Error recovery value to use when getFuncSigTypeByID fails.
|
| Ice::FuncSigType UndefinedFuncSigType;
|
| - // The block parser currently being applied. Used for error
|
| - // reporting.
|
| + // The block parser currently being applied. Used for error reporting.
|
| BlockParserBaseClass *BlockParser = nullptr;
|
|
|
| bool ParseBlock(unsigned BlockID) override;
|
|
|
| - // Gets extended type associated with the given index, assuming the
|
| - // extended type is of the WantedKind. Generates error message if
|
| - // corresponding extended type of WantedKind can't be found, and
|
| - // returns nullptr.
|
| + // Gets extended type associated with the given index, assuming the extended
|
| + // type is of the WantedKind. Generates error message if corresponding
|
| + // extended type of WantedKind can't be found, and returns nullptr.
|
| ExtendedType *getTypeByIDAsKind(NaClBcIndexSize_t ID,
|
| ExtendedType::TypeKind WantedKind) {
|
| ExtendedType *Ty = nullptr;
|
| @@ -387,12 +381,11 @@ private:
|
| return nullptr;
|
| }
|
|
|
| - // Gives Decl a name if it doesn't already have one. Prefix and
|
| - // NameIndex are used to generate the name. NameIndex is
|
| - // automatically incremented if a new name is created. DeclType is
|
| - // literal text describing the type of name being created. Also
|
| - // generates warning if created names may conflict with named
|
| - // declarations.
|
| + // Gives Decl a name if it doesn't already have one. Prefix and NameIndex are
|
| + // used to generate the name. NameIndex is automatically incremented if a new
|
| + // name is created. DeclType is literal text describing the type of name
|
| + // being created. Also generates warning if created names may conflict with
|
| + // named declarations.
|
| void installDeclarationName(Ice::GlobalDeclaration *Decl,
|
| const Ice::IceString &Prefix,
|
| const char *DeclType,
|
| @@ -431,7 +424,7 @@ private:
|
| }
|
|
|
| // Builds a constant symbol named Name, suppressing name mangling if
|
| - // SuppressMangling. IsExternal is true iff the symbol is external.
|
| + // SuppressMangling. IsExternal is true iff the symbol is external.
|
| Ice::Constant *getConstantSym(const Ice::IceString &Name,
|
| bool SuppressMangling, bool IsExternal) const {
|
| if (IsExternal) {
|
| @@ -471,17 +464,17 @@ private:
|
| void reportBadTypeIDAs(NaClBcIndexSize_t ID, const ExtendedType *Ty,
|
| ExtendedType::TypeKind WantedType);
|
|
|
| - // Reports that there is no function declaration for ID. Returns an
|
| - // error recovery value to use.
|
| + // Reports that there is no function declaration for ID. Returns an error
|
| + // recovery value to use.
|
| Ice::FunctionDeclaration *reportGetFunctionByIDError(NaClBcIndexSize_t ID);
|
|
|
| - // Reports that there is not global variable declaration for
|
| - // ID. Returns an error recovery value to use.
|
| + // Reports that there is not global variable declaration for ID. Returns an
|
| + // error recovery value to use.
|
| Ice::VariableDeclaration *
|
| reportGetGlobalVariableByIDError(NaClBcIndexSize_t Index);
|
|
|
| - // Reports that there is no corresponding ICE type for LLVMTy, and
|
| - // returns Ice::IceType_void.
|
| + // Reports that there is no corresponding ICE type for LLVMTy, and returns
|
| + // Ice::IceType_void.
|
| Ice::Type convertToIceTypeError(Type *LLVMTy);
|
| };
|
|
|
| @@ -549,10 +542,9 @@ Ice::Type TopLevelParser::convertToIceTypeError(Type *LLVMTy) {
|
| return Ice::IceType_void;
|
| }
|
|
|
| -// Base class for parsing blocks within the bitcode file. Note:
|
| -// Because this is the base class of block parsers, we generate error
|
| -// messages if ParseBlock or ParseRecord is not overridden in derived
|
| -// classes.
|
| +// Base class for parsing blocks within the bitcode file. Note: Because this is
|
| +// the base class of block parsers, we generate error messages if ParseBlock or
|
| +// ParseRecord is not overridden in derived classes.
|
| class BlockParserBaseClass : public NaClBitcodeParser {
|
| BlockParserBaseClass() = delete;
|
| BlockParserBaseClass(const BlockParserBaseClass &) = delete;
|
| @@ -595,16 +587,15 @@ protected:
|
| return getTranslator().getFlags().getDisableIRGeneration();
|
| }
|
|
|
| - // Default implementation. Reports that block is unknown and skips
|
| - // its contents.
|
| + // Default implementation. Reports that block is unknown and skips its
|
| + // contents.
|
| bool ParseBlock(unsigned BlockID) override;
|
|
|
| - // Default implementation. Reports that the record is not
|
| - // understood.
|
| + // Default implementation. Reports that the record is not understood.
|
| void ProcessRecord() override;
|
|
|
| - // Checks if the size of the record is Size. Return true if valid.
|
| - // Otherwise generates an error and returns false.
|
| + // Checks if the size of the record is Size. Return true if valid. Otherwise
|
| + // generates an error and returns false.
|
| bool isValidRecordSize(size_t Size, const char *RecordName) {
|
| const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
|
| if (Values.size() == Size)
|
| @@ -613,9 +604,8 @@ protected:
|
| return false;
|
| }
|
|
|
| - // Checks if the size of the record is at least as large as the
|
| - // LowerLimit. Returns true if valid. Otherwise generates an error
|
| - // and returns false.
|
| + // Checks if the size of the record is at least as large as the LowerLimit.
|
| + // Returns true if valid. Otherwise generates an error and returns false.
|
| bool isValidRecordSizeAtLeast(size_t LowerLimit, const char *RecordName) {
|
| const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
|
| if (Values.size() >= LowerLimit)
|
| @@ -625,8 +615,8 @@ protected:
|
| }
|
|
|
| // Checks if the size of the record is no larger than the
|
| - // UpperLimit. Returns true if valid. Otherwise generates an error
|
| - // and returns false.
|
| + // UpperLimit. Returns true if valid. Otherwise generates an error and
|
| + // returns false.
|
| bool isValidRecordSizeAtMost(size_t UpperLimit, const char *RecordName) {
|
| const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
|
| if (Values.size() <= UpperLimit)
|
| @@ -635,9 +625,9 @@ protected:
|
| return false;
|
| }
|
|
|
| - // Checks if the size of the record is at least as large as the
|
| - // LowerLimit, and no larger than the UpperLimit. Returns true if
|
| - // valid. Otherwise generates an error and returns false.
|
| + // Checks if the size of the record is at least as large as the LowerLimit,
|
| + // and no larger than the UpperLimit. Returns true if valid. Otherwise
|
| + // generates an error and returns false.
|
| bool isValidRecordSizeInRange(size_t LowerLimit, size_t UpperLimit,
|
| const char *RecordName) {
|
| return isValidRecordSizeAtLeast(LowerLimit, RecordName) ||
|
| @@ -645,11 +635,10 @@ protected:
|
| }
|
|
|
| private:
|
| - /// Generates a record size error. ExpectedSize is the number
|
| - /// of elements expected. RecordName is the name of the kind of
|
| - /// record that has incorrect size. ContextMessage (if not nullptr)
|
| - /// is appended to "record expects" to describe how ExpectedSize
|
| - /// should be interpreted.
|
| + /// Generates a record size error. ExpectedSize is the number of elements
|
| + /// expected. RecordName is the name of the kind of record that has incorrect
|
| + /// size. ContextMessage (if not nullptr) is appended to "record expects" to
|
| + /// describe how ExpectedSize should be interpreted.
|
| void reportRecordSizeError(size_t ExpectedSize, const char *RecordName,
|
| const char *ContextMessage);
|
| };
|
| @@ -666,9 +655,9 @@ bool BlockParserBaseClass::ErrorAt(naclbitc::ErrorLevel Level, uint64_t Bit,
|
| const std::string &Message) {
|
| std::string Buffer;
|
| raw_string_ostream StrBuf(Buffer);
|
| - // Note: If dump routines have been turned off, the error messages
|
| - // will not be readable. Hence, replace with simple error. We also
|
| - // use the simple form for unit tests.
|
| + // Note: If dump routines have been turned off, the error messages will not
|
| + // be readable. Hence, replace with simple error. We also use the simple form
|
| + // for unit tests.
|
| if (getFlags().getGenerateUnitTestMessages()) {
|
| StrBuf << "Invalid " << getBlockName() << " record: <" << Record.GetCode();
|
| for (const uint64_t Val : Record.GetValues()) {
|
| @@ -700,8 +689,8 @@ void BlockParserBaseClass::reportRecordSizeError(size_t ExpectedSize,
|
| }
|
|
|
| bool BlockParserBaseClass::ParseBlock(unsigned BlockID) {
|
| - // If called, derived class doesn't know how to handle block.
|
| - // Report error and skip.
|
| + // If called, derived class doesn't know how to handle block. Report error
|
| + // and skip.
|
| std::string Buffer;
|
| raw_string_ostream StrBuf(Buffer);
|
| StrBuf << "Don't know how to parse block id: " << BlockID;
|
| @@ -742,8 +731,8 @@ public:
|
|
|
| private:
|
| Ice::TimerMarker Timer;
|
| - // The type ID that will be associated with the next type defining
|
| - // record in the types block.
|
| + // The type ID that will be associated with the next type defining record in
|
| + // the types block.
|
| NaClBcIndexSize_t NextTypeId = 0;
|
|
|
| // The expected number of types, based on record TYPE_CODE_NUMENTRY.
|
| @@ -773,13 +762,11 @@ void TypesParser::ProcessRecord() {
|
| Error(StrBuf.str());
|
| ExpectedNumTypes = NaClBcIndexSize_t_Max;
|
| }
|
| - // The code double checks that Expected size and the actual size
|
| - // at the end of the block. To reduce allocations we preallocate
|
| - // the space.
|
| + // The code double checks that Expected size and the actual size at the end
|
| + // of the block. To reduce allocations we preallocate the space.
|
| //
|
| - // However, if the number is large, we suspect that the number
|
| - // is (possibly) incorrect. In that case, we preallocate a
|
| - // smaller space.
|
| + // However, if the number is large, we suspect that the number is
|
| + // (possibly) incorrect. In that case, we preallocate a smaller space.
|
| constexpr uint64_t DefaultLargeResizeValue = 1000000;
|
| Context->resizeTypeIDValues(std::min(Size, DefaultLargeResizeValue));
|
| ExpectedNumTypes = Size;
|
| @@ -902,9 +889,9 @@ void TypesParser::ProcessRecord() {
|
| FuncSigExtendedType *FuncTy = cast<FuncSigExtendedType>(Ty);
|
| FuncTy->setReturnType(Context->getSimpleTypeByID(Values[1]));
|
| for (size_t i = 2, e = Values.size(); i != e; ++i) {
|
| - // Check that type void not used as argument type.
|
| - // Note: PNaCl restrictions can't be checked until we
|
| - // know the name, because we have to check for intrinsic signatures.
|
| + // Check that type void not used as argument type. Note: PNaCl
|
| + // restrictions can't be checked until we know the name, because we have
|
| + // to check for intrinsic signatures.
|
| Ice::Type ArgTy = Context->getSimpleTypeByID(Values[i]);
|
| if (ArgTy == Ice::IceType_void) {
|
| std::string Buffer;
|
| @@ -956,8 +943,8 @@ private:
|
| // Holds the number of defined function IDs.
|
| NaClBcIndexSize_t NumFunctionIDs;
|
|
|
| - // Holds the specified number of global variables by the count record in
|
| - // the global variables block.
|
| + // Holds the specified number of global variables by the count record in the
|
| + // global variables block.
|
| NaClBcIndexSize_t SpecifiedNumberVars = 0;
|
|
|
| // Keeps track of how many initializers are expected for the global variable
|
| @@ -967,9 +954,8 @@ private:
|
| // The index of the next global variable declaration.
|
| NaClBcIndexSize_t NextGlobalID = 0;
|
|
|
| - // Dummy global variable declaration to guarantee CurGlobalVar is
|
| - // always defined (allowing code to not need to check if
|
| - // CurGlobalVar is nullptr).
|
| + // Dummy global variable declaration to guarantee CurGlobalVar is always
|
| + // defined (allowing code to not need to check if CurGlobalVar is nullptr).
|
| Ice::VariableDeclaration *DummyGlobalVar;
|
|
|
| // Holds the current global variable declaration being built.
|
| @@ -1230,14 +1216,13 @@ public:
|
| getTranslator().getContext()->pushTimer(TimerID, StackID);
|
| }
|
|
|
| - // Note: The Cfg is created, even when IR generation is disabled. This
|
| - // is done to install a CfgLocalAllocator for various internal containers.
|
| + // Note: The Cfg is created, even when IR generation is disabled. This is
|
| + // done to install a CfgLocalAllocator for various internal containers.
|
| Func = Ice::Cfg::create(getTranslator().getContext(),
|
| getTranslator().getNextSequenceNumber());
|
| Ice::Cfg::setCurrentCfg(Func.get());
|
|
|
| - // TODO(kschimpf) Clean up API to add a function signature to
|
| - // a CFG.
|
| + // TODO(kschimpf) Clean up API to add a function signature to a CFG.
|
| const Ice::FuncSigType &Signature = FuncDecl->getSignature();
|
| if (isIRGenerationDisabled()) {
|
| CurrentNode = nullptr;
|
| @@ -1257,17 +1242,17 @@ public:
|
| }
|
| bool ParserResult = ParseThisBlock();
|
|
|
| - // Temporarily end per-function timing, which will be resumed by
|
| - // the translator function. This is because translation may be
|
| - // done asynchronously in a separate thread.
|
| + // Temporarily end per-function timing, which will be resumed by the
|
| + // translator function. This is because translation may be done
|
| + // asynchronously in a separate thread.
|
| if (TimeThisFunction)
|
| getTranslator().getContext()->popTimer(TimerID, StackID);
|
|
|
| Ice::Cfg::setCurrentCfg(nullptr);
|
| - // Note: Once any errors have been found, we turn off all
|
| - // translation of all remaining functions. This allows successive
|
| - // parsing errors to be reported, without adding extra checks to
|
| - // the translator for such parsing errors.
|
| + // Note: Once any errors have been found, we turn off all translation of
|
| + // all remaining functions. This allows successive parsing errors to be
|
| + // reported, without adding extra checks to the translator for such parsing
|
| + // errors.
|
| if (Context->getNumErrors() == 0 && Func) {
|
| getTranslator().translateFcn(std::move(Func));
|
| // The translator now has ownership of Func.
|
| @@ -1332,21 +1317,20 @@ private:
|
| Ice::FunctionDeclaration *FuncDecl;
|
| // Holds the dividing point between local and global absolute value indices.
|
| size_t CachedNumGlobalValueIDs;
|
| - // Holds operands local to the function block, based on indices
|
| - // defined in the bitcode file.
|
| + // Holds operands local to the function block, based on indices defined in
|
| + // the bitcode file.
|
| Ice::OperandList LocalOperands;
|
| - // Holds the index within LocalOperands corresponding to the next
|
| - // instruction that generates a value.
|
| + // Holds the index within LocalOperands corresponding to the next instruction
|
| + // that generates a value.
|
| NaClBcIndexSize_t NextLocalInstIndex;
|
| - // True if the last processed instruction was a terminating
|
| - // instruction.
|
| + // True if the last processed instruction was a terminating instruction.
|
| bool InstIsTerminating = false;
|
| // Upper limit of alignment power allowed by LLVM
|
| static const uint32_t AlignPowerLimit = 29;
|
|
|
| - // Extracts the corresponding Alignment to use, given the AlignPower
|
| - // (i.e. 2**(AlignPower-1), or 0 if AlignPower == 0). InstName is the
|
| - // name of the instruction the alignment appears in.
|
| + // Extracts the corresponding Alignment to use, given the AlignPower (i.e.
|
| + // 2**(AlignPower-1), or 0 if AlignPower == 0). InstName is the name of the
|
| + // instruction the alignment appears in.
|
| void extractAlignment(const char *InstName, uint32_t AlignPower,
|
| uint32_t &Alignment) {
|
| if (AlignPower <= AlignPowerLimit + 1) {
|
| @@ -1396,10 +1380,9 @@ private:
|
| return Func->getNodes()[Index];
|
| }
|
|
|
| - // Returns the Index-th basic block in the list of basic blocks.
|
| - // Assumes Index corresponds to a branch instruction. Hence, if
|
| - // the branch references the entry block, it also generates a
|
| - // corresponding error.
|
| + // Returns the Index-th basic block in the list of basic blocks. Assumes
|
| + // Index corresponds to a branch instruction. Hence, if the branch references
|
| + // the entry block, it also generates a corresponding error.
|
| Ice::CfgNode *getBranchBasicBlock(NaClBcIndexSize_t Index) {
|
| assert(!isIRGenerationDisabled());
|
| if (Index == 0) {
|
| @@ -1448,8 +1431,7 @@ private:
|
| return Var;
|
| }
|
|
|
| - // Converts a relative index (wrt to BaseIndex) to an absolute value
|
| - // index.
|
| + // Converts a relative index (wrt to BaseIndex) to an absolute value index.
|
| NaClBcIndexSize_t convertRelativeToAbsIndex(NaClRelBcIndexSize_t Id,
|
| NaClRelBcIndexSize_t BaseIndex) {
|
| if (BaseIndex < Id) {
|
| @@ -1508,8 +1490,8 @@ private:
|
| LocalOperands[LocalIndex] = Op;
|
| }
|
|
|
| - // Returns the relative operand (wrt to BaseIndex) referenced by
|
| - // the given value Index.
|
| + // Returns the relative operand (wrt to BaseIndex) referenced by the given
|
| + // value Index.
|
| Ice::Operand *getRelativeOperand(NaClBcIndexSize_t Index,
|
| NaClBcIndexSize_t BaseIndex) {
|
| return getOperand(convertRelativeToAbsIndex(Index, BaseIndex));
|
| @@ -1518,13 +1500,12 @@ private:
|
| // Returns the absolute index of the next value generating instruction.
|
| NaClBcIndexSize_t getNextInstIndex() const { return NextLocalInstIndex; }
|
|
|
| - // Generates type error message for binary operator Op
|
| - // operating on Type OpTy.
|
| + // Generates type error message for binary operator Op operating on Type
|
| + // OpTy.
|
| void reportInvalidBinaryOp(Ice::InstArithmetic::OpKind Op, Ice::Type OpTy);
|
|
|
| - // Validates if integer logical Op, for type OpTy, is valid.
|
| - // Returns true if valid. Otherwise generates error message and
|
| - // returns false.
|
| + // Validates if integer logical Op, for type OpTy, is valid. Returns true if
|
| + // valid. Otherwise generates error message and returns false.
|
| bool isValidIntegerLogicalOp(Ice::InstArithmetic::OpKind Op, Ice::Type OpTy) {
|
| if (Ice::isIntegerType(OpTy))
|
| return true;
|
| @@ -1532,9 +1513,9 @@ private:
|
| return false;
|
| }
|
|
|
| - // Validates if integer (or vector of integers) arithmetic Op, for type
|
| - // OpTy, is valid. Returns true if valid. Otherwise generates
|
| - // error message and returns false.
|
| + // Validates if integer (or vector of integers) arithmetic Op, for type OpTy,
|
| + // is valid. Returns true if valid. Otherwise generates error message and
|
| + // returns false.
|
| bool isValidIntegerArithOp(Ice::InstArithmetic::OpKind Op, Ice::Type OpTy) {
|
| if (Ice::isIntegerArithmeticType(OpTy))
|
| return true;
|
| @@ -1542,9 +1523,8 @@ private:
|
| return false;
|
| }
|
|
|
| - // Checks if floating arithmetic Op, for type OpTy, is valid.
|
| - // Returns true if valid. Otherwise generates an error message and
|
| - // returns false;
|
| + // Checks if floating arithmetic Op, for type OpTy, is valid. Returns true if
|
| + // valid. Otherwise generates an error message and returns false;
|
| bool isValidFloatingArithOp(Ice::InstArithmetic::OpKind Op, Ice::Type OpTy) {
|
| if (Ice::isFloatingType(OpTy))
|
| return true;
|
| @@ -1552,9 +1532,9 @@ private:
|
| return false;
|
| }
|
|
|
| - // Checks if the type of operand Op is the valid pointer type, for
|
| - // the given InstructionName. Returns true if valid. Otherwise
|
| - // generates an error message and returns false.
|
| + // Checks if the type of operand Op is the valid pointer type, for the given
|
| + // InstructionName. Returns true if valid. Otherwise generates an error
|
| + // message and returns false.
|
| bool isValidPointerType(Ice::Operand *Op, const char *InstructionName) {
|
| Ice::Type PtrType = Ice::getPointerType();
|
| if (Op->getType() == PtrType)
|
| @@ -1567,9 +1547,8 @@ private:
|
| return false;
|
| }
|
|
|
| - // Checks if loading/storing a value of type Ty is allowed.
|
| - // Returns true if Valid. Otherwise generates an error message and
|
| - // returns false.
|
| + // Checks if loading/storing a value of type Ty is allowed. Returns true if
|
| + // Valid. Otherwise generates an error message and returns false.
|
| bool isValidLoadStoreType(Ice::Type Ty, const char *InstructionName) {
|
| if (isLoadStoreType(Ty))
|
| return true;
|
| @@ -1580,9 +1559,8 @@ private:
|
| return false;
|
| }
|
|
|
| - // Checks if loading/storing a value of type Ty is allowed for
|
| - // the given Alignment. Otherwise generates an error message and
|
| - // returns false.
|
| + // Checks if loading/storing a value of type Ty is allowed for the given
|
| + // Alignment. Otherwise generates an error message and returns false.
|
| bool isValidLoadStoreAlignment(size_t Alignment, Ice::Type Ty,
|
| const char *InstructionName) {
|
| if (!isValidLoadStoreType(Ty, InstructionName))
|
| @@ -1598,8 +1576,8 @@ private:
|
| }
|
|
|
| // Defines if the given alignment is valid for the given type. Simplified
|
| - // version of PNaClABIProps::isAllowedAlignment, based on API's offered
|
| - // for Ice::Type.
|
| + // version of PNaClABIProps::isAllowedAlignment, based on API's offered for
|
| + // Ice::Type.
|
| bool isAllowedAlignment(size_t Alignment, Ice::Type Ty) const {
|
| return Alignment == typeAlignInBytes(Ty) ||
|
| (Alignment == 1 && !isVectorType(Ty));
|
| @@ -1655,9 +1633,9 @@ private:
|
| return VectorIndexValid;
|
| }
|
|
|
| - // Takes the PNaCl bitcode binary operator Opcode, and the opcode
|
| - // type Ty, and sets Op to the corresponding ICE binary
|
| - // opcode. Returns true if able to convert, false otherwise.
|
| + // Takes the PNaCl bitcode binary operator Opcode, and the opcode type Ty,
|
| + // and sets Op to the corresponding ICE binary opcode. Returns true if able
|
| + // to convert, false otherwise.
|
| bool convertBinopOpcode(unsigned Opcode, Ice::Type Ty,
|
| Ice::InstArithmetic::OpKind &Op) {
|
| switch (Opcode) {
|
| @@ -1736,9 +1714,9 @@ private:
|
| }
|
| }
|
|
|
| - /// Simplifies out vector types from Type1 and Type2, if both are vectors
|
| - /// of the same size. Returns true iff both are vectors of the same size,
|
| - /// or are both scalar types.
|
| + /// Simplifies out vector types from Type1 and Type2, if both are vectors of
|
| + /// the same size. Returns true iff both are vectors of the same size, or are
|
| + /// both scalar types.
|
| static bool simplifyOutCommonVectorType(Ice::Type &Type1, Ice::Type &Type2) {
|
| bool IsType1Vector = isVectorType(Type1);
|
| bool IsType2Vector = isVectorType(Type2);
|
| @@ -1781,8 +1759,8 @@ private:
|
| return isFloatTruncCastValid(TargetType, SourceType);
|
| }
|
|
|
| - /// Returns true iff a cast from floating type SourceType to integer
|
| - /// type TargetType is valid.
|
| + /// Returns true iff a cast from floating type SourceType to integer type
|
| + /// TargetType is valid.
|
| static bool isFloatToIntCastValid(Ice::Type SourceType,
|
| Ice::Type TargetType) {
|
| if (!(Ice::isFloatingType(SourceType) && Ice::isIntegerType(TargetType)))
|
| @@ -1797,15 +1775,15 @@ private:
|
| return true;
|
| }
|
|
|
| - /// Returns true iff a cast from integer type SourceType to floating
|
| - /// type TargetType is valid.
|
| + /// Returns true iff a cast from integer type SourceType to floating type
|
| + /// TargetType is valid.
|
| static bool isIntToFloatCastValid(Ice::Type SourceType,
|
| Ice::Type TargetType) {
|
| return isFloatToIntCastValid(TargetType, SourceType);
|
| }
|
|
|
| - /// Returns the number of bits used to model type Ty when defining the
|
| - /// bitcast instruction.
|
| + /// Returns the number of bits used to model type Ty when defining the bitcast
|
| + /// instruction.
|
| static Ice::SizeT bitcastSizeInBits(Ice::Type Ty) {
|
| if (Ice::isVectorType(Ty))
|
| return Ice::typeNumElements(Ty) *
|
| @@ -1820,10 +1798,10 @@ private:
|
| return bitcastSizeInBits(SourceType) == bitcastSizeInBits(TargetType);
|
| }
|
|
|
| - /// Returns true iff the NaCl bitcode Opcode is a valid cast opcode
|
| - /// for converting SourceType to TargetType. Updates CastKind to the
|
| - /// corresponding instruction cast opcode. Also generates an error
|
| - /// message when this function returns false.
|
| + /// Returns true iff the NaCl bitcode Opcode is a valid cast opcode for
|
| + /// converting SourceType to TargetType. Updates CastKind to the corresponding
|
| + /// instruction cast opcode. Also generates an error message when this
|
| + /// function returns false.
|
| bool convertCastOpToIceOp(uint64_t Opcode, Ice::Type SourceType,
|
| Ice::Type TargetType,
|
| Ice::InstCast::OpKind &CastKind) {
|
| @@ -1888,8 +1866,8 @@ private:
|
| return Result;
|
| }
|
|
|
| - // Converts PNaCl bitcode Icmp operator to corresponding ICE op.
|
| - // Returns true if able to convert, false otherwise.
|
| + // Converts PNaCl bitcode Icmp operator to corresponding ICE op. Returns true
|
| + // if able to convert, false otherwise.
|
| bool convertNaClBitcICmpOpToIce(uint64_t Op,
|
| Ice::InstIcmp::ICond &Cond) const {
|
| switch (Op) {
|
| @@ -1930,8 +1908,8 @@ private:
|
| }
|
| }
|
|
|
| - // Converts PNaCl bitcode Fcmp operator to corresponding ICE op.
|
| - // Returns true if able to convert, false otherwise.
|
| + // Converts PNaCl bitcode Fcmp operator to corresponding ICE op. Returns true
|
| + // if able to convert, false otherwise.
|
| bool convertNaClBitcFCompOpToIce(uint64_t Op,
|
| Ice::InstFcmp::FCond &Cond) const {
|
| switch (Op) {
|
| @@ -1990,15 +1968,14 @@ private:
|
| }
|
| }
|
|
|
| - // Creates an error instruction, generating a value of type Ty, and
|
| - // adds a placeholder so that instruction indices line up.
|
| - // Some instructions, such as a call, will not generate a value
|
| - // if the return type is void. In such cases, a placeholder value
|
| - // for the badly formed instruction is not needed. Hence, if Ty is
|
| - // void, an error instruction is not appended.
|
| + // Creates an error instruction, generating a value of type Ty, and adds a
|
| + // placeholder so that instruction indices line up. Some instructions, such
|
| + // as a call, will not generate a value if the return type is void. In such
|
| + // cases, a placeholder value for the badly formed instruction is not needed.
|
| + // Hence, if Ty is void, an error instruction is not appended.
|
| void appendErrorInstruction(Ice::Type Ty) {
|
| - // Note: we don't worry about downstream translation errors because
|
| - // the function will not be translated if any errors occur.
|
| + // Note: we don't worry about downstream translation errors because the
|
| + // function will not be translated if any errors occur.
|
| if (Ty == Ice::IceType_void)
|
| return;
|
| Ice::Variable *Var = getNextInstVar(Ty);
|
| @@ -2025,8 +2002,8 @@ void FunctionParser::ExitBlock() {
|
| }
|
| if (isIRGenerationDisabled())
|
| return;
|
| - // Before translating, check for blocks without instructions, and
|
| - // insert unreachable. This shouldn't happen, but be safe.
|
| + // Before translating, check for blocks without instructions, and insert
|
| + // unreachable. This shouldn't happen, but be safe.
|
| size_t Index = 0;
|
| for (Ice::CfgNode *Node : Func->getNodes()) {
|
| if (Node->getInsts().empty()) {
|
| @@ -2051,8 +2028,8 @@ void FunctionParser::reportInvalidBinaryOp(Ice::InstArithmetic::OpKind Op,
|
| }
|
|
|
| void FunctionParser::ProcessRecord() {
|
| - // Note: To better separate parse/IR generation times, when IR generation
|
| - // is disabled we do the following:
|
| + // Note: To better separate parse/IR generation times, when IR generation is
|
| + // disabled we do the following:
|
| // 1) Delay exiting until after we extract operands.
|
| // 2) return before we access operands, since all operands will be a nullptr.
|
| const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
|
| @@ -2382,11 +2359,10 @@ void FunctionParser::ProcessRecord() {
|
| // SWITCH: [Condty, Cond, BbIndex, NumCases Case ...]
|
| // where Case = [1, 1, Value, BbIndex].
|
| //
|
| - // Note: Unlike most instructions, we don't infer the type of
|
| - // Cond, but provide it as a separate field. There are also
|
| - // unnecesary data fields (i.e. constants 1). These were not
|
| - // cleaned up in PNaCl bitcode because the bitcode format was
|
| - // already frozen when the problem was noticed.
|
| + // Note: Unlike most instructions, we don't infer the type of Cond, but
|
| + // provide it as a separate field. There are also unnecessary data fields
|
| + // (i.e. constants 1). These were not cleaned up in PNaCl bitcode because
|
| + // the bitcode format was already frozen when the problem was noticed.
|
| InstIsTerminating = true;
|
| if (!isValidRecordSizeAtLeast(4, "switch"))
|
| return;
|
| @@ -2591,13 +2567,12 @@ void FunctionParser::ProcessRecord() {
|
| // CALL: [cc, fnid, arg0, arg1...]
|
| // CALL_INDIRECT: [cc, fn, returnty, args...]
|
| //
|
| - // Note: The difference between CALL and CALL_INDIRECT is that
|
| - // CALL has a reference to an explicit function declaration, while
|
| - // the CALL_INDIRECT is just an address. For CALL, we can infer
|
| - // the return type by looking up the type signature associated
|
| - // with the function declaration. For CALL_INDIRECT we can only
|
| - // infer the type signature via argument types, and the
|
| - // corresponding return type stored in CALL_INDIRECT record.
|
| + // Note: The difference between CALL and CALL_INDIRECT is that CALL has a
|
| + // reference to an explicit function declaration, while the CALL_INDIRECT
|
| + // is just an address. For CALL, we can infer the return type by looking up
|
| + // the type signature associated with the function declaration. For
|
| + // CALL_INDIRECT we can only infer the type signature via argument types,
|
| + // and the corresponding return type stored in CALL_INDIRECT record.
|
| Ice::SizeT ParamsStartIndex = 2;
|
| if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) {
|
| if (!isValidRecordSizeAtLeast(2, "call"))
|
| @@ -2763,8 +2738,8 @@ private:
|
|
|
| Ice::GlobalContext *getContext() { return getTranslator().getContext(); }
|
|
|
| - // Returns true if the type to use for succeeding constants is defined.
|
| - // If false, also generates an error message.
|
| + // Returns true if the type to use for succeeding constants is defined. If
|
| + // false, also generates an error message.
|
| bool isValidNextConstantType() {
|
| if (NextConstantType != Ice::IceType_void)
|
| return true;
|
| @@ -2887,8 +2862,8 @@ private:
|
| void setValueName(NaClBcIndexSize_t Index, StringType &Name) override;
|
| void setBbName(NaClBcIndexSize_t Index, StringType &Name) override;
|
|
|
| - // Reports that the assignment of Name to the value associated with
|
| - // index is not possible, for the given Context.
|
| + // Reports that the assignment of Name to the value associated with index is
|
| + // not possible, for the given Context.
|
| void reportUnableToAssign(const char *Context, NaClBcIndexSize_t Index,
|
| StringType &Name) {
|
| std::string Buffer;
|
| @@ -2976,10 +2951,10 @@ private:
|
| // and have generated global constant initializers.
|
| bool GlobalDeclarationNamesAndInitializersInstalled = false;
|
|
|
| - // Generates names for unnamed global addresses (i.e. functions and
|
| - // global variables). Then lowers global variable declaration
|
| - // initializers to the target. May be called multiple times. Only
|
| - // the first call will do the installation.
|
| + // Generates names for unnamed global addresses (i.e. functions and global
|
| + // variables). Then lowers global variable declaration initializers to the
|
| + // target. May be called multiple times. Only the first call will do the
|
| + // installation.
|
| void installGlobalNamesAndGlobalVarInitializers() {
|
| if (!GlobalDeclarationNamesAndInitializersInstalled) {
|
| Context->installGlobalNames();
|
| @@ -3130,11 +3105,11 @@ void PNaClTranslator::translateBuffer(const std::string &IRFilename,
|
|
|
| void PNaClTranslator::translate(const std::string &IRFilename,
|
| std::unique_ptr<MemoryObject> &&MemObj) {
|
| - // On error, we report_fatal_error to avoid destroying the MemObj.
|
| - // That may still be in use by IceBrowserCompileServer. Otherwise,
|
| - // we need to change the MemObj to be ref-counted, or have a wrapper,
|
| - // or simply leak. We also need a hook to tell the IceBrowserCompileServer
|
| - // to unblock its QueueStreamer.
|
| + // On error, we report_fatal_error to avoid destroying the MemObj. That may
|
| + // still be in use by IceBrowserCompileServer. Otherwise, we need to change
|
| + // the MemObj to be ref-counted, or have a wrapper, or simply leak. We also
|
| + // need a hook to tell the IceBrowserCompileServer to unblock its
|
| + // QueueStreamer.
|
| // https://code.google.com/p/nativeclient/issues/detail?id=4163
|
| Ostream &ErrStream = getContext()->getStrError();
|
| // Read header and verify it is good.
|
|
|