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

Side by Side Diff: src/PNaClTranslator.cpp

Issue 512933006: LLVM 3.5 merge: Subzero (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Rebase Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceTranslator.cpp ('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
11 // translator. 11 // translator.
12 // 12 //
13 //===----------------------------------------------------------------------===// 13 //===----------------------------------------------------------------------===//
14 14
15 #include "PNaClTranslator.h"
16 #include "IceCfg.h" 15 #include "IceCfg.h"
17 #include "IceCfgNode.h" 16 #include "IceCfgNode.h"
18 #include "IceClFlags.h" 17 #include "IceClFlags.h"
19 #include "IceDefs.h" 18 #include "IceDefs.h"
20 #include "IceInst.h" 19 #include "IceInst.h"
21 #include "IceOperand.h" 20 #include "IceOperand.h"
22 #include "IceTypeConverter.h" 21 #include "IceTypeConverter.h"
23 #include "llvm/Analysis/NaCl/PNaClABIProps.h" 22 #include "llvm/Analysis/NaCl/PNaClABIProps.h"
24 #include "llvm/Bitcode/NaCl/NaClBitcodeDecoders.h" 23 #include "llvm/Bitcode/NaCl/NaClBitcodeDecoders.h"
25 #include "llvm/Bitcode/NaCl/NaClBitcodeHeader.h" 24 #include "llvm/Bitcode/NaCl/NaClBitcodeHeader.h"
26 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" 25 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h"
27 #include "llvm/Bitcode/NaCl/NaClReaderWriter.h" 26 #include "llvm/Bitcode/NaCl/NaClReaderWriter.h"
28 #include "llvm/IR/Constants.h" 27 #include "llvm/IR/Constants.h"
29 #include "llvm/IR/DataLayout.h" 28 #include "llvm/IR/DataLayout.h"
30 #include "llvm/IR/LLVMContext.h" 29 #include "llvm/IR/LLVMContext.h"
31 #include "llvm/IR/Module.h" 30 #include "llvm/IR/Module.h"
31 #include "llvm/IR/ValueHandle.h"
32 #include "llvm/Support/Format.h" 32 #include "llvm/Support/Format.h"
33 #include "llvm/Support/MemoryBuffer.h" 33 #include "llvm/Support/MemoryBuffer.h"
34 #include "llvm/Support/raw_ostream.h" 34 #include "llvm/Support/raw_ostream.h"
35 #include "llvm/Support/ValueHandle.h"
36 35
36 #include <cassert>
37 #include <vector> 37 #include <vector>
38 #include <cassert>
39 38
40 using namespace llvm; 39 using namespace llvm;
41 40
42 namespace { 41 namespace {
43 42
44 // TODO(kschimpf) Remove error recovery once implementation complete. 43 // TODO(kschimpf) Remove error recovery once implementation complete.
45 static cl::opt<bool> AllowErrorRecovery( 44 static cl::opt<bool> AllowErrorRecovery(
46 "allow-pnacl-reader-error-recovery", 45 "allow-pnacl-reader-error-recovery",
47 cl::desc("Allow error recovery when reading PNaCl bitcode."), 46 cl::desc("Allow error recovery when reading PNaCl bitcode."),
48 cl::init(false)); 47 cl::init(false));
(...skipping 10 matching lines...) Expand all
59 : NaClBitcodeParser(Cursor), Translator(Translator), 58 : NaClBitcodeParser(Cursor), Translator(Translator),
60 Mod(new Module(InputName, getGlobalContext())), DL(PNaClDataLayout), 59 Mod(new Module(InputName, getGlobalContext())), DL(PNaClDataLayout),
61 Header(Header), TypeConverter(getLLVMContext()), 60 Header(Header), TypeConverter(getLLVMContext()),
62 ErrorStatus(ErrorStatus), NumErrors(0), NumFunctionIds(0), 61 ErrorStatus(ErrorStatus), NumErrors(0), NumFunctionIds(0),
63 NumFunctionBlocks(0), 62 NumFunctionBlocks(0),
64 GlobalVarPlaceHolderType(convertToLLVMType(Ice::IceType_i8)) { 63 GlobalVarPlaceHolderType(convertToLLVMType(Ice::IceType_i8)) {
65 Mod->setDataLayout(PNaClDataLayout); 64 Mod->setDataLayout(PNaClDataLayout);
66 setErrStream(Translator.getContext()->getStrDump()); 65 setErrStream(Translator.getContext()->getStrDump());
67 } 66 }
68 67
69 virtual ~TopLevelParser() {} 68 ~TopLevelParser() override {}
70 LLVM_OVERRIDE;
71 69
72 Ice::Translator &getTranslator() { return Translator; } 70 Ice::Translator &getTranslator() { return Translator; }
73 71
74 // Generates error with given Message. Always returns true. 72 // Generates error with given Message. Always returns true.
75 virtual bool Error(const std::string &Message) LLVM_OVERRIDE { 73 bool Error(const std::string &Message) override {
76 ErrorStatus = true; 74 ErrorStatus = true;
77 ++NumErrors; 75 ++NumErrors;
78 NaClBitcodeParser::Error(Message); 76 NaClBitcodeParser::Error(Message);
79 if (!AllowErrorRecovery) 77 if (!AllowErrorRecovery)
80 report_fatal_error("Unable to continue"); 78 report_fatal_error("Unable to continue");
81 return true; 79 return true;
82 } 80 }
83 81
84 /// Returns the number of errors found while parsing the bitcode 82 /// Returns the number of errors found while parsing the bitcode
85 /// file. 83 /// file.
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 244
247 /// Returns the model for pointer types in ICE. 245 /// Returns the model for pointer types in ICE.
248 Ice::Type getIcePointerType() const { 246 Ice::Type getIcePointerType() const {
249 return TypeConverter.getIcePointerType(); 247 return TypeConverter.getIcePointerType();
250 } 248 }
251 249
252 private: 250 private:
253 // The translator associated with the parser. 251 // The translator associated with the parser.
254 Ice::Translator &Translator; 252 Ice::Translator &Translator;
255 // The parsed module. 253 // The parsed module.
256 OwningPtr<Module> Mod; 254 std::unique_ptr<Module> Mod;
257 // The data layout to use. 255 // The data layout to use.
258 DataLayout DL; 256 DataLayout DL;
259 // The bitcode header. 257 // The bitcode header.
260 NaClBitcodeHeader &Header; 258 NaClBitcodeHeader &Header;
261 // Converter between LLVM and ICE types. 259 // Converter between LLVM and ICE types.
262 Ice::TypeConverter TypeConverter; 260 Ice::TypeConverter TypeConverter;
263 // The exit status that should be set to true if an error occurs. 261 // The exit status that should be set to true if an error occurs.
264 bool &ErrorStatus; 262 bool &ErrorStatus;
265 // The number of errors reported. 263 // The number of errors reported.
266 unsigned NumErrors; 264 unsigned NumErrors;
267 // The types associated with each type ID. 265 // The types associated with each type ID.
268 std::vector<Type *> TypeIDValues; 266 std::vector<Type *> TypeIDValues;
269 // The (global) value IDs. 267 // The (global) value IDs.
270 std::vector<WeakVH> ValueIDValues; 268 std::vector<WeakVH> ValueIDValues;
271 // Relocatable constants associated with ValueIDValues. 269 // Relocatable constants associated with ValueIDValues.
272 std::vector<Ice::Constant *> ValueIDConstants; 270 std::vector<Ice::Constant *> ValueIDConstants;
273 // The number of function IDs. 271 // The number of function IDs.
274 unsigned NumFunctionIds; 272 unsigned NumFunctionIds;
275 // The number of function blocks (processed so far). 273 // The number of function blocks (processed so far).
276 unsigned NumFunctionBlocks; 274 unsigned NumFunctionBlocks;
277 // The list of value IDs (in the order found) of defining function 275 // The list of value IDs (in the order found) of defining function
278 // addresses. 276 // addresses.
279 std::vector<unsigned> DefiningFunctionsList; 277 std::vector<unsigned> DefiningFunctionsList;
280 // Cached global variable placeholder type. Used for all forward 278 // Cached global variable placeholder type. Used for all forward
281 // references to global variable addresses. 279 // references to global variable addresses.
282 Type *GlobalVarPlaceHolderType; 280 Type *GlobalVarPlaceHolderType;
283 281
284 virtual bool ParseBlock(unsigned BlockID) LLVM_OVERRIDE; 282 bool ParseBlock(unsigned BlockID) override;
285 283
286 /// Reports that type ID is undefined, and then returns 284 /// Reports that type ID is undefined, and then returns
287 /// the void type. 285 /// the void type.
288 Type *reportTypeIDAsUndefined(unsigned ID); 286 Type *reportTypeIDAsUndefined(unsigned ID);
289 287
290 /// Reports error about bad call to setTypeID. 288 /// Reports error about bad call to setTypeID.
291 void reportBadSetTypeID(unsigned ID, Type *Ty); 289 void reportBadSetTypeID(unsigned ID, Type *Ty);
292 290
293 // Reports that there is no corresponding ICE type for LLVMTy, and 291 // Reports that there is no corresponding ICE type for LLVMTy, and
294 // returns ICE::IceType_void. 292 // returns ICE::IceType_void.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 // Base class for parsing blocks within the bitcode file. Note: 330 // Base class for parsing blocks within the bitcode file. Note:
333 // Because this is the base class of block parsers, we generate error 331 // Because this is the base class of block parsers, we generate error
334 // messages if ParseBlock or ParseRecord is not overridden in derived 332 // messages if ParseBlock or ParseRecord is not overridden in derived
335 // classes. 333 // classes.
336 class BlockParserBaseClass : public NaClBitcodeParser { 334 class BlockParserBaseClass : public NaClBitcodeParser {
337 public: 335 public:
338 // Constructor for the top-level module block parser. 336 // Constructor for the top-level module block parser.
339 BlockParserBaseClass(unsigned BlockID, TopLevelParser *Context) 337 BlockParserBaseClass(unsigned BlockID, TopLevelParser *Context)
340 : NaClBitcodeParser(BlockID, Context), Context(Context) {} 338 : NaClBitcodeParser(BlockID, Context), Context(Context) {}
341 339
342 virtual ~BlockParserBaseClass() LLVM_OVERRIDE {} 340 ~BlockParserBaseClass() override {}
343 341
344 protected: 342 protected:
345 // The context parser that contains the decoded state. 343 // The context parser that contains the decoded state.
346 TopLevelParser *Context; 344 TopLevelParser *Context;
347 345
348 // Constructor for nested block parsers. 346 // Constructor for nested block parsers.
349 BlockParserBaseClass(unsigned BlockID, BlockParserBaseClass *EnclosingParser) 347 BlockParserBaseClass(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
350 : NaClBitcodeParser(BlockID, EnclosingParser), 348 : NaClBitcodeParser(BlockID, EnclosingParser),
351 Context(EnclosingParser->Context) {} 349 Context(EnclosingParser->Context) {}
352 350
353 // Gets the translator associated with the bitcode parser. 351 // Gets the translator associated with the bitcode parser.
354 Ice::Translator &getTranslator() const { return Context->getTranslator(); } 352 Ice::Translator &getTranslator() const { return Context->getTranslator(); }
355 353
356 const Ice::ClFlags &getFlags() const { return getTranslator().getFlags(); } 354 const Ice::ClFlags &getFlags() const { return getTranslator().getFlags(); }
357 355
358 // Generates an error Message with the bit address prefixed to it. 356 // Generates an error Message with the bit address prefixed to it.
359 virtual bool Error(const std::string &Message) LLVM_OVERRIDE { 357 bool Error(const std::string &Message) override {
360 uint64_t Bit = Record.GetStartBit() + Context->getHeaderSize() * 8; 358 uint64_t Bit = Record.GetStartBit() + Context->getHeaderSize() * 8;
361 std::string Buffer; 359 std::string Buffer;
362 raw_string_ostream StrBuf(Buffer); 360 raw_string_ostream StrBuf(Buffer);
363 StrBuf << "(" << format("%" PRIu64 ":%u", (Bit / 8), 361 StrBuf << "(" << format("%" PRIu64 ":%u", (Bit / 8),
364 static_cast<unsigned>(Bit % 8)) << ") " << Message; 362 static_cast<unsigned>(Bit % 8)) << ") " << Message;
365 return Context->Error(StrBuf.str()); 363 return Context->Error(StrBuf.str());
366 } 364 }
367 365
368 // Default implementation. Reports that block is unknown and skips 366 // Default implementation. Reports that block is unknown and skips
369 // its contents. 367 // its contents.
370 virtual bool ParseBlock(unsigned BlockID) LLVM_OVERRIDE; 368 bool ParseBlock(unsigned BlockID) override;
371 369
372 // Default implementation. Reports that the record is not 370 // Default implementation. Reports that the record is not
373 // understood. 371 // understood.
374 virtual void ProcessRecord() LLVM_OVERRIDE; 372 void ProcessRecord() override;
375 373
376 // Checks if the size of the record is Size. Return true if valid. 374 // Checks if the size of the record is Size. Return true if valid.
377 // Otherwise generates an error and returns false. 375 // Otherwise generates an error and returns false.
378 bool isValidRecordSize(unsigned Size, const char *RecordName) { 376 bool isValidRecordSize(unsigned Size, const char *RecordName) {
379 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); 377 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
380 if (Values.size() == Size) 378 if (Values.size() == Size)
381 return true; 379 return true;
382 ReportRecordSizeError(Size, RecordName, NULL); 380 ReportRecordSizeError(Size, RecordName, NULL);
383 return false; 381 return false;
384 } 382 }
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 StrBuf << "Don't know how to process record: " << Record; 456 StrBuf << "Don't know how to process record: " << Record;
459 Error(StrBuf.str()); 457 Error(StrBuf.str());
460 } 458 }
461 459
462 // Class to parse a types block. 460 // Class to parse a types block.
463 class TypesParser : public BlockParserBaseClass { 461 class TypesParser : public BlockParserBaseClass {
464 public: 462 public:
465 TypesParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser) 463 TypesParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
466 : BlockParserBaseClass(BlockID, EnclosingParser), NextTypeId(0) {} 464 : BlockParserBaseClass(BlockID, EnclosingParser), NextTypeId(0) {}
467 465
468 ~TypesParser() LLVM_OVERRIDE {} 466 ~TypesParser() override {}
469 467
470 private: 468 private:
471 // The type ID that will be associated with the next type defining 469 // The type ID that will be associated with the next type defining
472 // record in the types block. 470 // record in the types block.
473 unsigned NextTypeId; 471 unsigned NextTypeId;
474 472
475 virtual void ProcessRecord() LLVM_OVERRIDE; 473 void ProcessRecord() override;
476 }; 474 };
477 475
478 void TypesParser::ProcessRecord() { 476 void TypesParser::ProcessRecord() {
479 Type *Ty = NULL; 477 Type *Ty = NULL;
480 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); 478 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
481 switch (Record.GetCode()) { 479 switch (Record.GetCode()) {
482 case naclbitc::TYPE_CODE_NUMENTRY: 480 case naclbitc::TYPE_CODE_NUMENTRY:
483 // NUMENTRY: [numentries] 481 // NUMENTRY: [numentries]
484 if (!isValidRecordSize(1, "Type count")) 482 if (!isValidRecordSize(1, "Type count"))
485 return; 483 return;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 556
559 /// Parses the globals block (i.e. global variables). 557 /// Parses the globals block (i.e. global variables).
560 class GlobalsParser : public BlockParserBaseClass { 558 class GlobalsParser : public BlockParserBaseClass {
561 public: 559 public:
562 GlobalsParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser) 560 GlobalsParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
563 : BlockParserBaseClass(BlockID, EnclosingParser), InitializersNeeded(0), 561 : BlockParserBaseClass(BlockID, EnclosingParser), InitializersNeeded(0),
564 Alignment(1), IsConstant(false) { 562 Alignment(1), IsConstant(false) {
565 NextGlobalID = Context->getNumFunctionIDs(); 563 NextGlobalID = Context->getNumFunctionIDs();
566 } 564 }
567 565
568 virtual ~GlobalsParser() LLVM_OVERRIDE {} 566 ~GlobalsParser() override {}
569 567
570 private: 568 private:
571 // Holds the sequence of initializers for the global. 569 // Holds the sequence of initializers for the global.
572 SmallVector<Constant *, 10> Initializers; 570 SmallVector<Constant *, 10> Initializers;
573 571
574 // Keeps track of how many initializers are expected for 572 // Keeps track of how many initializers are expected for
575 // the global variable being built. 573 // the global variable being built.
576 unsigned InitializersNeeded; 574 unsigned InitializersNeeded;
577 575
578 // The alignment assumed for the global variable being built. 576 // The alignment assumed for the global variable being built.
579 unsigned Alignment; 577 unsigned Alignment;
580 578
581 // True if the global variable being built is a constant. 579 // True if the global variable being built is a constant.
582 bool IsConstant; 580 bool IsConstant;
583 581
584 // The index of the next global variable. 582 // The index of the next global variable.
585 unsigned NextGlobalID; 583 unsigned NextGlobalID;
586 584
587 virtual void ExitBlock() LLVM_OVERRIDE { 585 void ExitBlock() override {
588 verifyNoMissingInitializers(); 586 verifyNoMissingInitializers();
589 unsigned NumIDs = Context->getNumGlobalValueIDs(); 587 unsigned NumIDs = Context->getNumGlobalValueIDs();
590 if (NextGlobalID < NumIDs) { 588 if (NextGlobalID < NumIDs) {
591 unsigned NumFcnIDs = Context->getNumFunctionIDs(); 589 unsigned NumFcnIDs = Context->getNumFunctionIDs();
592 std::string Buffer; 590 std::string Buffer;
593 raw_string_ostream StrBuf(Buffer); 591 raw_string_ostream StrBuf(Buffer);
594 StrBuf << "Globals block expects " << (NumIDs - NumFcnIDs) 592 StrBuf << "Globals block expects " << (NumIDs - NumFcnIDs)
595 << " global definitions. Found: " << (NextGlobalID - NumFcnIDs); 593 << " global definitions. Found: " << (NextGlobalID - NumFcnIDs);
596 Error(StrBuf.str()); 594 Error(StrBuf.str());
597 } 595 }
598 BlockParserBaseClass::ExitBlock(); 596 BlockParserBaseClass::ExitBlock();
599 } 597 }
600 598
601 virtual void ProcessRecord() LLVM_OVERRIDE; 599 void ProcessRecord() override;
602 600
603 // Checks if the number of initializers needed is the same as the 601 // Checks if the number of initializers needed is the same as the
604 // number found in the bitcode file. If different, and error message 602 // number found in the bitcode file. If different, and error message
605 // is generated, and the internal state of the parser is fixed so 603 // is generated, and the internal state of the parser is fixed so
606 // this condition is no longer violated. 604 // this condition is no longer violated.
607 void verifyNoMissingInitializers() { 605 void verifyNoMissingInitializers() {
608 if (InitializersNeeded != Initializers.size()) { 606 if (InitializersNeeded != Initializers.size()) {
609 std::string Buffer; 607 std::string Buffer;
610 raw_string_ostream StrBuf(Buffer); 608 raw_string_ostream StrBuf(Buffer);
611 StrBuf << "Global variable @g" 609 StrBuf << "Global variable @g"
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 764
767 /// Base class for parsing a valuesymtab block in the bitcode file. 765 /// Base class for parsing a valuesymtab block in the bitcode file.
768 class ValuesymtabParser : public BlockParserBaseClass { 766 class ValuesymtabParser : public BlockParserBaseClass {
769 ValuesymtabParser(const ValuesymtabParser &) LLVM_DELETED_FUNCTION; 767 ValuesymtabParser(const ValuesymtabParser &) LLVM_DELETED_FUNCTION;
770 void operator=(const ValuesymtabParser &) LLVM_DELETED_FUNCTION; 768 void operator=(const ValuesymtabParser &) LLVM_DELETED_FUNCTION;
771 769
772 public: 770 public:
773 ValuesymtabParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser) 771 ValuesymtabParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
774 : BlockParserBaseClass(BlockID, EnclosingParser) {} 772 : BlockParserBaseClass(BlockID, EnclosingParser) {}
775 773
776 virtual ~ValuesymtabParser() LLVM_OVERRIDE {} 774 ~ValuesymtabParser() override {}
777 775
778 protected: 776 protected:
779 typedef SmallString<128> StringType; 777 typedef SmallString<128> StringType;
780 778
781 // Associates Name with the value defined by the given Index. 779 // Associates Name with the value defined by the given Index.
782 virtual void setValueName(uint64_t Index, StringType &Name) = 0; 780 virtual void setValueName(uint64_t Index, StringType &Name) = 0;
783 781
784 // Associates Name with the value defined by the given Index; 782 // Associates Name with the value defined by the given Index;
785 virtual void setBbName(uint64_t Index, StringType &Name) = 0; 783 virtual void setBbName(uint64_t Index, StringType &Name) = 0;
786 784
787 private: 785 private:
788 786
789 virtual void ProcessRecord() LLVM_OVERRIDE; 787 void ProcessRecord() override;
790 788
791 void ConvertToString(StringType &ConvertedName) { 789 void ConvertToString(StringType &ConvertedName) {
792 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); 790 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
793 for (size_t i = 1, e = Values.size(); i != e; ++i) { 791 for (size_t i = 1, e = Values.size(); i != e; ++i) {
794 ConvertedName += static_cast<char>(Values[i]); 792 ConvertedName += static_cast<char>(Values[i]);
795 } 793 }
796 } 794 }
797 }; 795 };
798 796
799 void ValuesymtabParser::ProcessRecord() { 797 void ValuesymtabParser::ProcessRecord() {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 Func->setInternal(LLVMFunc->hasInternalLinkage()); 844 Func->setInternal(LLVMFunc->hasInternalLinkage());
847 CurrentNode = InstallNextBasicBlock(); 845 CurrentNode = InstallNextBasicBlock();
848 Func->setEntryNode(CurrentNode); 846 Func->setEntryNode(CurrentNode);
849 for (Function::const_arg_iterator ArgI = LLVMFunc->arg_begin(), 847 for (Function::const_arg_iterator ArgI = LLVMFunc->arg_begin(),
850 ArgE = LLVMFunc->arg_end(); 848 ArgE = LLVMFunc->arg_end();
851 ArgI != ArgE; ++ArgI) { 849 ArgI != ArgE; ++ArgI) {
852 Func->addArg(getNextInstVar(Context->convertToIceType(ArgI->getType()))); 850 Func->addArg(getNextInstVar(Context->convertToIceType(ArgI->getType())));
853 } 851 }
854 } 852 }
855 853
856 ~FunctionParser() LLVM_OVERRIDE; 854 ~FunctionParser() override;
857 855
858 // Set the next constant ID to the given constant C. 856 // Set the next constant ID to the given constant C.
859 void setNextConstantID(Ice::Constant *C) { 857 void setNextConstantID(Ice::Constant *C) {
860 setOperand(NextLocalInstIndex++, C); 858 setOperand(NextLocalInstIndex++, C);
861 } 859 }
862 860
863 private: 861 private:
864 // Timer for reading function bitcode and converting to ICE. 862 // Timer for reading function bitcode and converting to ICE.
865 Ice::Timer TConvert; 863 Ice::Timer TConvert;
866 // The corresponding ICE function defined by the function block. 864 // The corresponding ICE function defined by the function block.
(...skipping 1514 matching lines...) Expand 10 before | Expand all | Expand 10 after
2381 // Generate error message by using default block implementation. 2379 // Generate error message by using default block implementation.
2382 BlockParserBaseClass Parser(BlockID, this); 2380 BlockParserBaseClass Parser(BlockID, this);
2383 return Parser.ParseThisBlock(); 2381 return Parser.ParseThisBlock();
2384 } 2382 }
2385 2383
2386 } // end of anonymous namespace 2384 } // end of anonymous namespace
2387 2385
2388 namespace Ice { 2386 namespace Ice {
2389 2387
2390 void PNaClTranslator::translate(const std::string &IRFilename) { 2388 void PNaClTranslator::translate(const std::string &IRFilename) {
2391 OwningPtr<MemoryBuffer> MemBuf; 2389 ErrorOr<std::unique_ptr<MemoryBuffer>> ErrOrFile =
2392 if (error_code ec = 2390 MemoryBuffer::getFileOrSTDIN(IRFilename);
2393 MemoryBuffer::getFileOrSTDIN(IRFilename.c_str(), MemBuf)) { 2391 if (std::error_code EC = ErrOrFile.getError()) {
2394 errs() << "Error reading '" << IRFilename << "': " << ec.message() << "\n"; 2392 errs() << "Error reading '" << IRFilename << "': " << EC.message() << "\n";
2395 ErrorStatus = true; 2393 ErrorStatus = true;
2396 return; 2394 return;
2397 } 2395 }
2396 std::unique_ptr<MemoryBuffer> MemBuf(ErrOrFile.get().release());
2398 2397
2399 if (MemBuf->getBufferSize() % 4 != 0) { 2398 if (MemBuf->getBufferSize() % 4 != 0) {
2400 errs() << IRFilename 2399 errs() << IRFilename
2401 << ": Bitcode stream should be a multiple of 4 bytes in length.\n"; 2400 << ": Bitcode stream should be a multiple of 4 bytes in length.\n";
2402 ErrorStatus = true; 2401 ErrorStatus = true;
2403 return; 2402 return;
2404 } 2403 }
2405 2404
2406 const unsigned char *BufPtr = (const unsigned char *)MemBuf->getBufferStart(); 2405 const unsigned char *BufPtr = (const unsigned char *)MemBuf->getBufferStart();
2407 const unsigned char *EndBufPtr = BufPtr + MemBuf->getBufferSize(); 2406 const unsigned char *EndBufPtr = BufPtr + MemBuf->getBufferSize();
(...skipping 23 matching lines...) Expand all
2431 2430
2432 if (TopLevelBlocks != 1) { 2431 if (TopLevelBlocks != 1) {
2433 errs() << IRFilename 2432 errs() << IRFilename
2434 << ": Contains more than one module. Found: " << TopLevelBlocks 2433 << ": Contains more than one module. Found: " << TopLevelBlocks
2435 << "\n"; 2434 << "\n";
2436 ErrorStatus = true; 2435 ErrorStatus = true;
2437 } 2436 }
2438 } 2437 }
2439 2438
2440 } // end of namespace Ice 2439 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceTranslator.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698