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

Side by Side Diff: src/PNaClTranslator.cpp

Issue 686913003: Fix insert/extract element vector operations to check index is literal (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix nits and reformat. Created 6 years, 1 month 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
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 1298 matching lines...) Expand 10 before | Expand all | Expand 10 after
1309 Context->convertToLLVMType(Ty))) 1309 Context->convertToLLVMType(Ty)))
1310 return true; 1310 return true;
1311 std::string Buffer; 1311 std::string Buffer;
1312 raw_string_ostream StrBuf(Buffer); 1312 raw_string_ostream StrBuf(Buffer);
1313 StrBuf << InstructionName << " " << Ty << "*: not allowed for alignment " 1313 StrBuf << InstructionName << " " << Ty << "*: not allowed for alignment "
1314 << Alignment; 1314 << Alignment;
1315 Error(StrBuf.str()); 1315 Error(StrBuf.str());
1316 return false; 1316 return false;
1317 } 1317 }
1318 1318
1319 // Types of errors that can occur for insertelement and extractelement
1320 // instructions.
1321 enum VectorIndexCheckValue {
1322 VectorIndexValid,
1323 VectorIndexOnNonVector,
1324 VectorIndexNotI32,
1325 VectorIndexNotInRange,
1326 VectorIndexNotConstant
1327 };
1328
1329 void DumpVectorIndexCheckValue(raw_ostream &Stream,
Jim Stichnoth 2014/10/28 22:25:54 dumpVectorIndexCheckValue
Karl 2014/10/29 17:00:58 Done.
1330 VectorIndexCheckValue Value) {
Jim Stichnoth 2014/10/28 22:25:54 Can this method be const? Or static?
Karl 2014/10/29 17:00:57 Done.
1331 switch (Value) {
1332 default:
1333 report_fatal_error("Unknown VectorIndexCheckValue");
1334 break;
1335 case VectorIndexValid:
1336 Stream << "Valid vector index";
1337 break;
1338 case VectorIndexOnNonVector:
1339 Stream << "Vector index on non vector";
1340 break;
1341 case VectorIndexNotI32:
1342 Stream << "Vector index not of type " << Ice::IceType_i32;
1343 break;
1344 case VectorIndexNotInRange:
1345 Stream << "Vector index not in range of vector";
1346 break;
1347 case VectorIndexNotConstant:
1348 Stream << "Vector index not integer constant";
1349 break;
1350 }
1351 }
1352
1353 // Returns whether the given vector index (for insertelement and
1354 // extractelement instructions) is valid.
1355 VectorIndexCheckValue validateVectorIndex(const Ice::Operand *Vec,
Jim Stichnoth 2014/10/28 22:25:54 Const or static?
Karl 2014/10/29 17:00:58 Done.
1356 const Ice::Operand *Index) {
1357 Ice::Type VecType = Vec->getType();
1358 if (!Ice::isVectorType(VecType))
1359 return VectorIndexOnNonVector;
1360 if (Index->getType() != Ice::IceType_i32)
1361 return VectorIndexNotI32;
Jim Stichnoth 2014/10/28 22:25:54 This is kind of nitpicky, but which error should b
Karl 2014/10/29 17:00:58 I agree this is better. However, I would interchan
1362 if (const auto *C = dyn_cast<Ice::ConstantInteger32>(Index)) {
1363 if (C->getValue() <= typeNumElements(VecType)) {
Jim Stichnoth 2014/10/28 22:25:54 This should be '<', not '<=', right?
Karl 2014/10/29 17:00:57 Yes.
1364 return VectorIndexValid;
1365 } else {
1366 return VectorIndexNotInRange;
1367 }
1368 } else {
1369 return VectorIndexNotConstant;
1370 }
1371 }
1372
1319 // Reports that the given binary Opcode, for the given type Ty, 1373 // Reports that the given binary Opcode, for the given type Ty,
1320 // is not understood. 1374 // is not understood.
1321 void ReportInvalidBinopOpcode(unsigned Opcode, Ice::Type Ty); 1375 void ReportInvalidBinopOpcode(unsigned Opcode, Ice::Type Ty);
1322 1376
1323 // Returns true if the Str begins with Prefix. 1377 // Returns true if the Str begins with Prefix.
1324 bool isStringPrefix(Ice::IceString &Str, Ice::IceString &Prefix) { 1378 bool isStringPrefix(Ice::IceString &Str, Ice::IceString &Prefix) {
1325 const size_t PrefixSize = Prefix.size(); 1379 const size_t PrefixSize = Prefix.size();
1326 if (Str.size() < PrefixSize) 1380 if (Str.size() < PrefixSize)
1327 return false; 1381 return false;
1328 for (size_t i = 0; i < PrefixSize; ++i) { 1382 for (size_t i = 0; i < PrefixSize; ++i) {
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1541 case naclbitc::FCMP_UNE: 1595 case naclbitc::FCMP_UNE:
1542 Cond = Ice::InstFcmp::Une; 1596 Cond = Ice::InstFcmp::Une;
1543 return true; 1597 return true;
1544 case naclbitc::FCMP_TRUE: 1598 case naclbitc::FCMP_TRUE:
1545 Cond = Ice::InstFcmp::True; 1599 Cond = Ice::InstFcmp::True;
1546 return true; 1600 return true;
1547 default: 1601 default:
1548 return false; 1602 return false;
1549 } 1603 }
1550 } 1604 }
1605
1606 // Creates an error instruction, generating a value of type Ty, and
1607 // adds a placeholder so that instruction indices line up. If Ty is
1608 // void, no placeholder is needed and the error instruction is not
1609 // appended.
Jim Stichnoth 2014/10/28 22:25:54 Maybe add a note about why Ty would be void - an i
Karl 2014/10/29 17:00:57 Done.
1610 // TODO(kschimpf) Remove error recovery once implementation complete.
1611 void appendErrorInstruction(Ice::Type Ty) {
Jim Stichnoth 2014/10/28 22:25:54 const?
Karl 2014/10/29 17:00:57 Not possible, modifies state when calling getNextI
1612 // Note: we don't worry about downstream translation errors because
1613 // the function will not be translated if any errors occur.
1614 if (Ty == Ice::IceType_void)
1615 return;
1616 Ice::Variable *Var = getNextInstVar(Ty);
1617 CurrentNode->appendInst(Ice::InstAssign::create(Func, Var, Var));
1618 }
1551 }; 1619 };
1552 1620
1553 void FunctionParser::ReportInvalidBinopOpcode(unsigned Opcode, Ice::Type Ty) { 1621 void FunctionParser::ReportInvalidBinopOpcode(unsigned Opcode, Ice::Type Ty) {
1554 std::string Buffer; 1622 std::string Buffer;
1555 raw_string_ostream StrBuf(Buffer); 1623 raw_string_ostream StrBuf(Buffer);
1556 StrBuf << "Binary opcode " << Opcode << "not understood for type " << Ty; 1624 StrBuf << "Binary opcode " << Opcode << "not understood for type " << Ty;
1557 Error(StrBuf.str()); 1625 Error(StrBuf.str());
1558 } 1626 }
1559 1627
1560 void FunctionParser::ExitBlock() { 1628 void FunctionParser::ExitBlock() {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1615 uint32_t NumBbs = Values[0]; 1683 uint32_t NumBbs = Values[0];
1616 if (NumBbs == 0) { 1684 if (NumBbs == 0) {
1617 Error("Functions must contain at least one basic block."); 1685 Error("Functions must contain at least one basic block.");
1618 // TODO(kschimpf) Remove error recovery once implementation complete. 1686 // TODO(kschimpf) Remove error recovery once implementation complete.
1619 NumBbs = 1; 1687 NumBbs = 1;
1620 } 1688 }
1621 // Install the basic blocks, skipping bb0 which was created in the 1689 // Install the basic blocks, skipping bb0 which was created in the
1622 // constructor. 1690 // constructor.
1623 for (size_t i = 1; i < NumBbs; ++i) 1691 for (size_t i = 1; i < NumBbs; ++i)
1624 InstallNextBasicBlock(); 1692 InstallNextBasicBlock();
1625 break; 1693 return;
1626 } 1694 }
1627 case naclbitc::FUNC_CODE_INST_BINOP: { 1695 case naclbitc::FUNC_CODE_INST_BINOP: {
1628 // BINOP: [opval, opval, opcode] 1696 // BINOP: [opval, opval, opcode]
1629 if (!isValidRecordSize(3, "function block binop")) 1697 if (!isValidRecordSize(3, "function block binop"))
1630 return; 1698 return;
1631 Ice::Operand *Op1 = getRelativeOperand(Values[0], BaseIndex); 1699 Ice::Operand *Op1 = getRelativeOperand(Values[0], BaseIndex);
1632 Ice::Operand *Op2 = getRelativeOperand(Values[1], BaseIndex); 1700 Ice::Operand *Op2 = getRelativeOperand(Values[1], BaseIndex);
1633 Ice::Type Type1 = Op1->getType(); 1701 Ice::Type Type1 = Op1->getType();
1634 Ice::Type Type2 = Op2->getType(); 1702 Ice::Type Type2 = Op2->getType();
1635 if (Type1 != Type2) { 1703 if (Type1 != Type2) {
1636 std::string Buffer; 1704 std::string Buffer;
1637 raw_string_ostream StrBuf(Buffer); 1705 raw_string_ostream StrBuf(Buffer);
1638 StrBuf << "Binop argument types differ: " << Type1 << " and " << Type2; 1706 StrBuf << "Binop argument types differ: " << Type1 << " and " << Type2;
1639 Error(StrBuf.str()); 1707 Error(StrBuf.str());
1640 // TODO(kschimpf) Remove error recovery once implementation complete. 1708 appendErrorInstruction(Type1);
1641 Op2 = Op1; 1709 return;
1642 } 1710 }
1643 1711
1644 Ice::InstArithmetic::OpKind Opcode; 1712 Ice::InstArithmetic::OpKind Opcode;
1645 if (!convertBinopOpcode(Values[2], Type1, Opcode)) 1713 if (!convertBinopOpcode(Values[2], Type1, Opcode))
1646 return; 1714 return;
1647 CurrentNode->appendInst(Ice::InstArithmetic::create( 1715 CurrentNode->appendInst(Ice::InstArithmetic::create(
1648 Func, Opcode, getNextInstVar(Type1), Op1, Op2)); 1716 Func, Opcode, getNextInstVar(Type1), Op1, Op2));
1649 break; 1717 return;
1650 } 1718 }
1651 case naclbitc::FUNC_CODE_INST_CAST: { 1719 case naclbitc::FUNC_CODE_INST_CAST: {
1652 // CAST: [opval, destty, castopc] 1720 // CAST: [opval, destty, castopc]
1653 if (!isValidRecordSize(3, "function block cast")) 1721 if (!isValidRecordSize(3, "function block cast"))
1654 return; 1722 return;
1655 Ice::Operand *Src = getRelativeOperand(Values[0], BaseIndex); 1723 Ice::Operand *Src = getRelativeOperand(Values[0], BaseIndex);
1656 Ice::Type CastType = Context->getSimpleTypeByID(Values[1]); 1724 Ice::Type CastType = Context->getSimpleTypeByID(Values[1]);
1657 Instruction::CastOps LLVMCastOp; 1725 Instruction::CastOps LLVMCastOp;
1658 Ice::InstCast::OpKind CastKind; 1726 Ice::InstCast::OpKind CastKind;
1659 if (!naclbitc::DecodeCastOpcode(Values[2], LLVMCastOp) || 1727 if (!naclbitc::DecodeCastOpcode(Values[2], LLVMCastOp) ||
1660 !convertLLVMCastOpToIceOp(LLVMCastOp, CastKind)) { 1728 !convertLLVMCastOpToIceOp(LLVMCastOp, CastKind)) {
1661 std::string Buffer; 1729 std::string Buffer;
1662 raw_string_ostream StrBuf(Buffer); 1730 raw_string_ostream StrBuf(Buffer);
1663 StrBuf << "Cast opcode not understood: " << Values[2]; 1731 StrBuf << "Cast opcode not understood: " << Values[2];
1664 Error(StrBuf.str()); 1732 Error(StrBuf.str());
1733 appendErrorInstruction(CastType);
1665 return; 1734 return;
1666 } 1735 }
1667 Ice::Type SrcType = Src->getType(); 1736 Ice::Type SrcType = Src->getType();
1668 if (!CastInst::castIsValid(LLVMCastOp, Context->convertToLLVMType(SrcType), 1737 if (!CastInst::castIsValid(LLVMCastOp, Context->convertToLLVMType(SrcType),
1669 Context->convertToLLVMType(CastType))) { 1738 Context->convertToLLVMType(CastType))) {
1670 std::string Buffer; 1739 std::string Buffer;
1671 raw_string_ostream StrBuf(Buffer); 1740 raw_string_ostream StrBuf(Buffer);
1672 StrBuf << "Illegal cast: " << Instruction::getOpcodeName(LLVMCastOp) 1741 StrBuf << "Illegal cast: " << Instruction::getOpcodeName(LLVMCastOp)
1673 << " " << SrcType << " to " << CastType; 1742 << " " << SrcType << " to " << CastType;
1674 Error(StrBuf.str()); 1743 Error(StrBuf.str());
1744 appendErrorInstruction(CastType);
1675 return; 1745 return;
1676 } 1746 }
1677 CurrentNode->appendInst( 1747 CurrentNode->appendInst(
1678 Ice::InstCast::create(Func, CastKind, getNextInstVar(CastType), Src)); 1748 Ice::InstCast::create(Func, CastKind, getNextInstVar(CastType), Src));
1679 break; 1749 return;
1680 } 1750 }
1681 case naclbitc::FUNC_CODE_INST_VSELECT: { 1751 case naclbitc::FUNC_CODE_INST_VSELECT: {
1682 // VSELECT: [opval, opval, pred] 1752 // VSELECT: [opval, opval, pred]
1683 Ice::Operand *ThenVal = getRelativeOperand(Values[0], BaseIndex); 1753 Ice::Operand *ThenVal = getRelativeOperand(Values[0], BaseIndex);
1684 Ice::Type ThenType = ThenVal->getType(); 1754 Ice::Type ThenType = ThenVal->getType();
1685 Ice::Operand *ElseVal = getRelativeOperand(Values[1], BaseIndex); 1755 Ice::Operand *ElseVal = getRelativeOperand(Values[1], BaseIndex);
1686 Ice::Type ElseType = ElseVal->getType(); 1756 Ice::Type ElseType = ElseVal->getType();
1687 if (ThenType != ElseType) { 1757 if (ThenType != ElseType) {
1688 std::string Buffer; 1758 std::string Buffer;
1689 raw_string_ostream StrBuf(Buffer); 1759 raw_string_ostream StrBuf(Buffer);
1690 StrBuf << "Select operands not same type. Found " << ThenType << " and " 1760 StrBuf << "Select operands not same type. Found " << ThenType << " and "
1691 << ElseType; 1761 << ElseType;
1692 Error(StrBuf.str()); 1762 Error(StrBuf.str());
1763 appendErrorInstruction(ThenType);
1693 return; 1764 return;
1694 } 1765 }
1695 Ice::Operand *CondVal = getRelativeOperand(Values[2], BaseIndex); 1766 Ice::Operand *CondVal = getRelativeOperand(Values[2], BaseIndex);
1696 Ice::Type CondType = CondVal->getType(); 1767 Ice::Type CondType = CondVal->getType();
1697 if (isVectorType(CondType)) { 1768 if (isVectorType(CondType)) {
1698 if (!isVectorType(ThenType) || 1769 if (!isVectorType(ThenType) ||
1699 typeElementType(CondType) != Ice::IceType_i1 || 1770 typeElementType(CondType) != Ice::IceType_i1 ||
1700 typeNumElements(ThenType) != typeNumElements(CondType)) { 1771 typeNumElements(ThenType) != typeNumElements(CondType)) {
1701 std::string Buffer; 1772 std::string Buffer;
1702 raw_string_ostream StrBuf(Buffer); 1773 raw_string_ostream StrBuf(Buffer);
1703 StrBuf << "Select condition type " << CondType 1774 StrBuf << "Select condition type " << CondType
1704 << " not allowed for values of type " << ThenType; 1775 << " not allowed for values of type " << ThenType;
1705 Error(StrBuf.str()); 1776 Error(StrBuf.str());
1777 appendErrorInstruction(ThenType);
1706 return; 1778 return;
1707 } 1779 }
1708 } else if (CondVal->getType() != Ice::IceType_i1) { 1780 } else if (CondVal->getType() != Ice::IceType_i1) {
1709 std::string Buffer; 1781 std::string Buffer;
1710 raw_string_ostream StrBuf(Buffer); 1782 raw_string_ostream StrBuf(Buffer);
1711 StrBuf << "Select condition " << CondVal << " not type i1. Found: " 1783 StrBuf << "Select condition " << CondVal << " not type i1. Found: "
1712 << CondVal->getType(); 1784 << CondVal->getType();
1713 Error(StrBuf.str()); 1785 Error(StrBuf.str());
1786 appendErrorInstruction(ThenType);
1714 return; 1787 return;
1715 } 1788 }
1716 CurrentNode->appendInst(Ice::InstSelect::create( 1789 CurrentNode->appendInst(Ice::InstSelect::create(
1717 Func, getNextInstVar(ThenType), CondVal, ThenVal, ElseVal)); 1790 Func, getNextInstVar(ThenType), CondVal, ThenVal, ElseVal));
1718 break; 1791 return;
1719 } 1792 }
1720 case naclbitc::FUNC_CODE_INST_EXTRACTELT: { 1793 case naclbitc::FUNC_CODE_INST_EXTRACTELT: {
1721 // EXTRACTELT: [opval, opval] 1794 // EXTRACTELT: [opval, opval]
1722 if (!isValidRecordSize(2, "function block extract element")) 1795 if (!isValidRecordSize(2, "function block extract element"))
1723 return; 1796 return;
1724 Ice::Operand *Vec = getRelativeOperand(Values[0], BaseIndex); 1797 Ice::Operand *Vec = getRelativeOperand(Values[0], BaseIndex);
1725 Ice::Type VecType = Vec->getType(); 1798 Ice::Type VecType = Vec->getType();
1726 if (!Ice::isVectorType(VecType)) { 1799 Ice::Operand *Index = getRelativeOperand(Values[1], BaseIndex);
1800 VectorIndexCheckValue IndexCheckValue = validateVectorIndex(Vec, Index);
1801 if (IndexCheckValue != VectorIndexValid) {
1727 std::string Buffer; 1802 std::string Buffer;
1728 raw_string_ostream StrBuf(Buffer); 1803 raw_string_ostream StrBuf(Buffer);
1729 StrBuf << "Extractelement not on vector. Found: " << *Vec; 1804 DumpVectorIndexCheckValue(StrBuf, IndexCheckValue);
1805 StrBuf << ": extractelement " << VecType << " " << *Vec << ", "
1806 << Index->getType() << " " << *Index;
1730 Error(StrBuf.str()); 1807 Error(StrBuf.str());
1808 appendErrorInstruction(VecType);
1809 return;
1731 } 1810 }
1732 Ice::Operand *Index = getRelativeOperand(Values[1], BaseIndex);
1733 if (Index->getType() != Ice::IceType_i32) {
1734 std::string Buffer;
1735 raw_string_ostream StrBuf(Buffer);
1736 StrBuf << "Extractelement index " << *Index << " not i32. Found: "
1737 << Index->getType();
1738 Error(StrBuf.str());
1739 }
1740 // TODO(kschimpf): Restrict index to a legal constant index (once
1741 // constants can be defined).
1742 CurrentNode->appendInst(Ice::InstExtractElement::create( 1811 CurrentNode->appendInst(Ice::InstExtractElement::create(
1743 Func, getNextInstVar(typeElementType(VecType)), Vec, Index)); 1812 Func, getNextInstVar(typeElementType(VecType)), Vec, Index));
1744 break; 1813 return;
1745 } 1814 }
1746 case naclbitc::FUNC_CODE_INST_INSERTELT: { 1815 case naclbitc::FUNC_CODE_INST_INSERTELT: {
1747 // INSERTELT: [opval, opval, opval] 1816 // INSERTELT: [opval, opval, opval]
1748 if (!isValidRecordSize(3, "function block insert element")) 1817 if (!isValidRecordSize(3, "function block insert element"))
1749 return; 1818 return;
1750 Ice::Operand *Vec = getRelativeOperand(Values[0], BaseIndex); 1819 Ice::Operand *Vec = getRelativeOperand(Values[0], BaseIndex);
1751 Ice::Type VecType = Vec->getType(); 1820 Ice::Type VecType = Vec->getType();
1752 if (!Ice::isVectorType(VecType)) { 1821 Ice::Operand *Elt = getRelativeOperand(Values[1], BaseIndex);
1822 Ice::Operand *Index = getRelativeOperand(Values[2], BaseIndex);
1823 VectorIndexCheckValue IndexCheckValue = validateVectorIndex(Vec, Index);
1824 if (IndexCheckValue != VectorIndexValid) {
1753 std::string Buffer; 1825 std::string Buffer;
1754 raw_string_ostream StrBuf(Buffer); 1826 raw_string_ostream StrBuf(Buffer);
1755 StrBuf << "Insertelement not on vector. Found: " << *Vec; 1827 DumpVectorIndexCheckValue(StrBuf, IndexCheckValue);
1828 StrBuf << ": insertelement " << VecType << " " << *Vec << ", "
1829 << Elt->getType() << " " << *Elt << ", " << Index->getType() << " "
1830 << *Index;
1756 Error(StrBuf.str()); 1831 Error(StrBuf.str());
1832 appendErrorInstruction(Elt->getType());
1833 return;
1757 } 1834 }
1758 Ice::Operand *Elt = getRelativeOperand(Values[1], BaseIndex);
1759 Ice::Type EltType = Elt->getType();
1760 if (EltType != typeElementType(VecType)) {
1761 std::string Buffer;
1762 raw_string_ostream StrBuf(Buffer);
1763 StrBuf << "Insertelement element " << *Elt << " not type "
1764 << typeElementType(VecType)
1765 << ". Found: " << EltType;
1766 Error(StrBuf.str());
1767 }
1768 Ice::Operand *Index = getRelativeOperand(Values[2], BaseIndex);
1769 if (Index->getType() != Ice::IceType_i32) {
1770 std::string Buffer;
1771 raw_string_ostream StrBuf(Buffer);
1772 StrBuf << "Insertelement index " << *Index << " not i32. Found: "
1773 << Index->getType();
1774 Error(StrBuf.str());
1775 }
1776 // TODO(kschimpf): Restrict index to a legal constant index (once
1777 // constants can be defined).
1778 CurrentNode->appendInst(Ice::InstInsertElement::create( 1835 CurrentNode->appendInst(Ice::InstInsertElement::create(
1779 Func, getNextInstVar(VecType), Vec, Elt, Index)); 1836 Func, getNextInstVar(VecType), Vec, Elt, Index));
1780 break; 1837 return;
1781 } 1838 }
1782 case naclbitc::FUNC_CODE_INST_CMP2: { 1839 case naclbitc::FUNC_CODE_INST_CMP2: {
1783 // CMP2: [opval, opval, pred] 1840 // CMP2: [opval, opval, pred]
1784 if (!isValidRecordSize(3, "function block compare")) 1841 if (!isValidRecordSize(3, "function block compare"))
1785 return; 1842 return;
1786 Ice::Operand *Op1 = getRelativeOperand(Values[0], BaseIndex); 1843 Ice::Operand *Op1 = getRelativeOperand(Values[0], BaseIndex);
1787 Ice::Operand *Op2 = getRelativeOperand(Values[1], BaseIndex); 1844 Ice::Operand *Op2 = getRelativeOperand(Values[1], BaseIndex);
1788 Ice::Type Op1Type = Op1->getType(); 1845 Ice::Type Op1Type = Op1->getType();
1789 Ice::Type Op2Type = Op2->getType(); 1846 Ice::Type Op2Type = Op2->getType();
1847 Ice::Type DestType = getCompareResultType(Op1Type);
1790 if (Op1Type != Op2Type) { 1848 if (Op1Type != Op2Type) {
1791 std::string Buffer; 1849 std::string Buffer;
1792 raw_string_ostream StrBuf(Buffer); 1850 raw_string_ostream StrBuf(Buffer);
1793 StrBuf << "Compare argument types differ: " << Op1Type 1851 StrBuf << "Compare argument types differ: " << Op1Type
1794 << " and " << Op2Type; 1852 << " and " << Op2Type;
1795 Error(StrBuf.str()); 1853 Error(StrBuf.str());
1796 // TODO(kschimpf) Remove error recovery once implementation complete. 1854 appendErrorInstruction(DestType);
1797 Op2 = Op1; 1855 Op2 = Op1;
1798 } 1856 }
1799 Ice::Type DestType = getCompareResultType(Op1Type);
1800 if (DestType == Ice::IceType_void) { 1857 if (DestType == Ice::IceType_void) {
1801 std::string Buffer; 1858 std::string Buffer;
1802 raw_string_ostream StrBuf(Buffer); 1859 raw_string_ostream StrBuf(Buffer);
1803 StrBuf << "Compare not defined for type " << Op1Type; 1860 StrBuf << "Compare not defined for type " << Op1Type;
1804 Error(StrBuf.str()); 1861 Error(StrBuf.str());
1805 return; 1862 return;
1806 } 1863 }
1807 Ice::Variable *Dest = getNextInstVar(DestType); 1864 Ice::Variable *Dest = getNextInstVar(DestType);
1808 if (isIntegerType(Op1Type)) { 1865 if (isIntegerType(Op1Type)) {
1809 Ice::InstIcmp::ICond Cond; 1866 Ice::InstIcmp::ICond Cond;
1810 if (!convertNaClBitcICmpOpToIce(Values[2], Cond)) { 1867 if (!convertNaClBitcICmpOpToIce(Values[2], Cond)) {
1811 std::string Buffer; 1868 std::string Buffer;
1812 raw_string_ostream StrBuf(Buffer); 1869 raw_string_ostream StrBuf(Buffer);
1813 StrBuf << "Compare record contains unknown integer predicate index: " 1870 StrBuf << "Compare record contains unknown integer predicate index: "
1814 << Values[2]; 1871 << Values[2];
1815 Error(StrBuf.str()); 1872 Error(StrBuf.str());
1816 // TODO(kschimpf) Remove error recovery once implementation complete. 1873 appendErrorInstruction(DestType);
1817 Cond = Ice::InstIcmp::Eq;
1818 } 1874 }
1819 CurrentNode->appendInst( 1875 CurrentNode->appendInst(
1820 Ice::InstIcmp::create(Func, Cond, Dest, Op1, Op2)); 1876 Ice::InstIcmp::create(Func, Cond, Dest, Op1, Op2));
1821 } else if (isFloatingType(Op1Type)){ 1877 } else if (isFloatingType(Op1Type)){
1822 Ice::InstFcmp::FCond Cond; 1878 Ice::InstFcmp::FCond Cond;
1823 if (!convertNaClBitcFCompOpToIce(Values[2], Cond)) { 1879 if (!convertNaClBitcFCompOpToIce(Values[2], Cond)) {
1824 std::string Buffer; 1880 std::string Buffer;
1825 raw_string_ostream StrBuf(Buffer); 1881 raw_string_ostream StrBuf(Buffer);
1826 StrBuf << "Compare record contains unknown float predicate index: " 1882 StrBuf << "Compare record contains unknown float predicate index: "
1827 << Values[2]; 1883 << Values[2];
1828 Error(StrBuf.str()); 1884 Error(StrBuf.str());
1829 // TODO(kschimpf) Remove error recovery once implementation complete. 1885 appendErrorInstruction(DestType);
1830 Cond = Ice::InstFcmp::False;
1831 } 1886 }
1832 CurrentNode->appendInst( 1887 CurrentNode->appendInst(
1833 Ice::InstFcmp::create(Func, Cond, Dest, Op1, Op2)); 1888 Ice::InstFcmp::create(Func, Cond, Dest, Op1, Op2));
1834 } else { 1889 } else {
1835 // Not sure this can happen, but be safe. 1890 // Not sure this can happen, but be safe.
1836 std::string Buffer; 1891 std::string Buffer;
1837 raw_string_ostream StrBuf(Buffer); 1892 raw_string_ostream StrBuf(Buffer);
1838 StrBuf << "Compare on type not understood: " << Op1Type; 1893 StrBuf << "Compare on type not understood: " << Op1Type;
1839 Error(StrBuf.str()); 1894 Error(StrBuf.str());
1895 appendErrorInstruction(DestType);
1840 return; 1896 return;
1841 } 1897 }
1842 break; 1898 return;
1843 } 1899 }
1844 case naclbitc::FUNC_CODE_INST_RET: { 1900 case naclbitc::FUNC_CODE_INST_RET: {
1845 // RET: [opval?] 1901 // RET: [opval?]
1846 if (!isValidRecordSizeInRange(0, 1, "function block ret")) 1902 if (!isValidRecordSizeInRange(0, 1, "function block ret"))
1847 return; 1903 return;
1848 if (Values.size() == 0) { 1904 if (Values.size() == 0) {
1849 CurrentNode->appendInst(Ice::InstRet::create(Func)); 1905 CurrentNode->appendInst(Ice::InstRet::create(Func));
1850 } else { 1906 } else {
1851 CurrentNode->appendInst( 1907 CurrentNode->appendInst(
1852 Ice::InstRet::create(Func, getRelativeOperand(Values[0], BaseIndex))); 1908 Ice::InstRet::create(Func, getRelativeOperand(Values[0], BaseIndex)));
1853 } 1909 }
1854 InstIsTerminating = true; 1910 InstIsTerminating = true;
1855 break; 1911 return;
1856 } 1912 }
1857 case naclbitc::FUNC_CODE_INST_BR: { 1913 case naclbitc::FUNC_CODE_INST_BR: {
1858 if (Values.size() == 1) { 1914 if (Values.size() == 1) {
1859 // BR: [bb#] 1915 // BR: [bb#]
1860 Ice::CfgNode *Block = getBranchBasicBlock(Values[0]); 1916 Ice::CfgNode *Block = getBranchBasicBlock(Values[0]);
1861 if (Block == nullptr) 1917 if (Block == nullptr)
1862 return; 1918 return;
1863 CurrentNode->appendInst(Ice::InstBr::create(Func, Block)); 1919 CurrentNode->appendInst(Ice::InstBr::create(Func, Block));
1864 } else { 1920 } else {
1865 // BR: [bb#, bb#, opval] 1921 // BR: [bb#, bb#, opval]
1866 if (!isValidRecordSize(3, "function block branch")) 1922 if (!isValidRecordSize(3, "function block branch"))
1867 return; 1923 return;
1868 Ice::Operand *Cond = getRelativeOperand(Values[2], BaseIndex); 1924 Ice::Operand *Cond = getRelativeOperand(Values[2], BaseIndex);
1869 if (Cond->getType() != Ice::IceType_i1) { 1925 if (Cond->getType() != Ice::IceType_i1) {
1870 std::string Buffer; 1926 std::string Buffer;
1871 raw_string_ostream StrBuf(Buffer); 1927 raw_string_ostream StrBuf(Buffer);
1872 StrBuf << "Branch condition " << *Cond << " not i1. Found: " 1928 StrBuf << "Branch condition " << *Cond << " not i1. Found: "
1873 << Cond->getType(); 1929 << Cond->getType();
1874 Error(StrBuf.str()); 1930 Error(StrBuf.str());
1875 return; 1931 return;
1876 } 1932 }
1877 Ice::CfgNode *ThenBlock = getBranchBasicBlock(Values[0]); 1933 Ice::CfgNode *ThenBlock = getBranchBasicBlock(Values[0]);
1878 Ice::CfgNode *ElseBlock = getBranchBasicBlock(Values[1]); 1934 Ice::CfgNode *ElseBlock = getBranchBasicBlock(Values[1]);
1879 if (ThenBlock == nullptr || ElseBlock == nullptr) 1935 if (ThenBlock == nullptr || ElseBlock == nullptr)
1880 return; 1936 return;
1881 CurrentNode->appendInst( 1937 CurrentNode->appendInst(
1882 Ice::InstBr::create(Func, Cond, ThenBlock, ElseBlock)); 1938 Ice::InstBr::create(Func, Cond, ThenBlock, ElseBlock));
1883 } 1939 }
1884 InstIsTerminating = true; 1940 InstIsTerminating = true;
1885 break; 1941 return;
1886 } 1942 }
1887 case naclbitc::FUNC_CODE_INST_SWITCH: { 1943 case naclbitc::FUNC_CODE_INST_SWITCH: {
1888 // SWITCH: [Condty, Cond, BbIndex, NumCases Case ...] 1944 // SWITCH: [Condty, Cond, BbIndex, NumCases Case ...]
1889 // where Case = [1, 1, Value, BbIndex]. 1945 // where Case = [1, 1, Value, BbIndex].
1890 // 1946 //
1891 // Note: Unlike most instructions, we don't infer the type of 1947 // Note: Unlike most instructions, we don't infer the type of
1892 // Cond, but provide it as a separate field. There are also 1948 // Cond, but provide it as a separate field. There are also
1893 // unnecesary data fields (i.e. constants 1). These were not 1949 // unnecesary data fields (i.e. constants 1). These were not
1894 // cleaned up in PNaCl bitcode because the bitcode format was 1950 // cleaned up in PNaCl bitcode because the bitcode format was
1895 // already frozen when the problem was noticed. 1951 // already frozen when the problem was noticed.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1933 return; 1989 return;
1934 } 1990 }
1935 APInt Value(BitWidth, 1991 APInt Value(BitWidth,
1936 NaClDecodeSignRotatedValue(Values[ValCaseIndex + 2]), 1992 NaClDecodeSignRotatedValue(Values[ValCaseIndex + 2]),
1937 true); 1993 true);
1938 Ice::CfgNode *Label = getBranchBasicBlock(Values[ValCaseIndex + 3]); 1994 Ice::CfgNode *Label = getBranchBasicBlock(Values[ValCaseIndex + 3]);
1939 Switch->addBranch(CaseIndex, Value.getSExtValue(), Label); 1995 Switch->addBranch(CaseIndex, Value.getSExtValue(), Label);
1940 } 1996 }
1941 CurrentNode->appendInst(Switch); 1997 CurrentNode->appendInst(Switch);
1942 InstIsTerminating = true; 1998 InstIsTerminating = true;
1943 break; 1999 return;
1944 } 2000 }
1945 case naclbitc::FUNC_CODE_INST_UNREACHABLE: { 2001 case naclbitc::FUNC_CODE_INST_UNREACHABLE: {
1946 // UNREACHABLE: [] 2002 // UNREACHABLE: []
1947 if (!isValidRecordSize(0, "function block unreachable")) 2003 if (!isValidRecordSize(0, "function block unreachable"))
1948 return; 2004 return;
1949 CurrentNode->appendInst( 2005 CurrentNode->appendInst(
1950 Ice::InstUnreachable::create(Func)); 2006 Ice::InstUnreachable::create(Func));
1951 InstIsTerminating = true; 2007 InstIsTerminating = true;
1952 break; 2008 return;
1953 } 2009 }
1954 case naclbitc::FUNC_CODE_INST_PHI: { 2010 case naclbitc::FUNC_CODE_INST_PHI: {
1955 // PHI: [ty, val1, bb1, ..., valN, bbN] for n >= 2. 2011 // PHI: [ty, val1, bb1, ..., valN, bbN] for n >= 2.
1956 if (!isValidRecordSizeAtLeast(3, "function block phi")) 2012 if (!isValidRecordSizeAtLeast(3, "function block phi"))
1957 return; 2013 return;
2014 Ice::Type Ty = Context->getSimpleTypeByID(Values[0]);
1958 if ((Values.size() & 0x1) == 0) { 2015 if ((Values.size() & 0x1) == 0) {
1959 // Not an odd number of values. 2016 // Not an odd number of values.
1960 std::string Buffer; 2017 std::string Buffer;
1961 raw_string_ostream StrBuf(Buffer); 2018 raw_string_ostream StrBuf(Buffer);
1962 StrBuf << "function block phi record size not valid: " << Values.size(); 2019 StrBuf << "function block phi record size not valid: " << Values.size();
1963 Error(StrBuf.str()); 2020 Error(StrBuf.str());
2021 appendErrorInstruction(Ty);
1964 return; 2022 return;
1965 } 2023 }
1966 Ice::Type Ty = Context->getSimpleTypeByID(Values[0]);
1967 if (Ty == Ice::IceType_void) { 2024 if (Ty == Ice::IceType_void) {
1968 Error("Phi record using type void not allowed"); 2025 Error("Phi record using type void not allowed");
1969 return; 2026 return;
1970 } 2027 }
1971 Ice::Variable *Dest = getNextInstVar(Ty); 2028 Ice::Variable *Dest = getNextInstVar(Ty);
1972 Ice::InstPhi *Phi = Ice::InstPhi::create(Func, Values.size() >> 1, Dest); 2029 Ice::InstPhi *Phi = Ice::InstPhi::create(Func, Values.size() >> 1, Dest);
1973 for (unsigned i = 1; i < Values.size(); i += 2) { 2030 for (unsigned i = 1; i < Values.size(); i += 2) {
1974 Ice::Operand *Op = 2031 Ice::Operand *Op =
1975 getRelativeOperand(NaClDecodeSignRotatedValue(Values[i]), BaseIndex); 2032 getRelativeOperand(NaClDecodeSignRotatedValue(Values[i]), BaseIndex);
1976 if (Op->getType() != Ty) { 2033 if (Op->getType() != Ty) {
1977 std::string Buffer; 2034 std::string Buffer;
1978 raw_string_ostream StrBuf(Buffer); 2035 raw_string_ostream StrBuf(Buffer);
1979 StrBuf << "Value " << *Op << " not type " << Ty 2036 StrBuf << "Value " << *Op << " not type " << Ty
1980 << " in phi instruction. Found: " << Op->getType(); 2037 << " in phi instruction. Found: " << Op->getType();
1981 Error(StrBuf.str()); 2038 Error(StrBuf.str());
2039 appendErrorInstruction(Ty);
1982 return; 2040 return;
1983 } 2041 }
1984 Phi->addArgument(Op, getBasicBlock(Values[i + 1])); 2042 Phi->addArgument(Op, getBasicBlock(Values[i + 1]));
1985 } 2043 }
1986 CurrentNode->appendInst(Phi); 2044 CurrentNode->appendInst(Phi);
1987 break; 2045 return;
1988 } 2046 }
1989 case naclbitc::FUNC_CODE_INST_ALLOCA: { 2047 case naclbitc::FUNC_CODE_INST_ALLOCA: {
1990 // ALLOCA: [Size, align] 2048 // ALLOCA: [Size, align]
1991 if (!isValidRecordSize(2, "function block alloca")) 2049 if (!isValidRecordSize(2, "function block alloca"))
1992 return; 2050 return;
1993 Ice::Operand *ByteCount = getRelativeOperand(Values[0], BaseIndex); 2051 Ice::Operand *ByteCount = getRelativeOperand(Values[0], BaseIndex);
2052 Ice::Type PtrTy = Context->getIcePointerType();
1994 if (ByteCount->getType() != Ice::IceType_i32) { 2053 if (ByteCount->getType() != Ice::IceType_i32) {
1995 std::string Buffer; 2054 std::string Buffer;
1996 raw_string_ostream StrBuf(Buffer); 2055 raw_string_ostream StrBuf(Buffer);
1997 StrBuf << "Alloca on non-i32 value. Found: " << *ByteCount; 2056 StrBuf << "Alloca on non-i32 value. Found: " << *ByteCount;
1998 Error(StrBuf.str()); 2057 Error(StrBuf.str());
2058 appendErrorInstruction(PtrTy);
1999 return; 2059 return;
2000 } 2060 }
2001 unsigned Alignment; 2061 unsigned Alignment;
2002 extractAlignment("Alloca", Values[1], Alignment); 2062 extractAlignment("Alloca", Values[1], Alignment);
2003 CurrentNode->appendInst( 2063 CurrentNode->appendInst(Ice::InstAlloca::create(Func, ByteCount, Alignment,
2004 Ice::InstAlloca::create(Func, ByteCount, Alignment, 2064 getNextInstVar(PtrTy)));
2005 getNextInstVar(Context->getIcePointerType()))); 2065 return;
2006 break;
2007 } 2066 }
2008 case naclbitc::FUNC_CODE_INST_LOAD: { 2067 case naclbitc::FUNC_CODE_INST_LOAD: {
2009 // LOAD: [address, align, ty] 2068 // LOAD: [address, align, ty]
2010 if (!isValidRecordSize(3, "function block load")) 2069 if (!isValidRecordSize(3, "function block load"))
2011 return; 2070 return;
2012 Ice::Operand *Address = getRelativeOperand(Values[0], BaseIndex); 2071 Ice::Operand *Address = getRelativeOperand(Values[0], BaseIndex);
2013 if (!isValidPointerType(Address, "Load")) 2072 Ice::Type Ty = Context->getSimpleTypeByID(Values[2]);
2073 if (!isValidPointerType(Address, "Load")) {
2074 appendErrorInstruction(Ty);
2014 return; 2075 return;
2076 }
2015 unsigned Alignment; 2077 unsigned Alignment;
2016 extractAlignment("Load", Values[1], Alignment); 2078 extractAlignment("Load", Values[1], Alignment);
2017 Ice::Type Ty = Context->getSimpleTypeByID(Values[2]); 2079 if (!isValidLoadStoreAlignment(Alignment, Ty, "Load")) {
2018 if (!isValidLoadStoreAlignment(Alignment, Ty, "Load")) 2080 appendErrorInstruction(Ty);
2019 return; 2081 return;
2082 }
2020 CurrentNode->appendInst( 2083 CurrentNode->appendInst(
2021 Ice::InstLoad::create(Func, getNextInstVar(Ty), Address, Alignment)); 2084 Ice::InstLoad::create(Func, getNextInstVar(Ty), Address, Alignment));
2022 break; 2085 return;
2023 } 2086 }
2024 case naclbitc::FUNC_CODE_INST_STORE: { 2087 case naclbitc::FUNC_CODE_INST_STORE: {
2025 // STORE: [address, value, align] 2088 // STORE: [address, value, align]
2026 if (!isValidRecordSize(3, "function block store")) 2089 if (!isValidRecordSize(3, "function block store"))
2027 return; 2090 return;
2028 Ice::Operand *Address = getRelativeOperand(Values[0], BaseIndex); 2091 Ice::Operand *Address = getRelativeOperand(Values[0], BaseIndex);
2029 if (!isValidPointerType(Address, "Store")) 2092 if (!isValidPointerType(Address, "Store"))
2030 return; 2093 return;
2031 Ice::Operand *Value = getRelativeOperand(Values[1], BaseIndex); 2094 Ice::Operand *Value = getRelativeOperand(Values[1], BaseIndex);
2032 unsigned Alignment; 2095 unsigned Alignment;
2033 extractAlignment("Store", Values[2], Alignment); 2096 extractAlignment("Store", Values[2], Alignment);
2034 if (!isValidLoadStoreAlignment(Alignment, Value->getType(), "Store")) 2097 if (!isValidLoadStoreAlignment(Alignment, Value->getType(), "Store"))
2035 return; 2098 return;
2036 CurrentNode->appendInst( 2099 CurrentNode->appendInst(
2037 Ice::InstStore::create(Func, Value, Address, Alignment)); 2100 Ice::InstStore::create(Func, Value, Address, Alignment));
2038 break; 2101 return;
2039 } 2102 }
2040 case naclbitc::FUNC_CODE_INST_CALL: 2103 case naclbitc::FUNC_CODE_INST_CALL:
2041 case naclbitc::FUNC_CODE_INST_CALL_INDIRECT: { 2104 case naclbitc::FUNC_CODE_INST_CALL_INDIRECT: {
2042 // CALL: [cc, fnid, arg0, arg1...] 2105 // CALL: [cc, fnid, arg0, arg1...]
2043 // CALL_INDIRECT: [cc, fn, returnty, args...] 2106 // CALL_INDIRECT: [cc, fn, returnty, args...]
2044 // 2107 //
2045 // Note: The difference between CALL and CALL_INDIRECT is that 2108 // Note: The difference between CALL and CALL_INDIRECT is that
2046 // CALL has a reference to an explicit function declaration, while 2109 // CALL has a reference to an explicit function declaration, while
2047 // the CALL_INDIRECT is just an address. For CALL, we can infer 2110 // the CALL_INDIRECT is just an address. For CALL, we can infer
2048 // the return type by looking up the type signature associated 2111 // the return type by looking up the type signature associated
2049 // with the function declaration. For CALL_INDIRECT we can only 2112 // with the function declaration. For CALL_INDIRECT we can only
2050 // infer the type signature via argument types, and the 2113 // infer the type signature via argument types, and the
2051 // corresponding return type stored in CALL_INDIRECT record. 2114 // corresponding return type stored in CALL_INDIRECT record.
2052 Ice::SizeT ParamsStartIndex = 2; 2115 Ice::SizeT ParamsStartIndex = 2;
2053 if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) { 2116 if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) {
2054 if (!isValidRecordSizeAtLeast(2, "function block call")) 2117 if (!isValidRecordSizeAtLeast(2, "function block call"))
2055 return; 2118 return;
2056 } else { 2119 } else {
2057 if (!isValidRecordSizeAtLeast(3, "function block call indirect")) 2120 if (!isValidRecordSizeAtLeast(3, "function block call indirect"))
2058 return; 2121 return;
2059 ParamsStartIndex = 3; 2122 ParamsStartIndex = 3;
2060 } 2123 }
2061 2124
2062 // Extract call information.
2063 uint64_t CCInfo = Values[0];
2064 CallingConv::ID CallingConv;
2065 if (!naclbitc::DecodeCallingConv(CCInfo >> 1, CallingConv)) {
2066 std::string Buffer;
2067 raw_string_ostream StrBuf(Buffer);
2068 StrBuf << "Function call calling convention value " << (CCInfo >> 1)
2069 << " not understood.";
2070 Error(StrBuf.str());
2071 return;
2072 }
2073 bool IsTailCall = static_cast<bool>(CCInfo & 1);
2074
2075 // Extract out the called function and its return type. 2125 // Extract out the called function and its return type.
2076 uint32_t CalleeIndex = convertRelativeToAbsIndex(Values[1], BaseIndex); 2126 uint32_t CalleeIndex = convertRelativeToAbsIndex(Values[1], BaseIndex);
2077 Ice::Operand *Callee = getOperand(CalleeIndex); 2127 Ice::Operand *Callee = getOperand(CalleeIndex);
2078 Ice::Type ReturnType = Ice::IceType_void; 2128 Ice::Type ReturnType = Ice::IceType_void;
2079 const Ice::Intrinsics::FullIntrinsicInfo *IntrinsicInfo = nullptr; 2129 const Ice::Intrinsics::FullIntrinsicInfo *IntrinsicInfo = nullptr;
2080 if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) { 2130 if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) {
2081 Ice::FunctionDeclaration *Fcn = Context->getFunctionByID(CalleeIndex); 2131 Ice::FunctionDeclaration *Fcn = Context->getFunctionByID(CalleeIndex);
2082 const Ice::FuncSigType &Signature = Fcn->getSignature(); 2132 const Ice::FuncSigType &Signature = Fcn->getSignature();
2083 ReturnType = Signature.getReturnType(); 2133 ReturnType = Signature.getReturnType();
2084 2134
2085 // Check if this direct call is to an Intrinsic (starts with "llvm.") 2135 // Check if this direct call is to an Intrinsic (starts with "llvm.")
2086 static Ice::IceString LLVMPrefix("llvm."); 2136 static Ice::IceString LLVMPrefix("llvm.");
2087 Ice::IceString Name = Fcn->getName(); 2137 Ice::IceString Name = Fcn->getName();
2088 if (isStringPrefix(Name, LLVMPrefix)) { 2138 if (isStringPrefix(Name, LLVMPrefix)) {
2089 Ice::IceString Suffix = Name.substr(LLVMPrefix.size()); 2139 Ice::IceString Suffix = Name.substr(LLVMPrefix.size());
2090 IntrinsicInfo = 2140 IntrinsicInfo =
2091 getTranslator().getContext()->getIntrinsicsInfo().find(Suffix); 2141 getTranslator().getContext()->getIntrinsicsInfo().find(Suffix);
2092 if (!IntrinsicInfo) { 2142 if (!IntrinsicInfo) {
2093 std::string Buffer; 2143 std::string Buffer;
2094 raw_string_ostream StrBuf(Buffer); 2144 raw_string_ostream StrBuf(Buffer);
2095 StrBuf << "Invalid PNaCl intrinsic call to " << Name; 2145 StrBuf << "Invalid PNaCl intrinsic call to " << Name;
2096 Error(StrBuf.str()); 2146 Error(StrBuf.str());
2147 appendErrorInstruction(ReturnType);
2097 return; 2148 return;
2098 } 2149 }
2099 } 2150 }
2100 } else { 2151 } else {
2101 ReturnType = Context->getSimpleTypeByID(Values[2]); 2152 ReturnType = Context->getSimpleTypeByID(Values[2]);
2102 } 2153 }
2103 2154
2155 // Extract call information.
2156 uint64_t CCInfo = Values[0];
2157 CallingConv::ID CallingConv;
2158 if (!naclbitc::DecodeCallingConv(CCInfo >> 1, CallingConv)) {
2159 std::string Buffer;
2160 raw_string_ostream StrBuf(Buffer);
2161 StrBuf << "Function call calling convention value " << (CCInfo >> 1)
2162 << " not understood.";
2163 Error(StrBuf.str());
2164 appendErrorInstruction(ReturnType);
2165 return;
2166 }
2167 bool IsTailCall = static_cast<bool>(CCInfo & 1);
2168
2104 // Create the call instruction. 2169 // Create the call instruction.
2105 Ice::Variable *Dest = (ReturnType == Ice::IceType_void) 2170 Ice::Variable *Dest = (ReturnType == Ice::IceType_void)
2106 ? nullptr 2171 ? nullptr
2107 : getNextInstVar(ReturnType); 2172 : getNextInstVar(ReturnType);
2108 Ice::SizeT NumParams = Values.size() - ParamsStartIndex; 2173 Ice::SizeT NumParams = Values.size() - ParamsStartIndex;
2109 Ice::InstCall *Inst = nullptr; 2174 Ice::InstCall *Inst = nullptr;
2110 if (IntrinsicInfo) { 2175 if (IntrinsicInfo) {
2111 Inst = 2176 Inst =
2112 Ice::InstIntrinsicCall::create(Func, NumParams, Dest, Callee, 2177 Ice::InstIntrinsicCall::create(Func, NumParams, Dest, Callee,
2113 IntrinsicInfo->Info); 2178 IntrinsicInfo->Info);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2164 } 2229 }
2165 2230
2166 CurrentNode->appendInst(Inst); 2231 CurrentNode->appendInst(Inst);
2167 return; 2232 return;
2168 } 2233 }
2169 case naclbitc::FUNC_CODE_INST_FORWARDTYPEREF: { 2234 case naclbitc::FUNC_CODE_INST_FORWARDTYPEREF: {
2170 // FORWARDTYPEREF: [opval, ty] 2235 // FORWARDTYPEREF: [opval, ty]
2171 if (!isValidRecordSize(2, "function block forward type ref")) 2236 if (!isValidRecordSize(2, "function block forward type ref"))
2172 return; 2237 return;
2173 setOperand(Values[0], createInstVar(Context->getSimpleTypeByID(Values[1]))); 2238 setOperand(Values[0], createInstVar(Context->getSimpleTypeByID(Values[1])));
2174 break; 2239 return;
2175 } 2240 }
2176 default: 2241 default:
2177 // Generate error message! 2242 // Generate error message!
2178 BlockParserBaseClass::ProcessRecord(); 2243 BlockParserBaseClass::ProcessRecord();
2179 break; 2244 return;
2180 } 2245 }
2181 } 2246 }
2182 2247
2183 /// Parses constants within a function block. 2248 /// Parses constants within a function block.
2184 class ConstantsParser : public BlockParserBaseClass { 2249 class ConstantsParser : public BlockParserBaseClass {
2185 ConstantsParser(const ConstantsParser &) = delete; 2250 ConstantsParser(const ConstantsParser &) = delete;
2186 ConstantsParser &operator=(const ConstantsParser &) = delete; 2251 ConstantsParser &operator=(const ConstantsParser &) = delete;
2187 2252
2188 public: 2253 public:
2189 ConstantsParser(unsigned BlockID, FunctionParser *FuncParser) 2254 ConstantsParser(unsigned BlockID, FunctionParser *FuncParser)
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
2599 2664
2600 if (TopLevelBlocks != 1) { 2665 if (TopLevelBlocks != 1) {
2601 errs() << IRFilename 2666 errs() << IRFilename
2602 << ": Contains more than one module. Found: " << TopLevelBlocks 2667 << ": Contains more than one module. Found: " << TopLevelBlocks
2603 << "\n"; 2668 << "\n";
2604 ErrorStatus = true; 2669 ErrorStatus = true;
2605 } 2670 }
2606 } 2671 }
2607 2672
2608 } // end of namespace Ice 2673 } // end of namespace Ice
OLDNEW
« no previous file with comments | « no previous file | tests_lit/reader_tests/insertextract.ll » ('j') | tests_lit/reader_tests/insertextract-err.ll » ('J')

Powered by Google App Engine
This is Rietveld 408576698