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

Side by Side Diff: src/PNaClTranslator.cpp

Issue 1363983002: Check that address is i32 for indirect calls. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix nit. Created 5 years, 3 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 | « no previous file | tests_lit/parse_errs/Inputs/indirect-call-on-float.tbc » ('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 /// \file 10 /// \file
(...skipping 1580 matching lines...) Expand 10 before | Expand all | Expand 10 after
1591 // Checks if the type of operand Op is the valid pointer type, for the given 1591 // Checks if the type of operand Op is the valid pointer type, for the given
1592 // InstructionName. Returns true if valid. Otherwise generates an error 1592 // InstructionName. Returns true if valid. Otherwise generates an error
1593 // message and returns false. 1593 // message and returns false.
1594 bool isValidPointerType(Ice::Operand *Op, const char *InstructionName) { 1594 bool isValidPointerType(Ice::Operand *Op, const char *InstructionName) {
1595 Ice::Type PtrType = Ice::getPointerType(); 1595 Ice::Type PtrType = Ice::getPointerType();
1596 if (Op->getType() == PtrType) 1596 if (Op->getType() == PtrType)
1597 return true; 1597 return true;
1598 std::string Buffer; 1598 std::string Buffer;
1599 raw_string_ostream StrBuf(Buffer); 1599 raw_string_ostream StrBuf(Buffer);
1600 StrBuf << InstructionName << " address not " << PtrType 1600 StrBuf << InstructionName << " address not " << PtrType
1601 << ". Found: " << *Op; 1601 << ". Found: " << Op->getType();
1602 Error(StrBuf.str()); 1602 Error(StrBuf.str());
1603 return false; 1603 return false;
1604 } 1604 }
1605 1605
1606 // Checks if loading/storing a value of type Ty is allowed. Returns true if 1606 // Checks if loading/storing a value of type Ty is allowed. Returns true if
1607 // Valid. Otherwise generates an error message and returns false. 1607 // Valid. Otherwise generates an error message and returns false.
1608 bool isValidLoadStoreType(Ice::Type Ty, const char *InstructionName) { 1608 bool isValidLoadStoreType(Ice::Type Ty, const char *InstructionName) {
1609 if (isLoadStoreType(Ty)) 1609 if (isLoadStoreType(Ty))
1610 return true; 1610 return true;
1611 std::string Buffer; 1611 std::string Buffer;
(...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after
2655 if (!isValidRecordSizeAtLeast(2, "call")) 2655 if (!isValidRecordSizeAtLeast(2, "call"))
2656 return; 2656 return;
2657 } else { 2657 } else {
2658 if (!isValidRecordSizeAtLeast(3, "call indirect")) 2658 if (!isValidRecordSizeAtLeast(3, "call indirect"))
2659 return; 2659 return;
2660 ParamsStartIndex = 3; 2660 ParamsStartIndex = 3;
2661 } 2661 }
2662 2662
2663 // Extract out the called function and its return type. 2663 // Extract out the called function and its return type.
2664 uint32_t CalleeIndex = convertRelativeToAbsIndex(Values[1], BaseIndex); 2664 uint32_t CalleeIndex = convertRelativeToAbsIndex(Values[1], BaseIndex);
2665 Ice::Operand *Callee = getOperand(CalleeIndex); 2665 Ice::Operand *Callee = getOperand(CalleeIndex);
Jim Stichnoth 2015/09/23 20:40:06 Would it make sense to check Callee for valid type
Karl 2015/09/24 21:28:22 Type signatures are explicitly defined for direct
2666 const Ice::FuncSigType *Signature = nullptr; 2666 const Ice::FuncSigType *Signature = nullptr;
2667 Ice::Type ReturnType = Ice::IceType_void; 2667 Ice::Type ReturnType = Ice::IceType_void;
2668 const Ice::Intrinsics::FullIntrinsicInfo *IntrinsicInfo = nullptr; 2668 const Ice::Intrinsics::FullIntrinsicInfo *IntrinsicInfo = nullptr;
2669 // Name of function if a direct call/intrinsic. Null otherwise. 2669 // Name of function if a direct call/intrinsic. Null otherwise.
2670 Ice::FunctionDeclaration *Fcn = nullptr; 2670 Ice::FunctionDeclaration *Fcn = nullptr;
2671 if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) { 2671 if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) {
2672 Fcn = Context->getFunctionByID(CalleeIndex); 2672 Fcn = Context->getFunctionByID(CalleeIndex);
2673 Signature = &Fcn->getSignature(); 2673 Signature = &Fcn->getSignature();
2674 ReturnType = Signature->getReturnType(); 2674 ReturnType = Signature->getReturnType();
2675 2675
2676 // Check if this direct call is to an Intrinsic (starts with "llvm.") 2676 // Check if this direct call is to an Intrinsic (starts with "llvm.")
2677 bool BadIntrinsic; 2677 bool BadIntrinsic;
2678 const Ice::IceString &Name = Fcn->getName(); 2678 const Ice::IceString &Name = Fcn->getName();
2679 IntrinsicInfo = getTranslator().getContext()->getIntrinsicsInfo().find( 2679 IntrinsicInfo = getTranslator().getContext()->getIntrinsicsInfo().find(
2680 Name, BadIntrinsic); 2680 Name, BadIntrinsic);
2681 if (BadIntrinsic) { 2681 if (BadIntrinsic) {
2682 std::string Buffer; 2682 std::string Buffer;
2683 raw_string_ostream StrBuf(Buffer); 2683 raw_string_ostream StrBuf(Buffer);
2684 StrBuf << "Invalid PNaCl intrinsic call to " << Name; 2684 StrBuf << "Invalid PNaCl intrinsic call to " << Name;
2685 Error(StrBuf.str()); 2685 Error(StrBuf.str());
2686 if (ReturnType != Ice::IceType_void) 2686 if (ReturnType != Ice::IceType_void)
2687 appendErrorInstruction(ReturnType); 2687 appendErrorInstruction(ReturnType);
2688 return; 2688 return;
2689 } 2689 }
2690 } else { 2690 } else {
2691 ReturnType = Context->getSimpleTypeByID(Values[2]); 2691 ReturnType = Context->getSimpleTypeByID(Values[2]);
2692 if (!isValidPointerType(Callee, "Call indirect")) {
2693 if (ReturnType != Ice::IceType_void)
2694 appendErrorInstruction(ReturnType);
Jim Stichnoth 2015/09/23 20:40:06 Should you return after this error? Or fall throu
Karl 2015/09/24 21:28:22 The code in general, should error recover if possi
2695 }
2692 } 2696 }
2693 2697
2694 // Check return type. 2698 // Check return type.
2695 if (IntrinsicInfo == nullptr && !isCallReturnType(ReturnType)) { 2699 if (IntrinsicInfo == nullptr && !isCallReturnType(ReturnType)) {
2696 std::string Buffer; 2700 std::string Buffer;
2697 raw_string_ostream StrBuf(Buffer); 2701 raw_string_ostream StrBuf(Buffer);
2698 StrBuf << "Return type of called function is invalid: " << ReturnType; 2702 StrBuf << "Return type of called function is invalid: " << ReturnType;
2699 Error(StrBuf.str()); 2703 Error(StrBuf.str());
2700 ReturnType = Ice::IceType_i32; 2704 ReturnType = Ice::IceType_i32;
2701 } 2705 }
(...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after
3296 raw_string_ostream StrBuf(Buffer); 3300 raw_string_ostream StrBuf(Buffer);
3297 StrBuf << IRFilename << ": Does not contain a module!"; 3301 StrBuf << IRFilename << ": Does not contain a module!";
3298 llvm::report_fatal_error(StrBuf.str()); 3302 llvm::report_fatal_error(StrBuf.str());
3299 } 3303 }
3300 if (InputStreamFile.getBitcodeBytes().getExtent() % 4 != 0) { 3304 if (InputStreamFile.getBitcodeBytes().getExtent() % 4 != 0) {
3301 llvm::report_fatal_error("Bitcode stream should be a multiple of 4 bytes"); 3305 llvm::report_fatal_error("Bitcode stream should be a multiple of 4 bytes");
3302 } 3306 }
3303 } 3307 }
3304 3308
3305 } // end of namespace Ice 3309 } // end of namespace Ice
OLDNEW
« no previous file with comments | « no previous file | tests_lit/parse_errs/Inputs/indirect-call-on-float.tbc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698