@@ -3923,6 +3923,25 @@ void BitcodeReader::propagateAttributeTypes(CallBase *CB,
3923
3923
}
3924
3924
}
3925
3925
3926
+ if (CB->isInlineAsm ()) {
3927
+ const InlineAsm *IA = cast<InlineAsm>(CB->getCalledOperand ());
3928
+ unsigned ArgNo = 0 ;
3929
+ for (const InlineAsm::ConstraintInfo &CI : IA->ParseConstraints ()) {
3930
+ bool HasArg = CI.Type == InlineAsm::isInput ||
3931
+ (CI.Type == InlineAsm::isOutput && CI.isIndirect );
3932
+ if (!HasArg)
3933
+ continue ;
3934
+
3935
+ if (CI.isIndirect && !CB->getAttributes ().getParamElementType (ArgNo)) {
3936
+ Type *ElemTy = ArgsTys[ArgNo]->getPointerElementType ();
3937
+ CB->addParamAttr (
3938
+ ArgNo, Attribute::get (Context, Attribute::ElementType, ElemTy));
3939
+ }
3940
+
3941
+ ArgNo++;
3942
+ }
3943
+ }
3944
+
3926
3945
switch (CB->getIntrinsicID ()) {
3927
3946
case Intrinsic::preserve_array_access_index:
3928
3947
case Intrinsic::preserve_struct_access_index:
@@ -4826,15 +4845,18 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
4826
4845
return error (" Insufficient operands to call" );
4827
4846
4828
4847
SmallVector<Value*, 16 > Args;
4848
+ SmallVector<Type *, 16 > ArgsTys;
4829
4849
// Read the fixed params.
4830
4850
for (unsigned i = 0 , e = FTy->getNumParams (); i != e; ++i, ++OpNum) {
4851
+ Value *Arg;
4831
4852
if (FTy->getParamType (i)->isLabelTy ())
4832
- Args. push_back ( getBasicBlock (Record[OpNum]) );
4853
+ Arg = getBasicBlock (Record[OpNum]);
4833
4854
else
4834
- Args.push_back (getValue (Record, OpNum, NextValueNo,
4835
- FTy->getParamType (i)));
4836
- if (!Args.back ())
4855
+ Arg = getValue (Record, OpNum, NextValueNo, FTy->getParamType (i));
4856
+ if (!Arg)
4837
4857
return error (" Invalid record" );
4858
+ Args.push_back (Arg);
4859
+ ArgsTys.push_back (Arg->getType ());
4838
4860
}
4839
4861
4840
4862
// Read type/value pairs for varargs params.
@@ -4847,6 +4869,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
4847
4869
if (getValueTypePair (Record, OpNum, NextValueNo, Op))
4848
4870
return error (" Invalid record" );
4849
4871
Args.push_back (Op);
4872
+ ArgsTys.push_back (Op->getType ());
4850
4873
}
4851
4874
}
4852
4875
@@ -4857,6 +4880,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
4857
4880
cast<CallBrInst>(I)->setCallingConv (
4858
4881
static_cast <CallingConv::ID>((0x7ff & CCInfo) >> bitc::CALL_CCONV));
4859
4882
cast<CallBrInst>(I)->setAttributes (PAL);
4883
+ propagateAttributeTypes (cast<CallBase>(I), ArgsTys);
4860
4884
break ;
4861
4885
}
4862
4886
case bitc::FUNC_CODE_INST_UNREACHABLE: // UNREACHABLE
0 commit comments