mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-09 05:31:37 +00:00
[opaque pointers] Avoid the use of pointee types when parsing inline asm in IR
When parsing calls to inline asm the pointee type (of the pointer type representing the value type of the InlineAsm value) was used. To avoid using it, use the ValID structure to ferry the FunctionType directly through to the InlineAsm construction. This is a bit of a workaround - alternatively the inline asm could explicitly describe the type but that'd be verbose/redundant in the IR and so long as the inline asm calls directly in the context of a call or invoke, this should suffice. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243349 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
477137f4d7
commit
4f7a4bc79f
@ -3980,13 +3980,12 @@ bool LLParser::ConvertValIDToValue(Type *Ty, ValID &ID, Value *&V,
|
||||
V = PFS->GetVal(ID.StrVal, Ty, ID.Loc);
|
||||
return V == nullptr;
|
||||
case ValID::t_InlineAsm: {
|
||||
PointerType *PTy = dyn_cast<PointerType>(Ty);
|
||||
FunctionType *FTy =
|
||||
PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : nullptr;
|
||||
if (!FTy || !InlineAsm::Verify(FTy, ID.StrVal2))
|
||||
assert(ID.FTy);
|
||||
if (!InlineAsm::Verify(ID.FTy, ID.StrVal2))
|
||||
return Error(ID.Loc, "invalid type for inline asm constraint string");
|
||||
V = InlineAsm::get(FTy, ID.StrVal, ID.StrVal2, ID.UIntVal&1,
|
||||
(ID.UIntVal>>1)&1, (InlineAsm::AsmDialect(ID.UIntVal>>2)));
|
||||
V = InlineAsm::get(ID.FTy, ID.StrVal, ID.StrVal2, ID.UIntVal & 1,
|
||||
(ID.UIntVal >> 1) & 1,
|
||||
(InlineAsm::AsmDialect(ID.UIntVal >> 2)));
|
||||
return false;
|
||||
}
|
||||
case ValID::t_GlobalName:
|
||||
@ -4864,6 +4863,8 @@ bool LLParser::ParseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
|
||||
Ty = FunctionType::get(RetType, ParamTypes, false);
|
||||
}
|
||||
|
||||
CalleeID.FTy = Ty;
|
||||
|
||||
// Look up the callee.
|
||||
Value *Callee;
|
||||
if (ConvertValIDToValue(PointerType::getUnqual(Ty), CalleeID, Callee, &PFS))
|
||||
@ -5277,6 +5278,8 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
|
||||
Ty = FunctionType::get(RetType, ParamTypes, false);
|
||||
}
|
||||
|
||||
CalleeID.FTy = Ty;
|
||||
|
||||
// Look up the callee.
|
||||
Value *Callee;
|
||||
if (ConvertValIDToValue(PointerType::getUnqual(Ty), CalleeID, Callee, &PFS))
|
||||
|
@ -52,13 +52,14 @@ namespace llvm {
|
||||
t_Null, t_Undef, t_Zero, // No value.
|
||||
t_EmptyArray, // No value: []
|
||||
t_Constant, // Value in ConstantVal.
|
||||
t_InlineAsm, // Value in StrVal/StrVal2/UIntVal.
|
||||
t_InlineAsm, // Value in FTy/StrVal/StrVal2/UIntVal.
|
||||
t_ConstantStruct, // Value in ConstantStructElts.
|
||||
t_PackedConstantStruct // Value in ConstantStructElts.
|
||||
} Kind;
|
||||
|
||||
LLLexer::LocTy Loc;
|
||||
unsigned UIntVal;
|
||||
FunctionType *FTy;
|
||||
std::string StrVal, StrVal2;
|
||||
APSInt APSIntVal;
|
||||
APFloat APFloatVal;
|
||||
|
Loading…
Reference in New Issue
Block a user