From 5023f151a7501d68d7c0f2bf94f0fb6badb93ae8 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Fri, 17 Apr 2015 06:40:14 +0000 Subject: [PATCH] [opaque pointer type] Explicit pointee type for call instruction Use an extra bit in the CCInfo to flag the newer version of the instructiont hat includes the type explicitly. Tested the newer error cases I added, but didn't add tests for the finer granularity improvements to existing error paths. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235160 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Bitcode/Reader/BitcodeReader.cpp | 31 +++++++++++++----- lib/Bitcode/Writer/BitcodeWriter.cpp | 6 ++-- .../invalid-call-mismatched-explicit-type.bc | Bin 0 -> 1316 bytes ...invalid-call-non-function-explicit-type.bc | Bin 0 -> 1316 bytes test/Bitcode/invalid.test | 6 ++++ 5 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 test/Bitcode/Inputs/invalid-call-mismatched-explicit-type.bc create mode 100644 test/Bitcode/Inputs/invalid-call-non-function-explicit-type.bc diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 5366f5fb4ea..e37e8f49b33 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -299,9 +299,9 @@ private: // have. ResVal = getFnValueByID(ValNo, nullptr); return ResVal == nullptr; - } else if (Slot == Record.size()) { - return true; } + if (Slot == Record.size()) + return true; unsigned TypeNo = (unsigned)Record[Slot++]; ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); @@ -4168,19 +4168,32 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) { if (Record.size() < 3) return Error("Invalid record"); - AttributeSet PAL = getAttributes(Record[0]); - unsigned CCInfo = Record[1]; + unsigned OpNum = 0; + AttributeSet PAL = getAttributes(Record[OpNum++]); + unsigned CCInfo = Record[OpNum++]; + + FunctionType *FTy = nullptr; + if (CCInfo >> 15 & 1 && + !(FTy = dyn_cast(getTypeByID(Record[OpNum++])))) + return Error("Explicit call type is not a function type"); - unsigned OpNum = 2; Value *Callee; if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) return Error("Invalid record"); PointerType *OpTy = dyn_cast(Callee->getType()); - FunctionType *FTy = nullptr; - if (OpTy) FTy = dyn_cast(OpTy->getElementType()); - if (!FTy || Record.size() < FTy->getNumParams()+OpNum) - return Error("Invalid record"); + if (!OpTy) + return Error("Callee is not a pointer type"); + FunctionType *PFTy = dyn_cast(OpTy->getElementType()); + if (!PFTy) + return Error("Callee is not of pointer to function type"); + if (!FTy) + FTy = PFTy; + if (PFTy != FTy) + return Error("Explicit call type does not match pointee type of " + "callee operand"); + if (Record.size() < FTy->getNumParams() + OpNum) + return Error("Insufficient operands to call"); SmallVector Args; // Read the fixed params. diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp index aa4a6a4c28a..bfcaac11257 100644 --- a/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -1935,14 +1935,14 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, break; case Instruction::Call: { const CallInst &CI = cast(I); - PointerType *PTy = cast(CI.getCalledValue()->getType()); - FunctionType *FTy = cast(PTy->getElementType()); + FunctionType *FTy = CI.getFunctionType(); Code = bitc::FUNC_CODE_INST_CALL; Vals.push_back(VE.getAttributeID(CI.getAttributes())); Vals.push_back((CI.getCallingConv() << 1) | unsigned(CI.isTailCall()) | - unsigned(CI.isMustTailCall()) << 14); + unsigned(CI.isMustTailCall()) << 14 | 1 << 15); + Vals.push_back(VE.getTypeID(FTy)); PushValueAndType(CI.getCalledValue(), InstID, Vals, VE); // Callee // Emit value #'s for the fixed parameters. diff --git a/test/Bitcode/Inputs/invalid-call-mismatched-explicit-type.bc b/test/Bitcode/Inputs/invalid-call-mismatched-explicit-type.bc new file mode 100644 index 0000000000000000000000000000000000000000..802d28edbf44565739ab7d1b30203c625bf86038 GIT binary patch literal 1316 zcmYjRO=ufO6rRn>nkBYI+gdGhy}Mo26awu*$W)QMa*?#Hu}KcjAy8q72w?GPWyawgE^P14$R#_UB2kfAjw_#tPV#m=-Ill`=hOEz<$Av&|NsQ zyV~>SA81TY^U9m1&=`?wNZK)lHILXZg<472HpOLKKvNt}&i;@sTOkO5#>o ztZCwgN2oCJle$=w#V2K<0bYz$D*&ieWxO;Vqcdl)7N^NEHp$^+-a=1}83_)j!?+|Y z>lRORNosn8wGq)GU$=nPbZILh)xyGFS*RT1Hay}hunZwC&Ec5bdAdcRd7 zwGwF}d9N%sfX{K@j+#ekGU7?>b7{!Hm@$*WQ{d~xi4=_&PB>_e9narZF2ld7!OBXg z$b{C_U{>v`sKKHhEU8L{4Wb55_Px$s#2>WCc#OQ@$+KZHj-1bP@>76VO{#`!k-r(ufw!unO=*tD&kI$gcER zCa-Mhhpij^pTft#No!;+Dtn#K!DH#4mocscVY-i)t zAEVQ8nl4d)04Eoz;~U6*m87B1kwh4$V|co1Z)h0GIw9i}q)NkS9w!QTNliu-c=l)~Qs=;qJoW~bQO6TeO9OvJqT z%hZ?b_1pL6@99HKWaRRLZ)gAa@BYxAyzS!V=6>y~N9!9;ns;sR5+F1KIq|{R%W1-D zT^MyS{c~y{vyzQ!*wSQvqN9PFM+NQeh)T<4@eflN^|l?F8Qm4Oe_ic|f>u)5={TN+ zTQErDah#5`mXc-KRe8(OUft{b&g*>If|`pc|;oZ&Rb#wRTS9}sKU}r z%aw@X*)e=}46X(~tI>E4?krBgYw)HGj!kOxYmQF1>13YH7Gxk%d9*u)3t5Gb@zIdP1kxX3?9 zvfRUNR?RrA4$99#p%*QrA)%Ls=#YXBl5LDJY7r&}R|I1ZU=UL zcHW!sz3+W95w*DGZbxW=#`K-G?)~ zD?M-jfyQJtkGyFL^--ycq#aXOb&GXVs1}87Q(V#oG{fO|j!q*kk)%Ekp5tiz9QA25 zF^Cg+I-RAyb2vUo%i;=0+fT@yD-V#5@6%#L+k+%UyzQQRtt zRZU!X3uQ)rRuikT_^c$t9vjEBaebnYD1Vl*+qCODkPS?I|LBhKMe2p5GV z-HH=kmKtthbyT#1uUSB=y0jIRsv%*oB$SVE>u&KiSOyW7;_#fGPUor5g_933`mk9f z)goyid9NhaA)b@OJF0G>!HB21FQkBh31cpaXTaBk<4GFJpT?kd?7087xD5TO2FlC9 z0ux+Q0~xiitOg2tpr|ToHh}6p+4neh5r5bulTq@LCkG>B5;-v7sl+N+I0$ z#0ZqZiwzdS0NS5tqoh_OuSN)}krx&FAx{oH4nS{K><2t~tr0DdW)+ANtpqEoKeOCt z1;1Q6YgKw1VH%TqzIE?{hiH1O*N4mcjjmWUR0o@rGy&tV{ z^4Ryb+wOa5=$@y|tn=OB>zTIn*f7ucptIhEqI_=kbhuviq3F(;8L< z25A-$G}m8T2yw^rkYq>i!Sn-mI6KhN`I+Ln(l(>8k3PQr(}npN_U_bgQ#uniZ~rp$ zC42Mk!y6CvAtpR})VG`qjqT`m@G;8@vPv%>gG~7<)NQSg8r) zPNsiB^{1CJ5e-|K%uTh|k>j|az3mZcsU-ek3ge#EBQvAB%=WLT{ZP)^Kc6W zX)K0QG1gMDOuNeOSlX+39N&5z&zn$F(#x-iTW(>~EiR2p-it6ecI_U;c#C^Z)<= literal 0 HcmV?d00001 diff --git a/test/Bitcode/invalid.test b/test/Bitcode/invalid.test index 9cab227ab19..5c6e280024c 100644 --- a/test/Bitcode/invalid.test +++ b/test/Bitcode/invalid.test @@ -18,6 +18,10 @@ RUN: not llvm-dis -disable-output %p/Inputs/invalid-load-mismatched-explicit-typ RUN: FileCheck --check-prefix=MISMATCHED-EXPLICIT-LOAD %s RUN: not llvm-dis -disable-output %p/Inputs/invalid-gep-operator-mismatched-explicit-type.bc 2>&1 | \ RUN: FileCheck --check-prefix=MISMATCHED-EXPLICIT-GEP-OPERATOR %s +RUN: not llvm-dis -disable-output %p/Inputs/invalid-call-mismatched-explicit-type.bc 2>&1 | \ +RUN: FileCheck --check-prefix=MISMATCHED-EXPLICIT-CALL %s +RUN: not llvm-dis -disable-output %p/Inputs/invalid-call-non-function-explicit-type.bc 2>&1 | \ +RUN: FileCheck --check-prefix=NON-FUNCTION-EXPLICIT-CALL %s INVALID-ENCODING: Invalid encoding BAD-ABBREV: Abbreviation starts with an Array or a Blob @@ -29,6 +33,8 @@ BAD-ALIGN: Invalid alignment value MISMATCHED-EXPLICIT-GEP: Explicit gep type does not match pointee type of pointer operand MISMATCHED-EXPLICIT-LOAD: Explicit load type does not match pointee type of pointer operand 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 RUN: not llvm-dis -disable-output %p/Inputs/invalid-extractval-array-idx.bc 2>&1 | \ RUN: FileCheck --check-prefix=EXTRACT-ARRAY %s -- 2.34.1