diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/AsmParser/LLParser.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/AsmParser/LLParser.cpp | 124 |
1 files changed, 92 insertions, 32 deletions
diff --git a/contrib/llvm-project/llvm/lib/AsmParser/LLParser.cpp b/contrib/llvm-project/llvm/lib/AsmParser/LLParser.cpp index 87dff6468f2d..1a17f633ae16 100644 --- a/contrib/llvm-project/llvm/lib/AsmParser/LLParser.cpp +++ b/contrib/llvm-project/llvm/lib/AsmParser/LLParser.cpp @@ -1122,7 +1122,7 @@ bool LLParser::ParseGlobal(const std::string &Name, LocTy NameLoc, if (ParseToken(lltok::StringConstant, "expected partition string")) return true; } else if (Lex.getKind() == lltok::kw_align) { - unsigned Alignment; + MaybeAlign Alignment; if (ParseOptionalAlignment(Alignment)) return true; GV->setAlignment(Alignment); } else if (Lex.getKind() == lltok::MetadataVar) { @@ -1229,12 +1229,13 @@ bool LLParser::ParseFnAttributeValuePairs(AttrBuilder &B, // As a hack, we allow function alignment to be initially parsed as an // attribute on a function declaration/definition or added to an attribute // group and later moved to the alignment field. - unsigned Alignment; + MaybeAlign Alignment; if (inAttrGrp) { Lex.Lex(); - if (ParseToken(lltok::equal, "expected '=' here") || - ParseUInt32(Alignment)) + uint32_t Value = 0; + if (ParseToken(lltok::equal, "expected '=' here") || ParseUInt32(Value)) return true; + Alignment = Align(Value); } else { if (ParseOptionalAlignment(Alignment)) return true; @@ -1603,7 +1604,7 @@ bool LLParser::ParseOptionalParamAttrs(AttrBuilder &B) { continue; } case lltok::kw_align: { - unsigned Alignment; + MaybeAlign Alignment; if (ParseOptionalAlignment(Alignment)) return true; B.addAlignmentAttr(Alignment); @@ -1635,6 +1636,7 @@ bool LLParser::ParseOptionalParamAttrs(AttrBuilder &B) { case lltok::kw_nest: B.addAttribute(Attribute::Nest); break; case lltok::kw_noalias: B.addAttribute(Attribute::NoAlias); break; case lltok::kw_nocapture: B.addAttribute(Attribute::NoCapture); break; + case lltok::kw_nofree: B.addAttribute(Attribute::NoFree); break; case lltok::kw_nonnull: B.addAttribute(Attribute::NonNull); break; case lltok::kw_readnone: B.addAttribute(Attribute::ReadNone); break; case lltok::kw_readonly: B.addAttribute(Attribute::ReadOnly); break; @@ -1720,7 +1722,7 @@ bool LLParser::ParseOptionalReturnAttrs(AttrBuilder &B) { continue; } case lltok::kw_align: { - unsigned Alignment; + MaybeAlign Alignment; if (ParseOptionalAlignment(Alignment)) return true; B.addAlignmentAttr(Alignment); @@ -1920,6 +1922,7 @@ void LLParser::ParseOptionalDLLStorageClass(unsigned &Res) { /// ::= 'fastcc' /// ::= 'intel_ocl_bicc' /// ::= 'coldcc' +/// ::= 'cfguard_checkcc' /// ::= 'x86_stdcallcc' /// ::= 'x86_fastcallcc' /// ::= 'x86_thiscallcc' @@ -1928,6 +1931,7 @@ void LLParser::ParseOptionalDLLStorageClass(unsigned &Res) { /// ::= 'arm_aapcscc' /// ::= 'arm_aapcs_vfpcc' /// ::= 'aarch64_vector_pcs' +/// ::= 'aarch64_sve_vector_pcs' /// ::= 'msp430_intrcc' /// ::= 'avr_intrcc' /// ::= 'avr_signalcc' @@ -1955,6 +1959,7 @@ void LLParser::ParseOptionalDLLStorageClass(unsigned &Res) { /// ::= 'amdgpu_ps' /// ::= 'amdgpu_cs' /// ::= 'amdgpu_kernel' +/// ::= 'tailcc' /// ::= 'cc' UINT /// bool LLParser::ParseOptionalCallingConv(unsigned &CC) { @@ -1963,6 +1968,7 @@ bool LLParser::ParseOptionalCallingConv(unsigned &CC) { case lltok::kw_ccc: CC = CallingConv::C; break; case lltok::kw_fastcc: CC = CallingConv::Fast; break; case lltok::kw_coldcc: CC = CallingConv::Cold; break; + case lltok::kw_cfguard_checkcc: CC = CallingConv::CFGuard_Check; break; case lltok::kw_x86_stdcallcc: CC = CallingConv::X86_StdCall; break; case lltok::kw_x86_fastcallcc: CC = CallingConv::X86_FastCall; break; case lltok::kw_x86_regcallcc: CC = CallingConv::X86_RegCall; break; @@ -1972,6 +1978,9 @@ bool LLParser::ParseOptionalCallingConv(unsigned &CC) { case lltok::kw_arm_aapcscc: CC = CallingConv::ARM_AAPCS; break; case lltok::kw_arm_aapcs_vfpcc:CC = CallingConv::ARM_AAPCS_VFP; break; case lltok::kw_aarch64_vector_pcs:CC = CallingConv::AArch64_VectorCall; break; + case lltok::kw_aarch64_sve_vector_pcs: + CC = CallingConv::AArch64_SVE_VectorCall; + break; case lltok::kw_msp430_intrcc: CC = CallingConv::MSP430_INTR; break; case lltok::kw_avr_intrcc: CC = CallingConv::AVR_INTR; break; case lltok::kw_avr_signalcc: CC = CallingConv::AVR_SIGNAL; break; @@ -2000,6 +2009,7 @@ bool LLParser::ParseOptionalCallingConv(unsigned &CC) { case lltok::kw_amdgpu_ps: CC = CallingConv::AMDGPU_PS; break; case lltok::kw_amdgpu_cs: CC = CallingConv::AMDGPU_CS; break; case lltok::kw_amdgpu_kernel: CC = CallingConv::AMDGPU_KERNEL; break; + case lltok::kw_tailcc: CC = CallingConv::Tail; break; case lltok::kw_cc: { Lex.Lex(); return ParseUInt32(CC); @@ -2067,16 +2077,19 @@ bool LLParser::ParseOptionalFunctionMetadata(Function &F) { /// ParseOptionalAlignment /// ::= /* empty */ /// ::= 'align' 4 -bool LLParser::ParseOptionalAlignment(unsigned &Alignment) { - Alignment = 0; +bool LLParser::ParseOptionalAlignment(MaybeAlign &Alignment) { + Alignment = None; if (!EatIfPresent(lltok::kw_align)) return false; LocTy AlignLoc = Lex.getLoc(); - if (ParseUInt32(Alignment)) return true; - if (!isPowerOf2_32(Alignment)) + uint32_t Value = 0; + if (ParseUInt32(Value)) + return true; + if (!isPowerOf2_32(Value)) return Error(AlignLoc, "alignment is not a power of two"); - if (Alignment > Value::MaximumAlignment) + if (Value > Value::MaximumAlignment) return Error(AlignLoc, "huge alignments are not supported yet"); + Alignment = Align(Value); return false; } @@ -2113,7 +2126,7 @@ bool LLParser::ParseOptionalDerefAttrBytes(lltok::Kind AttrKind, /// /// This returns with AteExtraComma set to true if it ate an excess comma at the /// end. -bool LLParser::ParseOptionalCommaAlign(unsigned &Alignment, +bool LLParser::ParseOptionalCommaAlign(MaybeAlign &Alignment, bool &AteExtraComma) { AteExtraComma = false; while (EatIfPresent(lltok::comma)) { @@ -2551,6 +2564,7 @@ bool LLParser::ParseOptionalOperandBundles( /// bool LLParser::ParseArgumentList(SmallVectorImpl<ArgInfo> &ArgList, bool &isVarArg){ + unsigned CurValID = 0; isVarArg = false; assert(Lex.getKind() == lltok::lparen); Lex.Lex(); // eat the (. @@ -2575,6 +2589,12 @@ bool LLParser::ParseArgumentList(SmallVectorImpl<ArgInfo> &ArgList, if (Lex.getKind() == lltok::LocalVar) { Name = Lex.getStrVal(); Lex.Lex(); + } else if (Lex.getKind() == lltok::LocalVarID) { + if (Lex.getUIntVal() != CurValID) + return Error(TypeLoc, "argument expected to be numbered '%" + + Twine(CurValID) + "'"); + ++CurValID; + Lex.Lex(); } if (!FunctionType::isValidArgumentType(ArgTy)) @@ -2602,6 +2622,13 @@ bool LLParser::ParseArgumentList(SmallVectorImpl<ArgInfo> &ArgList, Name = Lex.getStrVal(); Lex.Lex(); } else { + if (Lex.getKind() == lltok::LocalVarID) { + if (Lex.getUIntVal() != CurValID) + return Error(TypeLoc, "argument expected to be numbered '%" + + Twine(CurValID) + "'"); + Lex.Lex(); + } + ++CurValID; Name = ""; } @@ -3093,7 +3120,7 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) { ParseToken(lltok::rbrace, "expected end of struct constant")) return true; - ID.ConstantStructElts = make_unique<Constant *[]>(Elts.size()); + ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.size()); ID.UIntVal = Elts.size(); memcpy(ID.ConstantStructElts.get(), Elts.data(), Elts.size() * sizeof(Elts[0])); @@ -3115,7 +3142,7 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) { return true; if (isPackedStruct) { - ID.ConstantStructElts = make_unique<Constant *[]>(Elts.size()); + ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.size()); memcpy(ID.ConstantStructElts.get(), Elts.data(), Elts.size() * sizeof(Elts[0])); ID.UIntVal = Elts.size(); @@ -4794,19 +4821,19 @@ bool LLParser::ParseDIMacroFile(MDNode *&Result, bool IsDistinct) { /// ParseDIModule: /// ::= !DIModule(scope: !0, name: "SomeModule", configMacros: "-DNDEBUG", -/// includePath: "/usr/include", isysroot: "/") +/// includePath: "/usr/include", sysroot: "/") bool LLParser::ParseDIModule(MDNode *&Result, bool IsDistinct) { #define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \ REQUIRED(scope, MDField, ); \ REQUIRED(name, MDStringField, ); \ OPTIONAL(configMacros, MDStringField, ); \ OPTIONAL(includePath, MDStringField, ); \ - OPTIONAL(isysroot, MDStringField, ); + OPTIONAL(sysroot, MDStringField, ); PARSE_MD_FIELDS(); #undef VISIT_MD_FIELDS Result = GET_OR_DISTINCT(DIModule, (Context, scope.Val, name.Val, - configMacros.Val, includePath.Val, isysroot.Val)); + configMacros.Val, includePath.Val, sysroot.Val)); return false; } @@ -5354,7 +5381,7 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) { LocTy BuiltinLoc; std::string Section; std::string Partition; - unsigned Alignment; + MaybeAlign Alignment; std::string GC; GlobalValue::UnnamedAddr UnnamedAddr = GlobalValue::UnnamedAddr::None; unsigned AddrSpace = 0; @@ -5471,7 +5498,7 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) { Fn->setCallingConv(CC); Fn->setAttributes(PAL); Fn->setUnnamedAddr(UnnamedAddr); - Fn->setAlignment(Alignment); + Fn->setAlignment(MaybeAlign(Alignment)); Fn->setSection(Section); Fn->setPartition(Partition); Fn->setComdat(C); @@ -5777,7 +5804,7 @@ int LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB, if (Res != 0) return Res; if (FMF.any()) { - if (!Inst->getType()->isFPOrFPVectorTy()) + if (!isa<FPMathOperator>(Inst)) return Error(Loc, "fast-math-flags specified for select without " "floating-point scalar or vector return type"); Inst->setFastMathFlags(FMF); @@ -5788,8 +5815,21 @@ int LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB, case lltok::kw_extractelement: return ParseExtractElement(Inst, PFS); case lltok::kw_insertelement: return ParseInsertElement(Inst, PFS); case lltok::kw_shufflevector: return ParseShuffleVector(Inst, PFS); - case lltok::kw_phi: return ParsePHI(Inst, PFS); + case lltok::kw_phi: { + FastMathFlags FMF = EatFastMathFlagsIfPresent(); + int Res = ParsePHI(Inst, PFS); + if (Res != 0) + return Res; + if (FMF.any()) { + if (!isa<FPMathOperator>(Inst)) + return Error(Loc, "fast-math-flags specified for phi without " + "floating-point scalar or vector return type"); + Inst->setFastMathFlags(FMF); + } + return 0; + } case lltok::kw_landingpad: return ParseLandingPad(Inst, PFS); + case lltok::kw_freeze: return ParseFreeze(Inst, PFS); // Call. case lltok::kw_call: return ParseCall(Inst, PFS, CallInst::TCK_None); case lltok::kw_tail: return ParseCall(Inst, PFS, CallInst::TCK_Tail); @@ -6713,6 +6753,18 @@ bool LLParser::ParseLandingPad(Instruction *&Inst, PerFunctionState &PFS) { return false; } +/// ParseFreeze +/// ::= 'freeze' Type Value +bool LLParser::ParseFreeze(Instruction *&Inst, PerFunctionState &PFS) { + LocTy Loc; + Value *Op; + if (ParseTypeAndValue(Op, Loc, PFS)) + return true; + + Inst = new FreezeInst(Op); + return false; +} + /// ParseCall /// ::= 'call' OptionalFastMathFlags OptionalCallingConv /// OptionalAttrs Type Value ParameterList OptionalAttrs @@ -6753,10 +6805,6 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS, ParseOptionalOperandBundles(BundleList, PFS)) return true; - if (FMF.any() && !RetType->isFPOrFPVectorTy()) - return Error(CallLoc, "fast-math-flags specified for call without " - "floating-point scalar or vector return type"); - // If RetType is a non-function pointer type, then this is the short syntax // for the call, which means that RetType is just the return type. Infer the // rest of the function argument types from the arguments that are present. @@ -6819,8 +6867,12 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS, CallInst *CI = CallInst::Create(Ty, Callee, Args, BundleList); CI->setTailCallKind(TCK); CI->setCallingConv(CC); - if (FMF.any()) + if (FMF.any()) { + if (!isa<FPMathOperator>(CI)) + return Error(CallLoc, "fast-math-flags specified for call without " + "floating-point scalar or vector return type"); CI->setFastMathFlags(FMF); + } CI->setAttributes(PAL); ForwardRefAttrGroups[CI] = FwdRefAttrGrps; Inst = CI; @@ -6837,7 +6889,7 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS, int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) { Value *Size = nullptr; LocTy SizeLoc, TyLoc, ASLoc; - unsigned Alignment = 0; + MaybeAlign Alignment; unsigned AddrSpace = 0; Type *Ty = nullptr; @@ -6898,7 +6950,7 @@ int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) { /// 'singlethread'? AtomicOrdering (',' 'align' i32)? int LLParser::ParseLoad(Instruction *&Inst, PerFunctionState &PFS) { Value *Val; LocTy Loc; - unsigned Alignment = 0; + MaybeAlign Alignment; bool AteExtraComma = false; bool isAtomic = false; AtomicOrdering Ordering = AtomicOrdering::NotAtomic; @@ -6947,7 +6999,7 @@ int LLParser::ParseLoad(Instruction *&Inst, PerFunctionState &PFS) { /// 'singlethread'? AtomicOrdering (',' 'align' i32)? int LLParser::ParseStore(Instruction *&Inst, PerFunctionState &PFS) { Value *Val, *Ptr; LocTy Loc, PtrLoc; - unsigned Alignment = 0; + MaybeAlign Alignment; bool AteExtraComma = false; bool isAtomic = false; AtomicOrdering Ordering = AtomicOrdering::NotAtomic; @@ -8074,7 +8126,7 @@ bool LLParser::ParseFunctionSummary(std::string Name, GlobalValue::GUID GUID, if (ParseToken(lltok::rparen, "expected ')' here")) return true; - auto FS = llvm::make_unique<FunctionSummary>( + auto FS = std::make_unique<FunctionSummary>( GVFlags, InstCount, FFlags, /*EntryCount=*/0, std::move(Refs), std::move(Calls), std::move(TypeIdInfo.TypeTests), std::move(TypeIdInfo.TypeTestAssumeVCalls), @@ -8134,7 +8186,7 @@ bool LLParser::ParseVariableSummary(std::string Name, GlobalValue::GUID GUID, return true; auto GS = - llvm::make_unique<GlobalVarSummary>(GVFlags, GVarFlags, std::move(Refs)); + std::make_unique<GlobalVarSummary>(GVFlags, GVarFlags, std::move(Refs)); GS->setModulePath(ModulePath); GS->setVTableFuncs(std::move(VTableFuncs)); @@ -8175,7 +8227,7 @@ bool LLParser::ParseAliasSummary(std::string Name, GlobalValue::GUID GUID, if (ParseToken(lltok::rparen, "expected ')' here")) return true; - auto AS = llvm::make_unique<AliasSummary>(GVFlags); + auto AS = std::make_unique<AliasSummary>(GVFlags); AS->setModulePath(ModulePath); @@ -8211,6 +8263,8 @@ bool LLParser::ParseFlag(unsigned &Val) { /// [',' 'readOnly' ':' Flag]? [',' 'noRecurse' ':' Flag]? /// [',' 'returnDoesNotAlias' ':' Flag]? ')' /// [',' 'noInline' ':' Flag]? ')' +/// [',' 'alwaysInline' ':' Flag]? ')' + bool LLParser::ParseOptionalFFlags(FunctionSummary::FFlags &FFlags) { assert(Lex.getKind() == lltok::kw_funcFlags); Lex.Lex(); @@ -8252,6 +8306,12 @@ bool LLParser::ParseOptionalFFlags(FunctionSummary::FFlags &FFlags) { return true; FFlags.NoInline = Val; break; + case lltok::kw_alwaysInline: + Lex.Lex(); + if (ParseToken(lltok::colon, "expected ':'") || ParseFlag(Val)) + return true; + FFlags.AlwaysInline = Val; + break; default: return Error(Lex.getLoc(), "expected function flag type"); } |
