================ @@ -1143,30 +1146,62 @@ void AArch64TargetCodeGenInfo::checkFunctionABI( } } -void AArch64TargetCodeGenInfo::checkFunctionCallABIStreaming( - CodeGenModule &CGM, SourceLocation CallLoc, const FunctionDecl *Caller, - const FunctionDecl *Callee) const { - if (!Caller || !Callee || !Callee->hasAttr<AlwaysInlineAttr>()) - return; +enum class ArmStreamingInlinability : uint8_t { + Ok = 0, + IncompatibleStreamingModes = 1, + MismatchedStreamingCompatibility = 1 << 1, + CalleeHasNewZA = 1 << 2, + LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/CalleeHasNewZA), +}; +/// Determines if there are any streaming ABI issues with inlining \p Callee +/// into \p Caller. Returns the issues in the ArmStreamingInlinability bit enum +/// (multiple bits can be set). +static ArmStreamingInlinability +GetArmStreamingInlinability(const FunctionDecl *Caller, + const FunctionDecl *Callee) { bool CallerIsStreaming = IsArmStreamingFunction(Caller, /*IncludeLocallyStreaming=*/true); bool CalleeIsStreaming = IsArmStreamingFunction(Callee, /*IncludeLocallyStreaming=*/true); bool CallerIsStreamingCompatible = isStreamingCompatible(Caller); bool CalleeIsStreamingCompatible = isStreamingCompatible(Callee); + ArmStreamingInlinability Inlinability = ArmStreamingInlinability::Ok; + if (!CalleeIsStreamingCompatible && - (CallerIsStreaming != CalleeIsStreaming || CallerIsStreamingCompatible)) + (CallerIsStreaming != CalleeIsStreaming || CallerIsStreamingCompatible)) { + Inlinability |= ArmStreamingInlinability::MismatchedStreamingCompatibility; + if (CalleeIsStreaming) + Inlinability |= ArmStreamingInlinability::IncompatibleStreamingModes; + } + if (auto *NewAttr = Callee->getAttr<ArmNewAttr>()) + if (NewAttr->isNewZA()) + Inlinability |= ArmStreamingInlinability::CalleeHasNewZA; + + return Inlinability; +} + +void AArch64TargetCodeGenInfo::checkFunctionCallABIStreaming( + CodeGenModule &CGM, SourceLocation CallLoc, const FunctionDecl *Caller, + const FunctionDecl *Callee) const { + if (!Caller || !Callee || !Callee->hasAttr<AlwaysInlineAttr>()) + return; + + ArmStreamingInlinability Inlinability = + GetArmStreamingInlinability(Caller, Callee); + + if (bool(Inlinability & ---------------- sdesmalen-arm wrote:
nit: `bool(...)` is unnecessary? https://github.com/llvm/llvm-project/pull/116391 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits