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

Side by Side Diff: src/PNaClTranslator.cpp

Issue 870653002: Subzero: Initial implementation of multithreaded translation. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Rebase Created 5 years, 11 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/PNaClTranslator.h ('k') | src/llvm2ice.cpp » ('j') | 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 14 matching lines...) Expand all
25 #include "IceAPFloat.h" 25 #include "IceAPFloat.h"
26 #include "IceCfg.h" 26 #include "IceCfg.h"
27 #include "IceCfgNode.h" 27 #include "IceCfgNode.h"
28 #include "IceClFlags.h" 28 #include "IceClFlags.h"
29 #include "IceDefs.h" 29 #include "IceDefs.h"
30 #include "IceGlobalInits.h" 30 #include "IceGlobalInits.h"
31 #include "IceInst.h" 31 #include "IceInst.h"
32 #include "IceOperand.h" 32 #include "IceOperand.h"
33 #include "PNaClTranslator.h" 33 #include "PNaClTranslator.h"
34 34
35 #include <memory>
36
37 namespace { 35 namespace {
38 using namespace llvm; 36 using namespace llvm;
39 37
40 // Models elements in the list of types defined in the types block. 38 // Models elements in the list of types defined in the types block.
41 // These elements can be undefined, a (simple) type, or a function type 39 // These elements can be undefined, a (simple) type, or a function type
42 // signature. Note that an extended type is undefined on construction. 40 // signature. Note that an extended type is undefined on construction.
43 // Use methods setAsSimpleType and setAsFuncSigType to define 41 // Use methods setAsSimpleType and setAsFuncSigType to define
44 // the extended type. 42 // the extended type.
45 class ExtendedType { 43 class ExtendedType {
46 ExtendedType &operator=(const ExtendedType &Ty) = delete; 44 ExtendedType &operator=(const ExtendedType &Ty) = delete;
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 150
153 // Top-level class to read PNaCl bitcode files, and translate to ICE. 151 // Top-level class to read PNaCl bitcode files, and translate to ICE.
154 class TopLevelParser : public NaClBitcodeParser { 152 class TopLevelParser : public NaClBitcodeParser {
155 TopLevelParser(const TopLevelParser &) = delete; 153 TopLevelParser(const TopLevelParser &) = delete;
156 TopLevelParser &operator=(const TopLevelParser &) = delete; 154 TopLevelParser &operator=(const TopLevelParser &) = delete;
157 155
158 public: 156 public:
159 typedef std::vector<Ice::FunctionDeclaration *> FunctionDeclarationListType; 157 typedef std::vector<Ice::FunctionDeclaration *> FunctionDeclarationListType;
160 158
161 TopLevelParser(Ice::Translator &Translator, NaClBitcodeHeader &Header, 159 TopLevelParser(Ice::Translator &Translator, NaClBitcodeHeader &Header,
162 NaClBitstreamCursor &Cursor, bool &ErrorStatus) 160 NaClBitstreamCursor &Cursor, Ice::ErrorCode &ErrorStatus)
163 : NaClBitcodeParser(Cursor), Translator(Translator), Header(Header), 161 : NaClBitcodeParser(Cursor), Translator(Translator), Header(Header),
164 ErrorStatus(ErrorStatus), NumErrors(0), NumFunctionIds(0), 162 ErrorStatus(ErrorStatus), NumErrors(0), NumFunctionIds(0),
165 NumFunctionBlocks(0), BlockParser(nullptr) {} 163 NumFunctionBlocks(0), BlockParser(nullptr) {}
166 164
167 ~TopLevelParser() override {} 165 ~TopLevelParser() override {}
168 166
169 Ice::Translator &getTranslator() { return Translator; } 167 Ice::Translator &getTranslator() { return Translator; }
170 168
171 void setBlockParser(BlockParserBaseClass *NewBlockParser) { 169 void setBlockParser(BlockParserBaseClass *NewBlockParser) {
172 BlockParser = NewBlockParser; 170 BlockParser = NewBlockParser;
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 const Ice::Translator::VariableDeclarationListType &getGlobalVariables() { 353 const Ice::Translator::VariableDeclarationListType &getGlobalVariables() {
356 return VariableDeclarations; 354 return VariableDeclarations;
357 } 355 }
358 356
359 private: 357 private:
360 // The translator associated with the parser. 358 // The translator associated with the parser.
361 Ice::Translator &Translator; 359 Ice::Translator &Translator;
362 // The bitcode header. 360 // The bitcode header.
363 NaClBitcodeHeader &Header; 361 NaClBitcodeHeader &Header;
364 // The exit status that should be set to true if an error occurs. 362 // The exit status that should be set to true if an error occurs.
365 bool &ErrorStatus; 363 Ice::ErrorCode &ErrorStatus;
366 // The number of errors reported. 364 // The number of errors reported.
367 unsigned NumErrors; 365 unsigned NumErrors;
368 // The types associated with each type ID. 366 // The types associated with each type ID.
369 std::vector<ExtendedType> TypeIDValues; 367 std::vector<ExtendedType> TypeIDValues;
370 // The set of functions. 368 // The set of functions.
371 FunctionDeclarationListType FunctionDeclarationList; 369 FunctionDeclarationListType FunctionDeclarationList;
372 // The set of global variables. 370 // The set of global variables.
373 Ice::Translator::VariableDeclarationListType VariableDeclarations; 371 Ice::Translator::VariableDeclarationListType VariableDeclarations;
374 // Relocatable constants associated with global declarations. 372 // Relocatable constants associated with global declarations.
375 std::vector<Ice::Constant *> ValueIDConstants; 373 std::vector<Ice::Constant *> ValueIDConstants;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 // Reports that there is not global variable declaration for 416 // Reports that there is not global variable declaration for
419 // ID. Returns an error recovery value to use. 417 // ID. Returns an error recovery value to use.
420 Ice::VariableDeclaration *reportGetGlobalVariableByIDError(unsigned Index); 418 Ice::VariableDeclaration *reportGetGlobalVariableByIDError(unsigned Index);
421 419
422 // Reports that there is no corresponding ICE type for LLVMTy, and 420 // Reports that there is no corresponding ICE type for LLVMTy, and
423 // returns ICE::IceType_void. 421 // returns ICE::IceType_void.
424 Ice::Type convertToIceTypeError(Type *LLVMTy); 422 Ice::Type convertToIceTypeError(Type *LLVMTy);
425 }; 423 };
426 424
427 bool TopLevelParser::Error(const std::string &Message) { 425 bool TopLevelParser::Error(const std::string &Message) {
428 ErrorStatus = true; 426 ErrorStatus.assign(Ice::EC_Bitcode);
429 ++NumErrors; 427 ++NumErrors;
430 Ice::GlobalContext *Context = Translator.getContext(); 428 Ice::GlobalContext *Context = Translator.getContext();
431 Ice::OstreamLocker L(Context); 429 Ice::OstreamLocker L(Context);
432 raw_ostream &OldErrStream = setErrStream(Context->getStrDump()); 430 raw_ostream &OldErrStream = setErrStream(Context->getStrDump());
433 NaClBitcodeParser::Error(Message); 431 NaClBitcodeParser::Error(Message);
434 setErrStream(OldErrStream); 432 setErrStream(OldErrStream);
435 if (!Translator.getFlags().AllowErrorRecovery) 433 if (!Translator.getFlags().AllowErrorRecovery)
436 report_fatal_error("Unable to continue"); 434 report_fatal_error("Unable to continue");
437 return true; 435 return true;
438 } 436 }
(...skipping 2366 matching lines...) Expand 10 before | Expand all | Expand 10 after
2805 ++NameIndex; 2803 ++NameIndex;
2806 } else { 2804 } else {
2807 Trans.checkIfUnnamedNameSafe(Decl->getName(), Context, Prefix); 2805 Trans.checkIfUnnamedNameSafe(Decl->getName(), Context, Prefix);
2808 } 2806 }
2809 } 2807 }
2810 2808
2811 bool ParseBlock(unsigned BlockID) override; 2809 bool ParseBlock(unsigned BlockID) override;
2812 2810
2813 void ExitBlock() override { 2811 void ExitBlock() override {
2814 InstallGlobalNamesAndGlobalVarInitializers(); 2812 InstallGlobalNamesAndGlobalVarInitializers();
2815 getTranslator().emitConstants();
2816 } 2813 }
2817 2814
2818 void ProcessRecord() override; 2815 void ProcessRecord() override;
2819 }; 2816 };
2820 2817
2821 class ModuleValuesymtabParser : public ValuesymtabParser { 2818 class ModuleValuesymtabParser : public ValuesymtabParser {
2822 ModuleValuesymtabParser(const ModuleValuesymtabParser &) = delete; 2819 ModuleValuesymtabParser(const ModuleValuesymtabParser &) = delete;
2823 void operator=(const ModuleValuesymtabParser &) = delete; 2820 void operator=(const ModuleValuesymtabParser &) = delete;
2824 2821
2825 public: 2822 public:
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
2938 2935
2939 } // end of anonymous namespace 2936 } // end of anonymous namespace
2940 2937
2941 namespace Ice { 2938 namespace Ice {
2942 2939
2943 void PNaClTranslator::translate(const std::string &IRFilename) { 2940 void PNaClTranslator::translate(const std::string &IRFilename) {
2944 ErrorOr<std::unique_ptr<MemoryBuffer>> ErrOrFile = 2941 ErrorOr<std::unique_ptr<MemoryBuffer>> ErrOrFile =
2945 MemoryBuffer::getFileOrSTDIN(IRFilename); 2942 MemoryBuffer::getFileOrSTDIN(IRFilename);
2946 if (std::error_code EC = ErrOrFile.getError()) { 2943 if (std::error_code EC = ErrOrFile.getError()) {
2947 errs() << "Error reading '" << IRFilename << "': " << EC.message() << "\n"; 2944 errs() << "Error reading '" << IRFilename << "': " << EC.message() << "\n";
2948 ErrorStatus = true; 2945 ErrorStatus.assign(EC.value());
2949 return; 2946 return;
2950 } 2947 }
2951 2948
2952 std::unique_ptr<MemoryBuffer> MemBuf(ErrOrFile.get().release()); 2949 std::unique_ptr<MemoryBuffer> MemBuf(ErrOrFile.get().release());
2953 translateBuffer(IRFilename, MemBuf.get()); 2950 translateBuffer(IRFilename, MemBuf.get());
2954 } 2951 }
2955 2952
2956 void PNaClTranslator::translateBuffer(const std::string &IRFilename, 2953 void PNaClTranslator::translateBuffer(const std::string &IRFilename,
2957 MemoryBuffer *MemBuf) { 2954 MemoryBuffer *MemBuf) {
2958 if (MemBuf->getBufferSize() % 4 != 0) { 2955 if (MemBuf->getBufferSize() % 4 != 0) {
2959 errs() << IRFilename 2956 errs() << IRFilename
2960 << ": Bitcode stream should be a multiple of 4 bytes in length.\n"; 2957 << ": Bitcode stream should be a multiple of 4 bytes in length.\n";
2961 ErrorStatus = true; 2958 ErrorStatus.assign(EC_Bitcode);
2962 return; 2959 return;
2963 } 2960 }
2964 2961
2965 const unsigned char *BufPtr = (const unsigned char *)MemBuf->getBufferStart(); 2962 const unsigned char *BufPtr = (const unsigned char *)MemBuf->getBufferStart();
2966 const unsigned char *EndBufPtr = BufPtr + MemBuf->getBufferSize(); 2963 const unsigned char *EndBufPtr = BufPtr + MemBuf->getBufferSize();
2967 2964
2968 // Read header and verify it is good. 2965 // Read header and verify it is good.
2969 NaClBitcodeHeader Header; 2966 NaClBitcodeHeader Header;
2970 if (Header.Read(BufPtr, EndBufPtr) || !Header.IsSupported()) { 2967 if (Header.Read(BufPtr, EndBufPtr) || !Header.IsSupported()) {
2971 errs() << "Invalid PNaCl bitcode header.\n"; 2968 errs() << "Invalid PNaCl bitcode header.\n";
2972 ErrorStatus = true; 2969 ErrorStatus.assign(EC_Bitcode);
2973 return; 2970 return;
2974 } 2971 }
2975 2972
2976 // Create a bitstream reader to read the bitcode file. 2973 // Create a bitstream reader to read the bitcode file.
2977 NaClBitstreamReader InputStreamFile(BufPtr, EndBufPtr); 2974 NaClBitstreamReader InputStreamFile(BufPtr, EndBufPtr);
2978 NaClBitstreamCursor InputStream(InputStreamFile); 2975 NaClBitstreamCursor InputStream(InputStreamFile);
2979 2976
2980 TopLevelParser Parser(*this, Header, InputStream, ErrorStatus); 2977 TopLevelParser Parser(*this, Header, InputStream, ErrorStatus);
2981 int TopLevelBlocks = 0; 2978 int TopLevelBlocks = 0;
2982 while (!InputStream.AtEndOfStream()) { 2979 while (!InputStream.AtEndOfStream()) {
2983 if (Parser.Parse()) { 2980 if (Parser.Parse()) {
2984 ErrorStatus = true; 2981 ErrorStatus.assign(EC_Bitcode);
2985 return; 2982 return;
2986 } 2983 }
2987 ++TopLevelBlocks; 2984 ++TopLevelBlocks;
2988 } 2985 }
2989 2986
2990 if (TopLevelBlocks != 1) { 2987 if (TopLevelBlocks != 1) {
2991 errs() << IRFilename 2988 errs() << IRFilename
2992 << ": Contains more than one module. Found: " << TopLevelBlocks 2989 << ": Contains more than one module. Found: " << TopLevelBlocks
2993 << "\n"; 2990 << "\n";
2994 ErrorStatus = true; 2991 ErrorStatus.assign(EC_Bitcode);
2995 } 2992 }
2996 } 2993 }
2997 2994
2998 } // end of namespace Ice 2995 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/PNaClTranslator.h ('k') | src/llvm2ice.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698