From 5ea1f7b7440b7050abb912ce360c7cabcd8c2881 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Fri, 24 Apr 2015 18:06:06 +0000 Subject: [PATCH] [opaque pointer type] bitcode: add explicit callee type to invoke instructions llvm-svn: 235735 --- llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 37 +++++++++++++-------- llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 8 ++--- .../invalid-invoke-mismatched-explicit-type.bc | Bin 0 -> 1728 bytes .../invalid-invoke-non-function-explicit-type.bc | Bin 0 -> 1728 bytes llvm/test/Bitcode/invalid.test | 6 ++++ 5 files changed, 33 insertions(+), 18 deletions(-) create mode 100644 llvm/test/Bitcode/Inputs/invalid-invoke-mismatched-explicit-type.bc create mode 100644 llvm/test/Bitcode/Inputs/invalid-invoke-non-function-explicit-type.bc diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 57cd1d4..5f7a5ea 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -3863,24 +3863,33 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) { // INVOKE: [attrs, cc, normBB, unwindBB, fnty, op0,op1,op2, ...] if (Record.size() < 4) return Error("Invalid record"); - AttributeSet PAL = getAttributes(Record[0]); - unsigned CCInfo = Record[1]; - BasicBlock *NormalBB = getBasicBlock(Record[2]); - BasicBlock *UnwindBB = getBasicBlock(Record[3]); + unsigned OpNum = 0; + AttributeSet PAL = getAttributes(Record[OpNum++]); + unsigned CCInfo = Record[OpNum++]; + BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]); + BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]); + + FunctionType *FTy = nullptr; + if (CCInfo >> 13 & 1 && + !(FTy = dyn_cast(getTypeByID(Record[OpNum++])))) + return Error("Explicit invoke type is not a function type"); - unsigned OpNum = 4; Value *Callee; if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) return Error("Invalid record"); PointerType *CalleeTy = dyn_cast(Callee->getType()); - FunctionType *FTy = !CalleeTy ? nullptr : - dyn_cast(CalleeTy->getElementType()); - - // Check that the right number of fixed parameters are here. - if (!FTy || !NormalBB || !UnwindBB || - Record.size() < OpNum+FTy->getNumParams()) - return Error("Invalid record"); + if (!CalleeTy) + return Error("Callee is not a pointer"); + if (!FTy) { + FTy = dyn_cast(CalleeTy->getElementType()); + if (!FTy) + return Error("Callee is not of pointer to function type"); + } else if (CalleeTy->getElementType() != FTy) + return Error("Explicit invoke type does not match pointee type of " + "callee operand"); + if (Record.size() < FTy->getNumParams() + OpNum) + return Error("Insufficient operands to call"); SmallVector Ops; for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { @@ -3905,8 +3914,8 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) { I = InvokeInst::Create(Callee, NormalBB, UnwindBB, Ops); InstructionList.push_back(I); - cast(I)->setCallingConv( - static_cast(CCInfo)); + cast(I) + ->setCallingConv(static_cast(~(1U << 13) & CCInfo)); cast(I)->setAttributes(PAL); break; } diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index c4b31ff..52a5d48 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -1790,15 +1790,15 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, case Instruction::Invoke: { const InvokeInst *II = cast(&I); - const Value *Callee(II->getCalledValue()); - PointerType *PTy = cast(Callee->getType()); - FunctionType *FTy = cast(PTy->getElementType()); + const Value *Callee = II->getCalledValue(); + FunctionType *FTy = II->getFunctionType(); Code = bitc::FUNC_CODE_INST_INVOKE; Vals.push_back(VE.getAttributeID(II->getAttributes())); - Vals.push_back(II->getCallingConv()); + Vals.push_back(II->getCallingConv() | 1 << 13); Vals.push_back(VE.getValueID(II->getNormalDest())); Vals.push_back(VE.getValueID(II->getUnwindDest())); + Vals.push_back(VE.getTypeID(FTy)); PushValueAndType(Callee, InstID, Vals, VE); // Emit value #'s for the fixed parameters. diff --git a/llvm/test/Bitcode/Inputs/invalid-invoke-mismatched-explicit-type.bc b/llvm/test/Bitcode/Inputs/invalid-invoke-mismatched-explicit-type.bc new file mode 100644 index 0000000000000000000000000000000000000000..bce885295082935ac604114b8591be932a5232f1 GIT binary patch literal 1728 zcmYjRacmP+7=PEh-5svIyRo8$wdFP#PMzW0meJByuDwD!8M=W82@twrNTXmnx^(MM zx$cTrW+ep{Qerf#nHpkDx=@oDF|=#dIjT03KL#NSWo&LbVR4uc1I~Awf?x8!_wKv* zzW4pU@Ao~2kQy&n1MoQlKyfzBbgU`k}Hy(mAJu_S}$VZoFX z%t^$0QP?<$+Il5x(r!)&8p^E_SPsNWXjxx*_V-JPTU$m2Jg=qWcf z$s=(9JkKkN^ zpoFqq#u9^PgXToW5<+bcV>ra($nJV3t0agPlkvJ9Wwo00SIL2xTrU!VD!I)iLtW1i zogUfC5-I&q&@dI(gCWCsT$8gKhvJ5jxaLN|Fq$?@$Mv`3nvtMkG;RPslJLjmBY^Da zlT&E$MSlpYiBLSM zUEbIeDGv2FGVV2?5@>q>_MTbQ6kEd&_aeQ5=Oj?S*5~=4Vp~aNszD=6=nikYPq09-a80+=X8#PSz0P>KN9 z|2$B)tz#FhP`SgUig8HzLV8>3rPrA~|PK(Wt)4m@+_{jEoR=()Bp z+k%Kae&#dZ9`w|?^8@jC17dGEaN+f%|FaD=TxGDGV`H<|_KpsZT%Y~~Tf8g)!>WP4 zYe`X`E$9zw5nEU=g)$KbB!4I2i?ykjo(S05wQ7eEvJ|rGAXl`wO)ATwwqd~*L2bFt zNV}IfN)iE=?DY~|Uewx#tEyjb~3Cl&v zl83JiYP~2~mDgiV>vt1JJ;Vl&d<1Gy_C^9tEW>_)nWI?ATONBGsjwFXMgpFYFte*|qaSgY)wC z=l<^2WejL(9^Q_bJp5iKX!HR# ztj^A-FB>K6$N>yfxe&Qt7%Tp+v|3Ot_n>$hu09ST|#m1 zGOFGXW#rW*%fDfsNU+-`t3vBdKm5zz78U>;o-f7HVS96k)ipY~R$f<5;z%5t7v&$8 CMorBC literal 0 HcmV?d00001 diff --git a/llvm/test/Bitcode/Inputs/invalid-invoke-non-function-explicit-type.bc b/llvm/test/Bitcode/Inputs/invalid-invoke-non-function-explicit-type.bc new file mode 100644 index 0000000000000000000000000000000000000000..d7810bb964bef455b6bdb664b9b907de4d95c28f GIT binary patch literal 1728 zcmYjReM}o=7=N#K?cJo@UDr;_XuB(Oii+6{2)nMWx%L<-juDtH&Ny9RW@&VovSOhS zmn-eOirvx;vUD*f)SzZDCS~>yjF|NUCt{}!?hi(mWgUYt#SQn75Ho^rK{ub|o_p`P z_kBKo&+mEdLh`Cn3BcC~07bnFkO2VH@WK6?Puj+@dIeo+I)wz4TjWHE0sFXB)a;bm zPZimR=t>PoXm>qPxhLd^Xc(a`^f@T0wBK-$k&|U(O}1u#I3Jkp!=9^CG;0Ak1AUf; z7;w7yOXI^8C?JTW$XS-Ums2b<)GSNhVyW4jVh&J$(&P;g6}WiDGJx_U8FRvK8W*^P zU`imCQDMgjY8?nz5;jv@*pWb;WIjpWYa&6OypvPhx<<~iRGX7r%qgIs`ywftf~Yww zm_X1xDwK{0+(^a(9VUg+guvy{9bk?o7hq^W-{Yw~Oa8H%&mF#y()~s9ZccH%iJEhg zvkcY7Qnv=-&T9yt6S(n=X#lk*Qe0B7f+Z36<`iBY2hG%NmdeBZtF^S{$UINYKQ8AI zEJ`TNX3SA|)^Cbu%t6%pD2Kz00@+tXj}-u-#6+yRudv!gc*`YURH_kiU%Axokf5$% z@h+F-X7Hpg?bpx6bRez28Y|A)4C$DDB367Yub)im=VQ7XvEm88eln&99s>79r6Yjo z?2>96cqc3QT&PEsYM`G%yaQy7x~Ue!1j1a&>!*|YbPBpH&LW2CL4De9$RVuccEZrO z7{$8@seRvSK3#Y>OleT+j7T-K)Xn0aa@^+%_#F5LGB(`|4#tyzA3LDMVI`fMbU+L7!o5rK?gAoGhZ~|S9f^v0)G(FWI)&&H zHtR@c2jusafH{GfhXUqH=u3%|X+*FdE)N`W1-!X}?tozBQ1f5_w%j73)(~n+25Q{6 zB^Ti0s5Oe3*8WD1aS_y_y$**NgGE9~(l{dH3o9reaz*so3IKM@CjtmmK}2IC2Gj_E z^Unii`!md{6)I;)T`;bRpu>p&zQ!}qwgEmH(S}H!OkHc%9xU>h(cu^RKiSpeLC>^* z+wMnfvHq_-Z=fg7oE?tE>JeMZ!EfH}`JZjL{xXg2otj#h-ak1$ab^AsY&Dnc0Xs>p>1nP;i@SZZdGTx=q%=&=I3ri}V@i{TLak$E&= z&cWLTwTuQVh1+9M<8|UaE_}O7Is&yQxg)E+Eibeey6qID18^d=u)T0j{S~(t$=lb+ z2T5`Pv@-x0U_FZD!>YHMjz^B}oqgSQekDAt0;Nyp<1=gfi?t7EGyZ@<=R^1Bv3bBwk0Yy z%xrbo8VF&jwrVPQ_t%?ma*eO`z$Uf8_%FivYHVjkq5p;17Nt@@SVWuZxHckBICDpjC5 zS-bQzs@xu-rA?~!KhRIbnccJH!L8iIfBD&1 | \ RUN: FileCheck --check-prefix=NON-FUNCTION-EXPLICIT-CALL %s +RUN: not llvm-dis -disable-output %p/Inputs/invalid-invoke-mismatched-explicit-type.bc 2>&1 | \ +RUN: FileCheck --check-prefix=MISMATCHED-EXPLICIT-INVOKE %s +RUN: not llvm-dis -disable-output %p/Inputs/invalid-invoke-non-function-explicit-type.bc 2>&1 | \ +RUN: FileCheck --check-prefix=NON-FUNCTION-EXPLICIT-INVOKE %s INVALID-ENCODING: Invalid encoding BAD-ABBREV: Abbreviation starts with an Array or a Blob @@ -35,6 +39,8 @@ MISMATCHED-EXPLICIT-LOAD: Explicit load type does not match pointee type of poin MISMATCHED-EXPLICIT-GEP-OPERATOR: Explicit gep operator type does not match pointee type of pointer operand MISMATCHED-EXPLICIT-CALL: Explicit call type does not match pointee type of callee operand NON-FUNCTION-EXPLICIT-CALL: Explicit call type is not a function type +MISMATCHED-EXPLICIT-INVOKE: Explicit invoke type does not match pointee type of callee operand +NON-FUNCTION-EXPLICIT-INVOKE: Explicit invoke type is not a function type RUN: not llvm-dis -disable-output %p/Inputs/invalid-extractval-array-idx.bc 2>&1 | \ RUN: FileCheck --check-prefix=EXTRACT-ARRAY %s -- 2.7.4