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

Side by Side Diff: src/PNaClTranslator.cpp

Issue 1197223002: Subzero: Use C++11 member initializers where practical. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Rebase Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceTypes.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/PNaClTranslator.cpp - ICE from bitcode -----------------===// 1 //===- subzero/src/PNaClTranslator.cpp - ICE from bitcode -----------------===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // This file implements the PNaCl bitcode file to Ice, to machine code 10 // This file implements the PNaCl bitcode file to Ice, to machine code
(...skipping 29 matching lines...) Expand all
40 // signature. Note that an extended type is undefined on construction. 40 // signature. Note that an extended type is undefined on construction.
41 // Use methods setAsSimpleType and setAsFuncSigType to define 41 // Use methods setAsSimpleType and setAsFuncSigType to define
42 // the extended type. 42 // the extended type.
43 class ExtendedType { 43 class ExtendedType {
44 ExtendedType &operator=(const ExtendedType &Ty) = delete; 44 ExtendedType &operator=(const ExtendedType &Ty) = delete;
45 45
46 public: 46 public:
47 /// Discriminator for LLVM-style RTTI. 47 /// Discriminator for LLVM-style RTTI.
48 enum TypeKind { Undefined, Simple, FuncSig }; 48 enum TypeKind { Undefined, Simple, FuncSig };
49 49
50 ExtendedType() : Kind(Undefined) {} 50 ExtendedType() = default;
51 ExtendedType(const ExtendedType &Ty) = default; 51 ExtendedType(const ExtendedType &Ty) = default;
52 52
53 virtual ~ExtendedType() {} 53 virtual ~ExtendedType() = default;
54 54
55 ExtendedType::TypeKind getKind() const { return Kind; } 55 ExtendedType::TypeKind getKind() const { return Kind; }
56 void dump(Ice::Ostream &Stream) const; 56 void dump(Ice::Ostream &Stream) const;
57 57
58 /// Changes the extended type to a simple type with the given 58 /// Changes the extended type to a simple type with the given
59 /// value. 59 /// value.
60 void setAsSimpleType(Ice::Type Ty) { 60 void setAsSimpleType(Ice::Type Ty) {
61 assert(Kind == Undefined); 61 assert(Kind == Undefined);
62 Kind = Simple; 62 Kind = Simple;
63 Signature.setReturnType(Ty); 63 Signature.setReturnType(Ty);
64 } 64 }
65 65
66 /// Changes the extended type to an (empty) function signature type. 66 /// Changes the extended type to an (empty) function signature type.
67 void setAsFunctionType() { 67 void setAsFunctionType() {
68 assert(Kind == Undefined); 68 assert(Kind == Undefined);
69 Kind = FuncSig; 69 Kind = FuncSig;
70 } 70 }
71 71
72 protected: 72 protected:
73 // Note: For simple types, the return type of the signature will 73 // Note: For simple types, the return type of the signature will
74 // be used to hold the simple type. 74 // be used to hold the simple type.
75 Ice::FuncSigType Signature; 75 Ice::FuncSigType Signature;
76 76
77 private: 77 private:
78 ExtendedType::TypeKind Kind; 78 ExtendedType::TypeKind Kind = Undefined;
79 }; 79 };
80 80
81 Ice::Ostream &operator<<(Ice::Ostream &Stream, const ExtendedType &Ty) { 81 Ice::Ostream &operator<<(Ice::Ostream &Stream, const ExtendedType &Ty) {
82 if (!ALLOW_DUMP) 82 if (!ALLOW_DUMP)
83 return Stream; 83 return Stream;
84 Ty.dump(Stream); 84 Ty.dump(Stream);
85 return Stream; 85 return Stream;
86 } 86 }
87 87
88 Ice::Ostream &operator<<(Ice::Ostream &Stream, ExtendedType::TypeKind Kind) { 88 Ice::Ostream &operator<<(Ice::Ostream &Stream, ExtendedType::TypeKind Kind) {
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 TopLevelParser() = delete; 158 TopLevelParser() = delete;
159 TopLevelParser(const TopLevelParser &) = delete; 159 TopLevelParser(const TopLevelParser &) = delete;
160 TopLevelParser &operator=(const TopLevelParser &) = delete; 160 TopLevelParser &operator=(const TopLevelParser &) = delete;
161 161
162 public: 162 public:
163 typedef std::vector<Ice::FunctionDeclaration *> FunctionDeclarationListType; 163 typedef std::vector<Ice::FunctionDeclaration *> FunctionDeclarationListType;
164 164
165 TopLevelParser(Ice::Translator &Translator, NaClBitstreamCursor &Cursor, 165 TopLevelParser(Ice::Translator &Translator, NaClBitstreamCursor &Cursor,
166 Ice::ErrorCode &ErrorStatus) 166 Ice::ErrorCode &ErrorStatus)
167 : NaClBitcodeParser(Cursor), Translator(Translator), 167 : NaClBitcodeParser(Cursor), Translator(Translator),
168 ErrorStatus(ErrorStatus), NumErrors(0), NextDefiningFunctionID(0), 168 ErrorStatus(ErrorStatus),
169 VariableDeclarations(new Ice::VariableDeclarationList()), 169 VariableDeclarations(new Ice::VariableDeclarationList()) {}
170 BlockParser(nullptr) {}
171 170
172 ~TopLevelParser() override {} 171 ~TopLevelParser() override {}
173 172
174 Ice::Translator &getTranslator() const { return Translator; } 173 Ice::Translator &getTranslator() const { return Translator; }
175 174
176 void setBlockParser(BlockParserBaseClass *NewBlockParser) { 175 void setBlockParser(BlockParserBaseClass *NewBlockParser) {
177 BlockParser = NewBlockParser; 176 BlockParser = NewBlockParser;
178 } 177 }
179 178
180 /// Generates error with given Message, occurring at BitPosition 179 /// Generates error with given Message, occurring at BitPosition
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 VariableDeclarations->size() <= ValueIDConstants.size()); 336 VariableDeclarations->size() <= ValueIDConstants.size());
338 return std::move(VariableDeclarations); 337 return std::move(VariableDeclarations);
339 } 338 }
340 339
341 private: 340 private:
342 // The translator associated with the parser. 341 // The translator associated with the parser.
343 Ice::Translator &Translator; 342 Ice::Translator &Translator;
344 // The exit status that should be set to true if an error occurs. 343 // The exit status that should be set to true if an error occurs.
345 Ice::ErrorCode &ErrorStatus; 344 Ice::ErrorCode &ErrorStatus;
346 // The number of errors reported. 345 // The number of errors reported.
347 unsigned NumErrors; 346 unsigned NumErrors = 0;
348 // The types associated with each type ID. 347 // The types associated with each type ID.
349 std::vector<ExtendedType> TypeIDValues; 348 std::vector<ExtendedType> TypeIDValues;
350 // The set of functions (prototype and defined). 349 // The set of functions (prototype and defined).
351 FunctionDeclarationListType FunctionDeclarationList; 350 FunctionDeclarationListType FunctionDeclarationList;
352 // The ID of the next possible defined function ID in 351 // The ID of the next possible defined function ID in
353 // FunctionDeclarationList. FunctionDeclarationList is filled 352 // FunctionDeclarationList. FunctionDeclarationList is filled
354 // first. It's the set of functions (either defined or isproto). Then 353 // first. It's the set of functions (either defined or isproto). Then
355 // function definitions are encountered/parsed and 354 // function definitions are encountered/parsed and
356 // NextDefiningFunctionID is incremented to track the next 355 // NextDefiningFunctionID is incremented to track the next
357 // actually-defined function. 356 // actually-defined function.
358 size_t NextDefiningFunctionID; 357 size_t NextDefiningFunctionID = 0;
359 // The set of global variables. 358 // The set of global variables.
360 std::unique_ptr<Ice::VariableDeclarationList> VariableDeclarations; 359 std::unique_ptr<Ice::VariableDeclarationList> VariableDeclarations;
361 // Relocatable constants associated with global declarations. 360 // Relocatable constants associated with global declarations.
362 std::vector<Ice::Constant *> ValueIDConstants; 361 std::vector<Ice::Constant *> ValueIDConstants;
363 // Error recovery value to use when getFuncSigTypeByID fails. 362 // Error recovery value to use when getFuncSigTypeByID fails.
364 Ice::FuncSigType UndefinedFuncSigType; 363 Ice::FuncSigType UndefinedFuncSigType;
365 // The block parser currently being applied. Used for error 364 // The block parser currently being applied. Used for error
366 // reporting. 365 // reporting.
367 BlockParserBaseClass *BlockParser; 366 BlockParserBaseClass *BlockParser = nullptr;
368 367
369 bool ParseBlock(unsigned BlockID) override; 368 bool ParseBlock(unsigned BlockID) override;
370 369
371 // Gets extended type associated with the given index, assuming the 370 // Gets extended type associated with the given index, assuming the
372 // extended type is of the WantedKind. Generates error message if 371 // extended type is of the WantedKind. Generates error message if
373 // corresponding extended type of WantedKind can't be found, and 372 // corresponding extended type of WantedKind can't be found, and
374 // returns nullptr. 373 // returns nullptr.
375 ExtendedType *getTypeByIDAsKind(unsigned ID, 374 ExtendedType *getTypeByIDAsKind(unsigned ID,
376 ExtendedType::TypeKind WantedKind) { 375 ExtendedType::TypeKind WantedKind) {
377 ExtendedType *Ty = nullptr; 376 ExtendedType *Ty = nullptr;
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 718
720 // Class to parse a types block. 719 // Class to parse a types block.
721 class TypesParser : public BlockParserBaseClass { 720 class TypesParser : public BlockParserBaseClass {
722 TypesParser() = delete; 721 TypesParser() = delete;
723 TypesParser(const TypesParser &) = delete; 722 TypesParser(const TypesParser &) = delete;
724 TypesParser &operator=(const TypesParser &) = delete; 723 TypesParser &operator=(const TypesParser &) = delete;
725 724
726 public: 725 public:
727 TypesParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser) 726 TypesParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
728 : BlockParserBaseClass(BlockID, EnclosingParser), 727 : BlockParserBaseClass(BlockID, EnclosingParser),
729 Timer(Ice::TimerStack::TT_parseTypes, getTranslator().getContext()), 728 Timer(Ice::TimerStack::TT_parseTypes, getTranslator().getContext()) {}
730 NextTypeId(0) {}
731 729
732 ~TypesParser() override {} 730 ~TypesParser() override {}
733 731
734 private: 732 private:
735 Ice::TimerMarker Timer; 733 Ice::TimerMarker Timer;
736 // The type ID that will be associated with the next type defining 734 // The type ID that will be associated with the next type defining
737 // record in the types block. 735 // record in the types block.
738 unsigned NextTypeId; 736 unsigned NextTypeId = 0;
739 737
740 void ProcessRecord() override; 738 void ProcessRecord() override;
741 739
742 const char *getBlockName() const override { return "type"; } 740 const char *getBlockName() const override { return "type"; }
743 741
744 void setNextTypeIDAsSimpleType(Ice::Type Ty) { 742 void setNextTypeIDAsSimpleType(Ice::Type Ty) {
745 Context->getTypeByIDForDefining(NextTypeId++)->setAsSimpleType(Ty); 743 Context->getTypeByIDForDefining(NextTypeId++)->setAsSimpleType(Ty);
746 } 744 }
747 }; 745 };
748 746
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
899 /// corresponding initializers). 897 /// corresponding initializers).
900 class GlobalsParser : public BlockParserBaseClass { 898 class GlobalsParser : public BlockParserBaseClass {
901 GlobalsParser() = delete; 899 GlobalsParser() = delete;
902 GlobalsParser(const GlobalsParser &) = delete; 900 GlobalsParser(const GlobalsParser &) = delete;
903 GlobalsParser &operator=(const GlobalsParser &) = delete; 901 GlobalsParser &operator=(const GlobalsParser &) = delete;
904 902
905 public: 903 public:
906 GlobalsParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser) 904 GlobalsParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
907 : BlockParserBaseClass(BlockID, EnclosingParser), 905 : BlockParserBaseClass(BlockID, EnclosingParser),
908 Timer(Ice::TimerStack::TT_parseGlobals, getTranslator().getContext()), 906 Timer(Ice::TimerStack::TT_parseGlobals, getTranslator().getContext()),
909 InitializersNeeded(0), NextGlobalID(0),
910 DummyGlobalVar(Ice::VariableDeclaration::create()), 907 DummyGlobalVar(Ice::VariableDeclaration::create()),
911 CurGlobalVar(DummyGlobalVar) {} 908 CurGlobalVar(DummyGlobalVar) {}
912 909
913 ~GlobalsParser() final {} 910 ~GlobalsParser() final {}
914 911
915 const char *getBlockName() const override { return "globals"; } 912 const char *getBlockName() const override { return "globals"; }
916 913
917 private: 914 private:
918 Ice::TimerMarker Timer; 915 Ice::TimerMarker Timer;
919 // Keeps track of how many initializers are expected for the global variable 916 // Keeps track of how many initializers are expected for the global variable
920 // declaration being built. 917 // declaration being built.
921 unsigned InitializersNeeded; 918 unsigned InitializersNeeded = 0;
922 919
923 // The index of the next global variable declaration. 920 // The index of the next global variable declaration.
924 unsigned NextGlobalID; 921 unsigned NextGlobalID = 0;
925 922
926 // Dummy global variable declaration to guarantee CurGlobalVar is 923 // Dummy global variable declaration to guarantee CurGlobalVar is
927 // always defined (allowing code to not need to check if 924 // always defined (allowing code to not need to check if
928 // CurGlobalVar is nullptr). 925 // CurGlobalVar is nullptr).
929 Ice::VariableDeclaration *DummyGlobalVar; 926 Ice::VariableDeclaration *DummyGlobalVar;
930 927
931 // Holds the current global variable declaration being built. 928 // Holds the current global variable declaration being built.
932 Ice::VariableDeclaration *CurGlobalVar; 929 Ice::VariableDeclaration *CurGlobalVar;
933 930
934 void ExitBlock() override { 931 void ExitBlock() override {
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 /// Parses function blocks in the bitcode file. 1115 /// Parses function blocks in the bitcode file.
1119 class FunctionParser : public BlockParserBaseClass { 1116 class FunctionParser : public BlockParserBaseClass {
1120 FunctionParser() = delete; 1117 FunctionParser() = delete;
1121 FunctionParser(const FunctionParser &) = delete; 1118 FunctionParser(const FunctionParser &) = delete;
1122 FunctionParser &operator=(const FunctionParser &) = delete; 1119 FunctionParser &operator=(const FunctionParser &) = delete;
1123 1120
1124 public: 1121 public:
1125 FunctionParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser) 1122 FunctionParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
1126 : BlockParserBaseClass(BlockID, EnclosingParser), 1123 : BlockParserBaseClass(BlockID, EnclosingParser),
1127 Timer(Ice::TimerStack::TT_parseFunctions, getTranslator().getContext()), 1124 Timer(Ice::TimerStack::TT_parseFunctions, getTranslator().getContext()),
1128 Func(nullptr), CurrentBbIndex(0), 1125 Func(nullptr), FcnId(Context->getNextFunctionBlockValueID()),
1129 FcnId(Context->getNextFunctionBlockValueID()),
1130 FuncDecl(Context->getFunctionByID(FcnId)), 1126 FuncDecl(Context->getFunctionByID(FcnId)),
1131 CachedNumGlobalValueIDs(Context->getNumGlobalIDs()), 1127 CachedNumGlobalValueIDs(Context->getNumGlobalIDs()),
1132 NextLocalInstIndex(Context->getNumGlobalIDs()), 1128 NextLocalInstIndex(Context->getNumGlobalIDs()) {}
1133 InstIsTerminating(false) {}
1134 1129
1135 bool convertFunction() { 1130 bool convertFunction() {
1136 const Ice::TimerStackIdT StackID = Ice::GlobalContext::TSK_Funcs; 1131 const Ice::TimerStackIdT StackID = Ice::GlobalContext::TSK_Funcs;
1137 Ice::TimerIdT TimerID = 0; 1132 Ice::TimerIdT TimerID = 0;
1138 const bool TimeThisFunction = getFlags().getTimeEachFunction(); 1133 const bool TimeThisFunction = getFlags().getTimeEachFunction();
1139 if (TimeThisFunction) { 1134 if (TimeThisFunction) {
1140 TimerID = getTranslator().getContext()->getTimerID(StackID, 1135 TimerID = getTranslator().getContext()->getTimerID(StackID,
1141 FuncDecl->getName()); 1136 FuncDecl->getName());
1142 getTranslator().getContext()->pushTimer(TimerID, StackID); 1137 getTranslator().getContext()->pushTimer(TimerID, StackID);
1143 } 1138 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 Fatal(StrBuf.str()); 1221 Fatal(StrBuf.str());
1227 } 1222 }
1228 return Op; 1223 return Op;
1229 } 1224 }
1230 1225
1231 private: 1226 private:
1232 Ice::TimerMarker Timer; 1227 Ice::TimerMarker Timer;
1233 // The corresponding ICE function defined by the function block. 1228 // The corresponding ICE function defined by the function block.
1234 std::unique_ptr<Ice::Cfg> Func; 1229 std::unique_ptr<Ice::Cfg> Func;
1235 // The index to the current basic block being built. 1230 // The index to the current basic block being built.
1236 uint32_t CurrentBbIndex; 1231 uint32_t CurrentBbIndex = 0;
1237 // The basic block being built. 1232 // The basic block being built.
1238 Ice::CfgNode *CurrentNode; 1233 Ice::CfgNode *CurrentNode = nullptr;
1239 // The ID for the function. 1234 // The ID for the function.
1240 unsigned FcnId; 1235 unsigned FcnId;
1241 // The corresponding function declaration. 1236 // The corresponding function declaration.
1242 Ice::FunctionDeclaration *FuncDecl; 1237 Ice::FunctionDeclaration *FuncDecl;
1243 // Holds the dividing point between local and global absolute value indices. 1238 // Holds the dividing point between local and global absolute value indices.
1244 uint32_t CachedNumGlobalValueIDs; 1239 uint32_t CachedNumGlobalValueIDs;
1245 // Holds operands local to the function block, based on indices 1240 // Holds operands local to the function block, based on indices
1246 // defined in the bitcode file. 1241 // defined in the bitcode file.
1247 std::vector<Ice::Operand *> LocalOperands; 1242 std::vector<Ice::Operand *> LocalOperands;
1248 // Holds the index within LocalOperands corresponding to the next 1243 // Holds the index within LocalOperands corresponding to the next
1249 // instruction that generates a value. 1244 // instruction that generates a value.
1250 uint32_t NextLocalInstIndex; 1245 uint32_t NextLocalInstIndex;
1251 // True if the last processed instruction was a terminating 1246 // True if the last processed instruction was a terminating
1252 // instruction. 1247 // instruction.
1253 bool InstIsTerminating; 1248 bool InstIsTerminating = false;
1254 // Upper limit of alignment power allowed by LLVM 1249 // Upper limit of alignment power allowed by LLVM
1255 static const uint32_t AlignPowerLimit = 29; 1250 static const uint32_t AlignPowerLimit = 29;
1256 1251
1257 // Extracts the corresponding Alignment to use, given the AlignPower 1252 // Extracts the corresponding Alignment to use, given the AlignPower
1258 // (i.e. 2**(AlignPower-1), or 0 if AlignPower == 0). InstName is the 1253 // (i.e. 2**(AlignPower-1), or 0 if AlignPower == 0). InstName is the
1259 // name of the instruction the alignment appears in. 1254 // name of the instruction the alignment appears in.
1260 void extractAlignment(const char *InstName, uint32_t AlignPower, 1255 void extractAlignment(const char *InstName, uint32_t AlignPower,
1261 uint32_t &Alignment) { 1256 uint32_t &Alignment) {
1262 if (AlignPower <= AlignPowerLimit + 1) { 1257 if (AlignPower <= AlignPowerLimit + 1) {
1263 Alignment = (1 << AlignPower) >> 1; 1258 Alignment = (1 << AlignPower) >> 1;
(...skipping 1335 matching lines...) Expand 10 before | Expand all | Expand 10 after
2599 /// Parses constants within a function block. 2594 /// Parses constants within a function block.
2600 class ConstantsParser : public BlockParserBaseClass { 2595 class ConstantsParser : public BlockParserBaseClass {
2601 ConstantsParser() = delete; 2596 ConstantsParser() = delete;
2602 ConstantsParser(const ConstantsParser &) = delete; 2597 ConstantsParser(const ConstantsParser &) = delete;
2603 ConstantsParser &operator=(const ConstantsParser &) = delete; 2598 ConstantsParser &operator=(const ConstantsParser &) = delete;
2604 2599
2605 public: 2600 public:
2606 ConstantsParser(unsigned BlockID, FunctionParser *FuncParser) 2601 ConstantsParser(unsigned BlockID, FunctionParser *FuncParser)
2607 : BlockParserBaseClass(BlockID, FuncParser), 2602 : BlockParserBaseClass(BlockID, FuncParser),
2608 Timer(Ice::TimerStack::TT_parseConstants, getTranslator().getContext()), 2603 Timer(Ice::TimerStack::TT_parseConstants, getTranslator().getContext()),
2609 FuncParser(FuncParser), NextConstantType(Ice::IceType_void) {} 2604 FuncParser(FuncParser) {}
2610 2605
2611 ~ConstantsParser() override {} 2606 ~ConstantsParser() override {}
2612 2607
2613 const char *getBlockName() const override { return "constants"; } 2608 const char *getBlockName() const override { return "constants"; }
2614 2609
2615 private: 2610 private:
2616 Ice::TimerMarker Timer; 2611 Ice::TimerMarker Timer;
2617 // The parser of the function block this constants block appears in. 2612 // The parser of the function block this constants block appears in.
2618 FunctionParser *FuncParser; 2613 FunctionParser *FuncParser;
2619 // The type to use for succeeding constants. 2614 // The type to use for succeeding constants.
2620 Ice::Type NextConstantType; 2615 Ice::Type NextConstantType = Ice::IceType_void;
2621 2616
2622 void ProcessRecord() override; 2617 void ProcessRecord() override;
2623 2618
2624 Ice::GlobalContext *getContext() { return getTranslator().getContext(); } 2619 Ice::GlobalContext *getContext() { return getTranslator().getContext(); }
2625 2620
2626 // Returns true if the type to use for succeeding constants is defined. 2621 // Returns true if the type to use for succeeding constants is defined.
2627 // If false, also generates an error message. 2622 // If false, also generates an error message.
2628 bool isValidNextConstantType() { 2623 bool isValidNextConstantType() {
2629 if (NextConstantType != Ice::IceType_void) 2624 if (NextConstantType != Ice::IceType_void)
2630 return true; 2625 return true;
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
2814 /// Parses the module block in the bitcode file. 2809 /// Parses the module block in the bitcode file.
2815 class ModuleParser : public BlockParserBaseClass { 2810 class ModuleParser : public BlockParserBaseClass {
2816 ModuleParser() = delete; 2811 ModuleParser() = delete;
2817 ModuleParser(const ModuleParser &) = delete; 2812 ModuleParser(const ModuleParser &) = delete;
2818 ModuleParser &operator=(const ModuleParser &) = delete; 2813 ModuleParser &operator=(const ModuleParser &) = delete;
2819 2814
2820 public: 2815 public:
2821 ModuleParser(unsigned BlockID, TopLevelParser *Context) 2816 ModuleParser(unsigned BlockID, TopLevelParser *Context)
2822 : BlockParserBaseClass(BlockID, Context), 2817 : BlockParserBaseClass(BlockID, Context),
2823 Timer(Ice::TimerStack::TT_parseModule, 2818 Timer(Ice::TimerStack::TT_parseModule,
2824 Context->getTranslator().getContext()), 2819 Context->getTranslator().getContext()) {}
2825 GlobalDeclarationNamesAndInitializersInstalled(false) {}
2826 2820
2827 ~ModuleParser() override {} 2821 ~ModuleParser() override {}
2828 2822
2829 const char *getBlockName() const override { return "module"; } 2823 const char *getBlockName() const override { return "module"; }
2830 2824
2831 private: 2825 private:
2832 Ice::TimerMarker Timer; 2826 Ice::TimerMarker Timer;
2833 // True if we have already installed names for unnamed global declarations, 2827 // True if we have already installed names for unnamed global declarations,
2834 // and have generated global constant initializers. 2828 // and have generated global constant initializers.
2835 bool GlobalDeclarationNamesAndInitializersInstalled; 2829 bool GlobalDeclarationNamesAndInitializersInstalled = false;
2836 2830
2837 // Generates names for unnamed global addresses (i.e. functions and 2831 // Generates names for unnamed global addresses (i.e. functions and
2838 // global variables). Then lowers global variable declaration 2832 // global variables). Then lowers global variable declaration
2839 // initializers to the target. May be called multiple times. Only 2833 // initializers to the target. May be called multiple times. Only
2840 // the first call will do the installation. 2834 // the first call will do the installation.
2841 void InstallGlobalNamesAndGlobalVarInitializers() { 2835 void InstallGlobalNamesAndGlobalVarInitializers() {
2842 if (!GlobalDeclarationNamesAndInitializersInstalled) { 2836 if (!GlobalDeclarationNamesAndInitializersInstalled) {
2843 Context->installGlobalNames(); 2837 Context->installGlobalNames();
2844 Context->createValueIDs(); 2838 Context->createValueIDs();
2845 getTranslator().lowerGlobals(Context->getGlobalVariables()); 2839 getTranslator().lowerGlobals(Context->getGlobalVariables());
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
3026 } 3020 }
3027 if (InputStreamFile.getBitcodeBytes().getExtent() % 4 != 0) { 3021 if (InputStreamFile.getBitcodeBytes().getExtent() % 4 != 0) {
3028 ErrStream 3022 ErrStream
3029 << IRFilename 3023 << IRFilename
3030 << ": Bitcode stream should be a multiple of 4 bytes in length.\n"; 3024 << ": Bitcode stream should be a multiple of 4 bytes in length.\n";
3031 llvm::report_fatal_error("Bitcode stream should be a multiple of 4 bytes"); 3025 llvm::report_fatal_error("Bitcode stream should be a multiple of 4 bytes");
3032 } 3026 }
3033 } 3027 }
3034 3028
3035 } // end of namespace Ice 3029 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceTypes.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698