@@ -440,7 +440,7 @@ pub fn dumpStackTraceFromBase(context: *ThreadContext, stderr: *Writer) void {
440440            return ;
441441        }
442442
443-         var  it  =  StackIterator .initWithContext (null , debug_info , context ) catch  return ;
443+         var  it  =  StackIterator .initWithContext (null , debug_info , context ,  @frameAddress () ) catch  return ;
444444        defer  it .deinit ();
445445
446446        // DWARF unwinding on aarch64-macos is not complete so we need to get pc address from mcontext 
@@ -499,12 +499,7 @@ pub fn captureStackTrace(first_address: ?usize, stack_trace: *std.builtin.StackT
499499        // TODO: This should use the DWARF unwinder if .eh_frame_hdr is available (so that full debug info parsing isn't required). 
500500        //       A new path for loading SelfInfo needs to be created which will only attempt to parse in-memory sections, because 
501501        //       stopping to load other debug info (ie. source line info) from disk here is not required for unwinding. 
502-         if  (builtin .cpu .arch  ==  .powerpc64 ) {
503-             // https://github.com/ziglang/zig/issues/24970 
504-             stack_trace .index  =  0 ;
505-             return ;
506-         }
507-         var  it  =  StackIterator .init (first_address , null );
502+         var  it  =  StackIterator .init (first_address , @frameAddress ());
508503        defer  it .deinit ();
509504        for  (stack_trace .instruction_addresses , 0.. ) | * addr , i |  {
510505            addr .*  =  it .next () orelse  {
@@ -787,7 +782,7 @@ pub const StackIterator = struct {
787782        failed : bool  =  false ,
788783    } else  void  =  if  (have_ucontext ) null  else  {},
789784
790-     pub  fn  init (first_address : ? usize , fp : ? usize ) StackIterator  {
785+     pub  fn  init (first_address : ? usize , fp : usize ) StackIterator  {
791786        if  (native_arch .isSPARC ()) {
792787            // Flush all the register windows on stack. 
793788            asm  volatile  (if  (builtin .cpu .has (.sparc , .v9 ))
@@ -799,31 +794,26 @@ pub const StackIterator = struct {
799794
800795        return  .{
801796            .first_address  =  first_address ,
802-             // TODO: this is a workaround for #16876 
803-             //.fp = fp orelse @frameAddress(), 
804-             .fp  =  fp  orelse  blk : {
805-                 const  fa  =  @frameAddress ();
806-                 break  :blk  fa ;
807-             },
797+             .fp  =  fp ,
808798        };
809799    }
810800
811-     pub  fn  initWithContext (first_address : ? usize , debug_info : * SelfInfo , context : * posix.ucontext_t ) ! StackIterator  {
801+     pub  fn  initWithContext (first_address : ? usize , debug_info : * SelfInfo , context : * posix.ucontext_t ,  fp :  usize ) ! StackIterator  {
812802        // The implementation of DWARF unwinding on aarch64-macos is not complete. However, Apple mandates that 
813803        // the frame pointer register is always used, so on this platform we can safely use the FP-based unwinder. 
814804        if  (builtin .target .os .tag .isDarwin () and  native_arch  ==  .aarch64 )
815805            return  init (first_address , @truncate (context .mcontext .ss .fp ));
816806
817807        if  (SelfInfo .supports_unwinding ) {
818-             var  iterator  =  init (first_address , null );
808+             var  iterator  =  init (first_address , fp );
819809            iterator .unwind_state  =  .{
820810                .debug_info  =  debug_info ,
821811                .dwarf_context  =  try  SelfInfo .UnwindContext .init (debug_info .allocator , context ),
822812            };
823813            return  iterator ;
824814        }
825815
826-         return  init (first_address , null );
816+         return  init (first_address , fp );
827817    }
828818
829819    pub  fn  deinit (it : * StackIterator ) void  {
@@ -981,8 +971,8 @@ pub fn writeCurrentStackTrace(
981971    const  has_context  =  getContext (& context );
982972
983973    var  it  =  (if  (has_context ) blk : {
984-         break  :blk  StackIterator .initWithContext (start_addr , debug_info , & context ) catch  null ;
985-     } else  null ) orelse  StackIterator .init (start_addr , null );
974+         break  :blk  StackIterator .initWithContext (start_addr , debug_info , & context ,  @frameAddress () ) catch  null ;
975+     } else  null ) orelse  StackIterator .init (start_addr , @frameAddress () );
986976    defer  it .deinit ();
987977
988978    while  (it .next ()) | return_address |  {
0 commit comments