[clang] e7f55bb - [clang][Interp][NFCI] Call* ops don't modify the PC

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Sat Apr 8 05:25:15 PDT 2023


On Sat, Apr 8, 2023 at 2:50 AM Timm Bäder via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
>
> Author: Timm Bäder
> Date: 2023-04-08T08:49:22+02:00
> New Revision: e7f55bbdb880eb0c096b05d915ee920fe1f2fb98
>
> URL: https://github.com/llvm/llvm-project/commit/e7f55bbdb880eb0c096b05d915ee920fe1f2fb98
> DIFF: https://github.com/llvm/llvm-project/commit/e7f55bbdb880eb0c096b05d915ee920fe1f2fb98.diff
>
> LOG: [clang][Interp][NFCI] Call* ops don't modify the PC

Err, I don't think this is actually NFC given that it's fixing a
crash. Can you add test coverage for the change?

~Aaron

>
> This caused the reported errors from the Call*() handlers to report the
> wrong source location.
>
> Fixes: https://github.com/llvm/llvm-project/issues/62002
>
> Added:
>
>
> Modified:
>     clang/lib/AST/Interp/Interp.h
>     clang/lib/AST/Interp/Opcodes.td
>
> Removed:
>
>
>
> ################################################################################
> diff  --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h
> index afc5f24baf73..1eda38e9fa5b 100644
> --- a/clang/lib/AST/Interp/Interp.h
> +++ b/clang/lib/AST/Interp/Interp.h
> @@ -1486,28 +1486,29 @@ inline bool ArrayElemPtrPop(InterpState &S, CodePtr OpPC) {
>    return NarrowPtr(S, OpPC);
>  }
>
> -inline bool CheckGlobalCtor(InterpState &S, CodePtr &PC) {
> +inline bool CheckGlobalCtor(InterpState &S, CodePtr OpPC) {
>    const Pointer &Obj = S.Stk.peek<Pointer>();
> -  return CheckCtorCall(S, PC, Obj);
> +  return CheckCtorCall(S, OpPC, Obj);
>  }
>
> -inline bool Call(InterpState &S, CodePtr &PC, const Function *Func) {
> +inline bool Call(InterpState &S, CodePtr OpPC, const Function *Func) {
>    if (Func->hasThisPointer()) {
>      size_t ThisOffset =
>          Func->getArgSize() + (Func->hasRVO() ? primSize(PT_Ptr) : 0);
> +
>      const Pointer &ThisPtr = S.Stk.peek<Pointer>(ThisOffset);
>
> -    if (!CheckInvoke(S, PC, ThisPtr))
> +    if (!CheckInvoke(S, OpPC, ThisPtr))
>        return false;
>
>      if (S.checkingPotentialConstantExpression())
>        return false;
>    }
>
> -  if (!CheckCallable(S, PC, Func))
> +  if (!CheckCallable(S, OpPC, Func))
>      return false;
>
> -  auto NewFrame = std::make_unique<InterpFrame>(S, Func, PC);
> +  auto NewFrame = std::make_unique<InterpFrame>(S, Func, OpPC);
>    InterpFrame *FrameBefore = S.Current;
>    S.Current = NewFrame.get();
>
> @@ -1541,14 +1542,14 @@ inline bool CallBI(InterpState &S, CodePtr &PC, const Function *Func) {
>    return false;
>  }
>
> -inline bool CallPtr(InterpState &S, CodePtr &PC) {
> +inline bool CallPtr(InterpState &S, CodePtr OpPC) {
>    const FunctionPointer &FuncPtr = S.Stk.pop<FunctionPointer>();
>
>    const Function *F = FuncPtr.getFunction();
>    if (!F || !F->isConstexpr())
>      return false;
>
> -  return Call(S, PC, F);
> +  return Call(S, OpPC, F);
>  }
>
>  inline bool GetFnPtr(InterpState &S, CodePtr &PC, const Function *Func) {
>
> diff  --git a/clang/lib/AST/Interp/Opcodes.td b/clang/lib/AST/Interp/Opcodes.td
> index f3662dcd6f43..ed0774a78833 100644
> --- a/clang/lib/AST/Interp/Opcodes.td
> +++ b/clang/lib/AST/Interp/Opcodes.td
> @@ -179,19 +179,16 @@ def NoRet : Opcode {}
>  def Call : Opcode {
>    let Args = [ArgFunction];
>    let Types = [];
> -  let ChangesPC = 1;
>  }
>
>  def CallBI : Opcode {
>    let Args = [ArgFunction];
>    let Types = [];
> -  let ChangesPC = 1;
>  }
>
>  def CallPtr : Opcode {
>    let Args = [];
>    let Types = [];
> -  let ChangesPC = 1;
>  }
>
>  //===----------------------------------------------------------------------===//
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list