[libcxx-commits] [libcxxabi] b413b84 - [libc++abi][AIX] Skip non-C++ EH aware frames when retrieving exception object

Xing Xue via libcxx-commits libcxx-commits at lists.llvm.org
Wed Feb 15 08:15:29 PST 2023


Author: Xing Xue
Date: 2023-02-15T11:14:52-05:00
New Revision: b413b84a704e376860048e339e669adc6596a3ee

URL: https://github.com/llvm/llvm-project/commit/b413b84a704e376860048e339e669adc6596a3ee
DIFF: https://github.com/llvm/llvm-project/commit/b413b84a704e376860048e339e669adc6596a3ee.diff

LOG: [libc++abi][AIX] Skip non-C++ EH aware frames when retrieving exception object

Summary:
The personality routine for the legacy AIX xlclang++ compiler uses the stack slot reserved for compilers to pass the exception object to the landing pad. The landing pad retrieves the exception object with a call to the runtime function __xlc_exception_handle(). The current implementation incorrectly assumes that __xlc_exception_handle() should go up one stack frame to get to the stack frame of the caller of __xlc_exception_handle(), which is supposedly the stack frame of the function containing the landing pad. However, this does not always work, e.g., the xlclang++ compiler sometimes generates a wrapper of __xlc_exception_handle() and calls the wrapper from the landing pad for optimization purposes. This patch changes the implementation to unwind the stack from __xlc_exception_handle() and skip frames not associated with functions that are C++ EH-aware until a frame associated with a C++ EH-aware function is found and then retrieving the exception object with the expectation that the located frame is the one that the personality routine installed as it transferred control to the landing pad.

Reviewed by: cebowleratibm, hubert.reinterpretcast, daltenty

Differential Revision: https://reviews.llvm.org/D143010

Added: 
    libcxxabi/test/vendor/ibm/aix_xlclang_passing_excp_obj_32.pass.sh.S
    libcxxabi/test/vendor/ibm/aix_xlclang_passing_excp_obj_64.pass.sh.S

Modified: 
    libcxxabi/src/aix_state_tab_eh.inc

Removed: 
    


################################################################################
diff  --git a/libcxxabi/src/aix_state_tab_eh.inc b/libcxxabi/src/aix_state_tab_eh.inc
index 128a0ab34af7e..3bb09ed27573a 100644
--- a/libcxxabi/src/aix_state_tab_eh.inc
+++ b/libcxxabi/src/aix_state_tab_eh.inc
@@ -14,10 +14,6 @@
 #include <stdio.h>
 #include <sys/debug.h>
 
-#if !__has_cpp_attribute(clang::optnone)
-#error This file requires clang::optnone attribute support
-#endif
-
 /*
   The legacy IBM xlC and xlclang++ compilers use the state table for EH
   instead of the range table. Destructors, or addresses of the possible catch
@@ -563,7 +559,8 @@ __xlcxx_personality_v0(int version, _Unwind_Action actions, uint64_t exceptionCl
       uintptr_t *currentSP = reinterpret_cast<uintptr_t*>(_Unwind_GetGR(context, 1));
       uintptr_t *callersSP = reinterpret_cast<uintptr_t*>(currentSP[0]);
       callersSP[3] = reinterpret_cast<uintptr_t>(unwind_exception);
-      _LIBCXXABI_TRACE_STATETAB("Handshake: set unwind_exception=%p in stack=%p\n", reinterpret_cast<void*>(unwind_exception), reinterpret_cast<void*>(callersSP));
+      _LIBCXXABI_TRACE_STATETAB("Handshake: save unwind_exception=%p in stack=%p\n",
+                                reinterpret_cast<void*>(unwind_exception), reinterpret_cast<void*>(callersSP));
       // Jump to the handler.
       _Unwind_SetIP(context, results.landingPad);
       return _URC_INSTALL_CONTEXT;
@@ -641,38 +638,68 @@ _LIBCXXABI_FUNC_VIS void __xlc_throw_badexception() {
   __cxa_throw(newexception, const_cast<std::type_info*>(&typeid(std::bad_exception)), 0);
 }
 
-// force_a_stackframe
-// This function is called by __xlc_exception_handle() to ensure a stack frame
-// is created for __xlc_exception_handle().
-__attribute__((noinline, optnone))
-static void force_a_stackframe() {}
+// skip_non_cxx_eh_aware_frames
+// This function skips non-C++ EH aware stack frames by unwinding from the
+// stack frame pointed by 'Sp' and returns the first C++ EH aware stack frame
+// found. 'Pc' is an instruction address inside the function that owns the
+// stack frame pointed to by 'Sp'.
+static uintptr_t* skip_non_cxx_eh_aware_frames(uint32_t* Pc, uintptr_t* Sp) {
+  uint32_t* currentPc = Pc;
+  uintptr_t* currentStack = Sp;
+
+  // Loop until a C++ EH aware frame is found or the return address is 0,
+  // which is the return address of the startup function '__start'.
+  while (currentPc != 0) {
+    uint32_t* p = currentPc;
+
+    // Keep looking forward until a word of 0 is found. The traceback
+    // table starts at the following word.
+    while (*p)
+      ++p;
+    tbtable* TBTable = reinterpret_cast<tbtable*>(p + 1);
+
+    // A stack frame with a C++ state table is C++ EH aware.
+    if (TBTable->tb.lang == TB_CPLUSPLUS && TBTable->tb.has_ctl)
+      return currentStack;
+
+    // Move up one stack frame.
+    currentStack = reinterpret_cast<uintptr_t*>(currentStack[0]);
+    // Get the value of the LR (saved, prior to incrementing the SP, by the
+    // prolog of the function just inspected) from the frame.
+    currentPc = reinterpret_cast<uint32_t*>(currentStack[2]);
+  }
+  // This should not happen.
+  _LIBCXXABI_TRACE_STATETAB0("skip_non_cxx_eh_aware_frames() reached the end of stack frames, aborting\n");
+  abort();
+}
 
 // __xlc_exception_handle
 // This function is for xlclang++. It returns the address of the exception
 // object stored in the reserved field in the stack of the caller of the
 // function that calls __xlc_exception_handle() (within the link area for the
 // call to the latter). The address is stored by the personality routine for
-// xlclang++ compiled code. The implementation of __xlc_exception_handle()
-// assumes a stack frame is created for it. The following ensures this
-// assumption holds true: 1) a call to force_a_stackframe() is made inside
-// __xlc_exception_handle() to make it non-leaf; and 2) optimizations are
-// disabled for this function with attribute 'optnone'. Note: this function
-// may not work as expected if these are changed.
-__attribute__((optnone))
+// xlclang++ compiled code. If __xlc_exception_handle() is called by
+// non-C++ EH aware functions, their frames are skipped until a C++ EH aware
+// frame is found.
+// Note: make sure __xlc_excpetion_handle() is a non-leaf function. Currently
+// it calls skip_non_cxx_eh_aware_frames(), which in turn calls abort().
 _LIBCXXABI_FUNC_VIS uintptr_t __xlc_exception_handle() {
-  // Make a call to force_a_stackframe() so that the compiler creates a stack
-  // frame for this function.
-  force_a_stackframe();
-
   // Get the SP of this function, i.e., __xlc_exception_handle().
-  uintptr_t *lastStack;
-  asm("mr %0, 1" : "=r"(lastStack));
-  // Get the SP of the caller of __xlc_exception_handle().
-  uintptr_t *callerStack = reinterpret_cast<uintptr_t*>(lastStack[0]);
-  // Get the SP of the caller of the caller.
-  uintptr_t *callerStack2 = reinterpret_cast<uintptr_t*>(callerStack[0]);
-  uintptr_t exceptionObject = callerStack2[3];
-  _LIBCXXABI_TRACE_STATETAB("Handshake: exceptionObject=%p from stack=%p\n", reinterpret_cast<void*>(exceptionObject), reinterpret_cast<void*>(callerStack2));
+  uintptr_t* lastStack = reinterpret_cast<uintptr_t*>(__builtin_frame_address(0));
+  // Move one frame up to the frame of the caller of __xlc_exception_handle().
+  lastStack = reinterpret_cast<uintptr_t*>(lastStack[0]);
+  // Get the return address of this function, i.e., __xlc_exception_handle().
+  uint32_t* returnAddress = reinterpret_cast<uint32_t*>(__builtin_return_address(0));
+
+  // Skip non-C++ EH aware frames and get the first C++ EH aware frame.
+  uintptr_t* callerStack = skip_non_cxx_eh_aware_frames(returnAddress, lastStack);
+
+  // Get the SP of the caller of the C++ EH aware caller.
+  callerStack = reinterpret_cast<uintptr_t*>(callerStack[0]);
+  // Retrieve the exception object in the stack slot saved by the personality.
+  uintptr_t exceptionObject = callerStack[3];
+  _LIBCXXABI_TRACE_STATETAB("Handshake: retrieve exceptionObject=%p from stack=%p\n",
+                            reinterpret_cast<void*>(exceptionObject), reinterpret_cast<void*>(callerStack));
   return exceptionObject;
 }
 

diff  --git a/libcxxabi/test/vendor/ibm/aix_xlclang_passing_excp_obj_32.pass.sh.S b/libcxxabi/test/vendor/ibm/aix_xlclang_passing_excp_obj_32.pass.sh.S
new file mode 100644
index 0000000000000..d8a3ae0e91a05
--- /dev/null
+++ b/libcxxabi/test/vendor/ibm/aix_xlclang_passing_excp_obj_32.pass.sh.S
@@ -0,0 +1,690 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Test that the exception object is passed correctly from the personality
+// to the landing pad even when there are wrappers around runtime function
+// __xlc_exception_handle. This test is only for the legacy AIX xlclang
+// compiler generated code. The test source consists of two C++ source files
+// t1.cpp and t2.cpp which are compiled into assembly code by the legacy AIX
+// xlclang++ compiler included in this file. This file tests for the 32-bit
+// mode.
+
+# REQUIRES: target=powerpc-ibm-aix
+# UNSUPPORTED: no-exceptions
+
+// RUN: %{cxx} -c %s -o %t1_32.o -DT1_CPP_CODE %{flags} %{compile_flags}
+// RUN: %{cxx} -c %s -o %t2_32.o -DT2_CPP_CODE %{flags} %{compile_flags}
+// RUN: %{cxx} -o %t_32.exe %t1_32.o %t2_32.o %{flags} %{link_flags}
+// RUN: %{exec} %t_32.exe
+
+#if defined(T1_CPP_CODE)
+#
+# This portion of assembly code is generated by IBM legacy xlclang++ compiler
+# from the following C++ source file for 32-bit mode.
+#
+# t1.cpp:
+#
+#extern "C" int printf(const char *, ...);
+#
+#extern "C" unsigned int * __xlc_exception_handle() __attribute__((weak, alias("wrap__xlc_exception_handle")));
+#
+#void barf() __attribute__((noinline));
+#
+#int main(void) {
+#   try {
+#      barf();
+#   } catch(int) {
+#      printf("caught int\n");
+#   }
+#   return 0;
+#}
+#
+#void barf() { throw 42; }
+
+.set r0,0; .set SP,1; .set RTOC,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31
+.set fp0,0; .set fp1,1; .set fp2,2; .set fp3,3; .set fp4,4
+.set fp5,5; .set fp6,6; .set fp7,7; .set fp8,8; .set fp9,9
+.set fp10,10; .set fp11,11; .set fp12,12; .set fp13,13; .set fp14,14
+.set fp15,15; .set fp16,16; .set fp17,17; .set fp18,18; .set fp19,19
+.set fp20,20; .set fp21,21; .set fp22,22; .set fp23,23; .set fp24,24
+.set fp25,25; .set fp26,26; .set fp27,27; .set fp28,28; .set fp29,29
+.set fp30,30; .set fp31,31
+.set v0,0; .set v1,1; .set v2,2; .set v3,3; .set v4,4
+.set v5,5; .set v6,6; .set v7,7; .set v8,8; .set v9,9
+.set v10,10; .set v11,11; .set v12,12; .set v13,13; .set v14,14
+.set v15,15; .set v16,16; .set v17,17; .set v18,18; .set v19,19
+.set v20,20; .set v21,21; .set v22,22; .set v23,23; .set v24,24
+.set v25,25; .set v26,26; .set v27,27; .set v28,28; .set v29,29
+.set v30,30; .set v31,31
+.set x0,0; .set x1,1; .set x2,2; .set x3,3; .set x4,4
+.set x5,5; .set x6,6; .set x7,7; .set x8,8; .set x9,9
+.set x10,10; .set x11,11; .set x12,12; .set x13,13; .set x14,14
+.set x15,15; .set x16,16; .set x17,17; .set x18,18; .set x19,19
+.set x20,20; .set x21,21; .set x22,22; .set x23,23; .set x24,24
+.set x25,25; .set x26,26; .set x27,27; .set x28,28; .set x29,29
+.set x30,30; .set x31,31; .set x32,32; .set x33,33; .set x34,34
+.set x35,35; .set x36,36; .set x37,37; .set x38,38; .set x39,39
+.set x40,40; .set x41,41; .set x42,42; .set x43,43; .set x44,44
+.set x45,45; .set x46,46; .set x47,47; .set x48,48; .set x49,49
+.set x50,50; .set x51,51; .set x52,52; .set x53,53; .set x54,54
+.set x55,55; .set x56,56; .set x57,57; .set x58,58; .set x59,59
+.set x60,60; .set x61,61; .set x62,62; .set x63,63
+.set q0,0; .set q1,1; .set q2,2; .set q3,3; .set q4,4
+.set q5,5; .set q6,6; .set q7,7; .set q8,8; .set q9,9
+.set q10,10; .set q11,11; .set q12,12; .set q13,13; .set q14,14
+.set q15,15; .set q16,16; .set q17,17; .set q18,18; .set q19,19
+.set q20,20; .set q21,21; .set q22,22; .set q23,23; .set q24,24
+.set q25,25; .set q26,26; .set q27,27; .set q28,28; .set q29,29
+.set q30,30; .set q31,31
+.set MQ,0; .set XER,1; .set DSCR,3; .set FROM_RTCU,4; .set FROM_RTCL,5
+.set FROM_DEC,6; .set LR,8; .set CTR,9; .set AMR,13; .set TID,17; .set DSISR,18
+.set DAR,19; .set TO_RTCU,20; .set TO_RTCL,21; .set TO_DEC,22; .set SDR_0,24
+.set SDR_1,25; .set SRR_0,26; .set SRR_1,27
+.set BO_dCTR_NZERO_AND_NOT,0; .set BO_dCTR_NZERO_AND_NOT_1,1
+.set BO_dCTR_ZERO_AND_NOT,2; .set BO_dCTR_ZERO_AND_NOT_1,3
+.set BO_IF_NOT,4; .set BO_IF_NOT_1,5; .set BO_IF_NOT_2,6
+.set BO_IF_NOT_3,7; .set BO_dCTR_NZERO_AND,8; .set BO_dCTR_NZERO_AND_1,9
+.set BO_dCTR_ZERO_AND,10; .set BO_dCTR_ZERO_AND_1,11; .set BO_IF,12
+.set BO_IF_1,13; .set BO_IF_2,14; .set BO_IF_3,15; .set BO_dCTR_NZERO,16
+.set BO_dCTR_NZERO_1,17; .set BO_dCTR_ZERO,18; .set BO_dCTR_ZERO_1,19
+.set BO_ALWAYS,20; .set BO_ALWAYS_1,21; .set BO_ALWAYS_2,22
+.set BO_ALWAYS_3,23; .set BO_dCTR_NZERO_8,24; .set BO_dCTR_NZERO_9,25
+.set BO_dCTR_ZERO_8,26; .set BO_dCTR_ZERO_9,27; .set BO_ALWAYS_8,28
+.set BO_ALWAYS_9,29; .set BO_ALWAYS_10,30; .set BO_ALWAYS_11,31
+.set CR0_LT,0; .set CR0_GT,1; .set CR0_EQ,2; .set CR0_SO,3
+.set CR1_FX,4; .set CR1_FEX,5; .set CR1_VX,6; .set CR1_OX,7
+.set CR2_LT,8; .set CR2_GT,9; .set CR2_EQ,10; .set CR2_SO,11
+.set CR3_LT,12; .set CR3_GT,13; .set CR3_EQ,14; .set CR3_SO,15
+.set CR4_LT,16; .set CR4_GT,17; .set CR4_EQ,18; .set CR4_SO,19
+.set CR5_LT,20; .set CR5_GT,21; .set CR5_EQ,22; .set CR5_SO,23
+.set CR6_LT,24; .set CR6_GT,25; .set CR6_EQ,26; .set CR6_SO,27
+.set CR7_LT,28; .set CR7_GT,29; .set CR7_EQ,30; .set CR7_SO,31
+.set TO_LT,16; .set TO_GT,8; .set TO_EQ,4; .set TO_LLT,2; .set TO_LGT,1
+
+	.rename	H.10.NO_SYMBOL{PR},""
+	.rename	H.16..__4,".__4"
+	.rename	H.18..__8,".__8"
+	.rename	H.20..__3,".__3"
+	.rename	H.24.NO_SYMBOL{TC},""
+	.rename	H.26.NO_SYMBOL{RO},""
+	.rename	E.28.__STATIC{RW},"_$STATIC"
+	.rename	H.30.__STATIC{TC},"_$STATIC"
+	.rename	H.34.__4{TC},"__4"
+	.rename	H.38.__8{TC},"__8"
+	.rename	H.42.__3{TC},"__3"
+	.rename	H.46._Z4barfv{TC},"_Z4barfv"
+	.rename	H.50._ZTIi{TC},"_ZTIi"
+	.rename	H.54.main{TC},"main"
+
+	.lglobl	H.10.NO_SYMBOL{PR}      
+	.globl	._Z4barfv               
+	.globl	.main                   
+	.lglobl	H.16..__4               
+	.lglobl	H.18..__8               
+	.lglobl	H.20..__3               
+	.lglobl	H.26.NO_SYMBOL{RO}      
+	.lglobl	E.28.__STATIC{RW}       
+	.lglobl	__4{DS}                 
+	.lglobl	__8{DS}                 
+	.lglobl	__3{DS}                 
+	.globl	_Z4barfv{DS}            
+	.extern	_ZTIi{UA}               
+	.globl	main{DS}                
+	.extern	.__cxa_allocate_exception{PR}
+	.extern	.__cxa_throw{PR}        
+	.extern	.wrap__xlc_exception_handle{PR}
+	.extern	.__xlc_catch_matchv2{PR}
+	.extern	.__cxa_begin_catch{PR}  
+	.extern	.printf{PR}             
+	.extern	.__cxa_end_catch{PR}    
+	.extern	._Unwind_Resume{PR}     
+	.extern	.__cxa_rethrow{PR}      
+	.extern	._ZSt9terminatev{PR}    
+
+
+# .text section
+	.file	"t.cpp","Mon Jan 30 12:53:50 2023 ","IBM XL C/C++ for AIX, Version 16.1.0.13"
+
+
+
+	.csect	H.10.NO_SYMBOL{PR}, 7   
+._Z4barfv:                              # 0x00000000 (H.10.NO_SYMBOL)
+	mfspr      r0,LR
+	stu        SP,-80(SP)
+	st         r0,88(SP)
+	cal        r3,4(r0)
+	bl         .__cxa_allocate_exception{PR}
+	oril       r0,r0,0x0000
+	oril       r4,r3,0x0000
+	st         r4,64(SP)
+	cal        r3,42(r0)
+	st         r3,0(r4)
+	l          r3,64(SP)
+	l          r4,T.50._ZTIi(RTOC)
+	cal        r5,0(r0)
+	bl         .__cxa_throw{PR}
+	oril       r0,r0,0x0000
+	l          r0,88(SP)
+	mtspr      LR,r0
+	cal        SP,80(SP)
+	bcr        BO_ALWAYS,CR0_LT
+	.long	0x00000000
+# traceback table
+	.byte	0x00			# VERSION=0
+	.byte	0x09			# LANG=TB_CPLUSPLUS
+	.byte	0x20			# IS_GL=0,IS_EPROL=0,HAS_TBOFF=1
+					# INT_PROC=0,HAS_CTL=0,TOCLESS=0
+					# FP_PRESENT=0,LOG_ABORT=0
+	.byte	0x41			# INT_HNDL=0,NAME_PRESENT=1
+					# USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND
+					# SAVES_CR=0,SAVES_LR=1
+	.byte	0x80			# STORES_BC=1,FPR_SAVED=0
+	.byte	0x00			# GPR_SAVED=0
+	.byte	0x00			# FIXEDPARMS=0
+	.byte	0x01			# FLOATPARMS=0,PARMSONSTK=1
+	.long	0x0000004c		# TB_OFFSET
+	.short	8			# NAME_LEN
+	.byte	"_Z4barfv"              # NAME
+
+	.byte	0			# padding
+	.byte	0			# padding
+# End of traceback table
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+.main:                                  # 0x00000080 (H.10.NO_SYMBOL+0x80)
+	mfspr      r0,LR
+	st         r31,-4(SP)
+	st         r30,-8(SP)
+	st         r29,-12(SP)
+	st         r0,8(SP)
+	stu        SP,-112(SP)
+	oril       r30,SP,0x0000
+	l          r31,T.30.__STATIC(RTOC)
+	l          r29,T.24.NO_SYMBOL(RTOC)
+	cal        r3,0(r0)
+	st         r3,64(r30)
+	oril       r4,r31,0x0000
+	st         r4,68(r30)
+	st         r3,72(r30)
+	st         r3,76(r30)
+	cal        r3,1(r0)
+	stb        r3,67(r30)
+	bl         ._Z4barfv
+	cal        r3,0(r0)
+	stb        r3,67(r30)
+	b          __L188
+__Ld4:                                  # 0x000000d4 (H.10.NO_SYMBOL+0xd4)
+	l          r31,T.30.__STATIC(RTOC)
+	l          r29,T.24.NO_SYMBOL(RTOC)
+	cal        r3,2(r0)
+	stb        r3,67(r30)
+	bl         .wrap__xlc_exception_handle{PR}
+	oril       r0,r0,0x0000
+	st         r3,80(r30)
+	l          r4,T.50._ZTIi(RTOC)
+	cal        r5,84(r30)
+	bl         .__xlc_catch_matchv2{PR}
+	oril       r0,r0,0x0000
+	cmpli      0,r3,0x0000
+	bc         BO_IF_NOT,CR0_EQ,__L10c
+	b          __L164
+__L10c:                                 # 0x0000010c (H.10.NO_SYMBOL+0x10c)
+	l          r3,80(r30)
+	bl         .__cxa_begin_catch{PR}
+	oril       r0,r0,0x0000
+	oril       r3,r29,0x0000
+	bl         .printf{PR}
+	oril       r0,r0,0x0000
+	bl         .__cxa_end_catch{PR}
+	oril       r0,r0,0x0000
+	cal        r3,0(r0)
+	stb        r3,67(r30)
+	b          __L188
+__L138:                                 # 0x00000138 (H.10.NO_SYMBOL+0x138)
+	l          r31,T.30.__STATIC(RTOC)
+	l          r29,T.24.NO_SYMBOL(RTOC)
+	bl         .__cxa_end_catch{PR}
+	oril       r0,r0,0x0000
+	cal        r3,0(r0)
+	stb        r3,67(r30)
+	bl         .wrap__xlc_exception_handle{PR}
+	oril       r0,r0,0x0000
+	st         r3,88(r30)
+	bl         ._Unwind_Resume{PR}
+	oril       r0,r0,0x0000
+__L164:                                 # 0x00000164 (H.10.NO_SYMBOL+0x164)
+	cal        r3,2(r0)
+	stb        r3,67(r30)
+	bl         .wrap__xlc_exception_handle{PR}
+	oril       r0,r0,0x0000
+	st         r3,92(r30)
+	bl         .__cxa_begin_catch{PR}
+	oril       r0,r0,0x0000
+	bl         .__cxa_rethrow{PR}
+	oril       r0,r0,0x0000
+__L188:                                 # 0x00000188 (H.10.NO_SYMBOL+0x188)
+	cal        r3,0(r0)
+	b          __L1b8
+__L190:                                 # 0x00000190 (H.10.NO_SYMBOL+0x190)
+	bl         .wrap__xlc_exception_handle{PR}
+	oril       r0,r0,0x0000
+	st         r3,96(r30)
+	bl         ._Unwind_Resume{PR}
+	oril       r0,r0,0x0000
+__L1a4:                                 # 0x000001a4 (H.10.NO_SYMBOL+0x1a4)
+	l          r31,T.30.__STATIC(RTOC)
+	l          r29,T.24.NO_SYMBOL(RTOC)
+	bl         ._ZSt9terminatev{PR}
+	oril       r0,r0,0x0000
+	b          __L190
+__L1b8:                                 # 0x000001b8 (H.10.NO_SYMBOL+0x1b8)
+	l          SP,0(SP)
+	l          r29,-12(SP)
+	l          r30,-8(SP)
+	l          r31,-4(SP)
+	l          r0,8(SP)
+	mtspr      LR,r0
+	bcr        BO_ALWAYS,CR0_LT
+	.long	0x00000000
+# traceback table
+	.byte	0x00			# VERSION=0
+	.byte	0x09			# LANG=TB_CPLUSPLUS
+	.byte	0x28			# IS_GL=0,IS_EPROL=0,HAS_TBOFF=1
+					# INT_PROC=0,HAS_CTL=1,TOCLESS=0
+					# FP_PRESENT=0,LOG_ABORT=0
+	.byte	0x61			# INT_HNDL=0,NAME_PRESENT=1
+					# USES_ALLOCA=1,CL_DIS_INV=WALK_ONCOND
+					# SAVES_CR=0,SAVES_LR=1
+	.byte	0x80			# STORES_BC=1,FPR_SAVED=0
+	.byte	0x03			# GPR_SAVED=3
+	.byte	0x00			# FIXEDPARMS=0
+	.byte	0x01			# FLOATPARMS=0,PARMSONSTK=1
+	.long	0x00000154		# TB_OFFSET
+	.long	0x00000001		# NUM_CTL_INFO
+	.long	0x00000040		# ctl_info_disp[0]
+	.short	4			# NAME_LEN
+	.byte	"main"                  # NAME
+
+	.byte	30			# ALLOCA_REG
+	.byte	0			# padding
+# End of traceback table
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+H.16..__4:                              # 0x00000200 (H.10.NO_SYMBOL+0x200)
+	b          __L1a4
+	bcr        BO_ALWAYS,CR0_LT
+	.long	0x00000000
+# traceback table
+	.byte	0x00			# VERSION=0
+	.byte	0x09			# LANG=TB_CPLUSPLUS
+	.byte	0x20			# IS_GL=0,IS_EPROL=0,HAS_TBOFF=1
+					# INT_PROC=0,HAS_CTL=0,TOCLESS=0
+					# FP_PRESENT=0,LOG_ABORT=0
+	.byte	0x40			# INT_HNDL=0,NAME_PRESENT=1
+					# USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND
+					# SAVES_CR=0,SAVES_LR=0
+	.byte	0x00			# STORES_BC=0,FPR_SAVED=0
+	.byte	0x00			# GPR_SAVED=0
+	.byte	0x00			# FIXEDPARMS=0
+	.byte	0x01			# FLOATPARMS=0,PARMSONSTK=1
+	.long	0x00000008		# TB_OFFSET
+	.short	3			# NAME_LEN
+	.byte	"__4"                   # NAME
+
+	.byte	0			# padding
+	.byte	0			# padding
+	.byte	0			# padding
+# End of traceback table
+H.18..__8:                              # 0x00000220 (H.10.NO_SYMBOL+0x220)
+	b          __L138
+	bcr        BO_ALWAYS,CR0_LT
+	.long	0x00000000
+# traceback table
+	.byte	0x00			# VERSION=0
+	.byte	0x09			# LANG=TB_CPLUSPLUS
+	.byte	0x20			# IS_GL=0,IS_EPROL=0,HAS_TBOFF=1
+					# INT_PROC=0,HAS_CTL=0,TOCLESS=0
+					# FP_PRESENT=0,LOG_ABORT=0
+	.byte	0x40			# INT_HNDL=0,NAME_PRESENT=1
+					# USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND
+					# SAVES_CR=0,SAVES_LR=0
+	.byte	0x00			# STORES_BC=0,FPR_SAVED=0
+	.byte	0x00			# GPR_SAVED=0
+	.byte	0x00			# FIXEDPARMS=0
+	.byte	0x01			# FLOATPARMS=0,PARMSONSTK=1
+	.long	0x00000008		# TB_OFFSET
+	.short	3			# NAME_LEN
+	.byte	"__8"                   # NAME
+
+	.byte	0			# padding
+	.byte	0			# padding
+	.byte	0			# padding
+# End of traceback table
+H.20..__3:                              # 0x00000240 (H.10.NO_SYMBOL+0x240)
+	b          __Ld4
+	bcr        BO_ALWAYS,CR0_LT
+	.long	0x00000000
+# traceback table
+	.byte	0x00			# VERSION=0
+	.byte	0x09			# LANG=TB_CPLUSPLUS
+	.byte	0x20			# IS_GL=0,IS_EPROL=0,HAS_TBOFF=1
+					# INT_PROC=0,HAS_CTL=0,TOCLESS=0
+					# FP_PRESENT=0,LOG_ABORT=0
+	.byte	0x40			# INT_HNDL=0,NAME_PRESENT=1
+					# USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND
+					# SAVES_CR=0,SAVES_LR=0
+	.byte	0x00			# STORES_BC=0,FPR_SAVED=0
+	.byte	0x00			# GPR_SAVED=0
+	.byte	0x00			# FIXEDPARMS=0
+	.byte	0x01			# FLOATPARMS=0,PARMSONSTK=1
+	.long	0x00000008		# TB_OFFSET
+	.short	3			# NAME_LEN
+	.byte	"__3"                   # NAME
+
+	.byte	0			# padding
+	.byte	0			# padding
+	.byte	0			# padding
+# End of traceback table
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	H.10.NO_SYMBOL{PR}
+
+# .data section
+
+
+	.toc	                        # 0x00000280 
+T.46._Z4barfv:
+	.tc	H.46._Z4barfv{TC},_Z4barfv{DS}
+T.50._ZTIi:
+	.tc	H.50._ZTIi{TC},_ZTIi{UA}
+T.54.main:
+	.tc	H.54.main{TC},main{DS}  
+T.30.__STATIC:
+	.tc	H.30.__STATIC{TC},E.28.__STATIC{RW}
+T.24.NO_SYMBOL:
+	.tc	H.24.NO_SYMBOL{TC},H.26.NO_SYMBOL{RO}
+T.34.__4:
+	.tc	H.34.__4{TC},__4{DS}    
+T.38.__8:
+	.tc	H.38.__8{TC},__8{DS}    
+T.42.__3:
+	.tc	H.42.__3{TC},__3{DS}    
+
+
+	.csect	_Z4barfv{DS}            
+	.long	._Z4barfv               # "\0\0\0\0"
+	.long	TOC{TC0}                # "\0\0\002\200"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	_Z4barfv{DS}
+
+
+	.csect	main{DS}                
+	.long	.main                   # "\0\0\0\200"
+	.long	TOC{TC0}                # "\0\0\002\200"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	main{DS}
+
+
+	.csect	__4{DS}                 
+	.long	H.16..__4               # "\0\0\002\0"
+	.long	TOC{TC0}                # "\0\0\002\200"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	__4{DS}
+
+
+	.csect	__8{DS}                 
+	.long	H.18..__8               # "\0\0\002 "
+	.long	TOC{TC0}                # "\0\0\002\200"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	__8{DS}
+
+
+	.csect	__3{DS}                 
+	.long	H.20..__3               # "\0\0\002@"
+	.long	TOC{TC0}                # "\0\0\002\200"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	__3{DS}
+
+
+	.csect	E.28.__STATIC{RW}, 3    
+	.long	0x1cedbeef              # "\034\355\276\357"
+	.long	0x00000003              # "\0\0\0\003"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	__3{DS}                 # "\0\0\002\320"
+	.long	0xffffffff              # "\377\377\377\377"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	__8{DS}                 # "\0\0\002\304"
+	.long	0xfffffffe              # "\377\377\377\376"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	__4{DS}                 # "\0\0\002\270"
+	.long	0xfffffffc              # "\377\377\377\374"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	E.28.__STATIC{RW}
+
+
+	.csect	H.26.NO_SYMBOL{RO}, 3   
+	.long	0x63617567              # "caug"
+	.long	0x68742069              # "ht i"
+	.long	0x6e740a00              # "nt\n\0"
+# End	csect	H.26.NO_SYMBOL{RO}
+
+
+
+# .bss section
+
+
+# dwarf sections
+
+# end dwarf sections
+#endif // defined(T1_CPP_CODE)
+
+#if defined(T2_CPP_CODE)
+#
+# This portion of assembly code is generated by IBM legacy xlclang++ compiler
+# from the following C++ source file for 64-bit mode.
+#
+# t2.cpp
+#
+#extern "C" int printf(const char *, ...);
+#
+#extern "C" unsigned int * __xlc_exception_handle();
+#
+#extern "C" unsigned int * wrap__xlc_exception_handle() {
+#  printf("wrap__xlc_exception_handle called\n");
+#  return __xlc_exception_handle();
+#}
+#
+
+.set r0,0; .set SP,1; .set RTOC,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31
+.set fp0,0; .set fp1,1; .set fp2,2; .set fp3,3; .set fp4,4
+.set fp5,5; .set fp6,6; .set fp7,7; .set fp8,8; .set fp9,9
+.set fp10,10; .set fp11,11; .set fp12,12; .set fp13,13; .set fp14,14
+.set fp15,15; .set fp16,16; .set fp17,17; .set fp18,18; .set fp19,19
+.set fp20,20; .set fp21,21; .set fp22,22; .set fp23,23; .set fp24,24
+.set fp25,25; .set fp26,26; .set fp27,27; .set fp28,28; .set fp29,29
+.set fp30,30; .set fp31,31
+.set v0,0; .set v1,1; .set v2,2; .set v3,3; .set v4,4
+.set v5,5; .set v6,6; .set v7,7; .set v8,8; .set v9,9
+.set v10,10; .set v11,11; .set v12,12; .set v13,13; .set v14,14
+.set v15,15; .set v16,16; .set v17,17; .set v18,18; .set v19,19
+.set v20,20; .set v21,21; .set v22,22; .set v23,23; .set v24,24
+.set v25,25; .set v26,26; .set v27,27; .set v28,28; .set v29,29
+.set v30,30; .set v31,31
+.set x0,0; .set x1,1; .set x2,2; .set x3,3; .set x4,4
+.set x5,5; .set x6,6; .set x7,7; .set x8,8; .set x9,9
+.set x10,10; .set x11,11; .set x12,12; .set x13,13; .set x14,14
+.set x15,15; .set x16,16; .set x17,17; .set x18,18; .set x19,19
+.set x20,20; .set x21,21; .set x22,22; .set x23,23; .set x24,24
+.set x25,25; .set x26,26; .set x27,27; .set x28,28; .set x29,29
+.set x30,30; .set x31,31; .set x32,32; .set x33,33; .set x34,34
+.set x35,35; .set x36,36; .set x37,37; .set x38,38; .set x39,39
+.set x40,40; .set x41,41; .set x42,42; .set x43,43; .set x44,44
+.set x45,45; .set x46,46; .set x47,47; .set x48,48; .set x49,49
+.set x50,50; .set x51,51; .set x52,52; .set x53,53; .set x54,54
+.set x55,55; .set x56,56; .set x57,57; .set x58,58; .set x59,59
+.set x60,60; .set x61,61; .set x62,62; .set x63,63
+.set q0,0; .set q1,1; .set q2,2; .set q3,3; .set q4,4
+.set q5,5; .set q6,6; .set q7,7; .set q8,8; .set q9,9
+.set q10,10; .set q11,11; .set q12,12; .set q13,13; .set q14,14
+.set q15,15; .set q16,16; .set q17,17; .set q18,18; .set q19,19
+.set q20,20; .set q21,21; .set q22,22; .set q23,23; .set q24,24
+.set q25,25; .set q26,26; .set q27,27; .set q28,28; .set q29,29
+.set q30,30; .set q31,31
+.set MQ,0; .set XER,1; .set DSCR,3; .set FROM_RTCU,4; .set FROM_RTCL,5
+.set FROM_DEC,6; .set LR,8; .set CTR,9; .set AMR,13; .set TID,17; .set DSISR,18
+.set DAR,19; .set TO_RTCU,20; .set TO_RTCL,21; .set TO_DEC,22; .set SDR_0,24
+.set SDR_1,25; .set SRR_0,26; .set SRR_1,27
+.set BO_dCTR_NZERO_AND_NOT,0; .set BO_dCTR_NZERO_AND_NOT_1,1
+.set BO_dCTR_ZERO_AND_NOT,2; .set BO_dCTR_ZERO_AND_NOT_1,3
+.set BO_IF_NOT,4; .set BO_IF_NOT_1,5; .set BO_IF_NOT_2,6
+.set BO_IF_NOT_3,7; .set BO_dCTR_NZERO_AND,8; .set BO_dCTR_NZERO_AND_1,9
+.set BO_dCTR_ZERO_AND,10; .set BO_dCTR_ZERO_AND_1,11; .set BO_IF,12
+.set BO_IF_1,13; .set BO_IF_2,14; .set BO_IF_3,15; .set BO_dCTR_NZERO,16
+.set BO_dCTR_NZERO_1,17; .set BO_dCTR_ZERO,18; .set BO_dCTR_ZERO_1,19
+.set BO_ALWAYS,20; .set BO_ALWAYS_1,21; .set BO_ALWAYS_2,22
+.set BO_ALWAYS_3,23; .set BO_dCTR_NZERO_8,24; .set BO_dCTR_NZERO_9,25
+.set BO_dCTR_ZERO_8,26; .set BO_dCTR_ZERO_9,27; .set BO_ALWAYS_8,28
+.set BO_ALWAYS_9,29; .set BO_ALWAYS_10,30; .set BO_ALWAYS_11,31
+.set CR0_LT,0; .set CR0_GT,1; .set CR0_EQ,2; .set CR0_SO,3
+.set CR1_FX,4; .set CR1_FEX,5; .set CR1_VX,6; .set CR1_OX,7
+.set CR2_LT,8; .set CR2_GT,9; .set CR2_EQ,10; .set CR2_SO,11
+.set CR3_LT,12; .set CR3_GT,13; .set CR3_EQ,14; .set CR3_SO,15
+.set CR4_LT,16; .set CR4_GT,17; .set CR4_EQ,18; .set CR4_SO,19
+.set CR5_LT,20; .set CR5_GT,21; .set CR5_EQ,22; .set CR5_SO,23
+.set CR6_LT,24; .set CR6_GT,25; .set CR6_EQ,26; .set CR6_SO,27
+.set CR7_LT,28; .set CR7_GT,29; .set CR7_EQ,30; .set CR7_SO,31
+.set TO_LT,16; .set TO_GT,8; .set TO_EQ,4; .set TO_LLT,2; .set TO_LGT,1
+
+	.rename	H.10.NO_SYMBOL{PR},""
+	.rename	H.16.NO_SYMBOL{TC},""
+	.rename	H.18.NO_SYMBOL{RO},""
+	.rename	H.22.wrap__xlc_exception_handle{TC},"wrap__xlc_exception_handle"
+
+	.lglobl	H.10.NO_SYMBOL{PR}      
+	.globl	.wrap__xlc_exception_handle
+	.lglobl	H.18.NO_SYMBOL{RO}      
+	.globl	wrap__xlc_exception_handle{DS}
+	.extern	.printf{PR}             
+	.extern	.__xlc_exception_handle{PR}
+
+
+# .text section
+	.file	"t2.cpp","Mon Jan 30 12:53:50 2023 ","IBM XL C/C++ for AIX, Version 16.1.0.13"
+
+
+
+	.csect	H.10.NO_SYMBOL{PR}, 7   
+.wrap__xlc_exception_handle:            # 0x00000000 (H.10.NO_SYMBOL)
+	mfspr      r0,LR
+	st         r31,-4(SP)
+	st         r0,8(SP)
+	stu        SP,-64(SP)
+	l          r31,T.16.NO_SYMBOL(RTOC)
+	oril       r3,r31,0x0000
+	bl         .printf{PR}
+	oril       r0,r0,0x0000
+	bl         .__xlc_exception_handle{PR}
+	oril       r0,r0,0x0000
+	l          r0,72(SP)
+	mtspr      LR,r0
+	cal        SP,64(SP)
+	l          r31,-4(SP)
+	bcr        BO_ALWAYS,CR0_LT
+	.long	0x00000000
+# traceback table
+	.byte	0x00			# VERSION=0
+	.byte	0x09			# LANG=TB_CPLUSPLUS
+	.byte	0x20			# IS_GL=0,IS_EPROL=0,HAS_TBOFF=1
+					# INT_PROC=0,HAS_CTL=0,TOCLESS=0
+					# FP_PRESENT=0,LOG_ABORT=0
+	.byte	0x41			# INT_HNDL=0,NAME_PRESENT=1
+					# USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND
+					# SAVES_CR=0,SAVES_LR=1
+	.byte	0x80			# STORES_BC=1,FPR_SAVED=0
+	.byte	0x01			# GPR_SAVED=1
+	.byte	0x00			# FIXEDPARMS=0
+	.byte	0x01			# FLOATPARMS=0,PARMSONSTK=1
+	.long	0x0000003c		# TB_OFFSET
+	.short	26			# NAME_LEN
+	.byte	"wrap__xlc_exception_handle" # NAME
+
+# End of traceback table
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	H.10.NO_SYMBOL{PR}
+
+# .data section
+
+
+	.toc	                        # 0x00000080 
+T.22.wrap__xlc_exception_handle:
+	.tc	H.22.wrap__xlc_exception_handle{TC},wrap__xlc_exception_handle{DS}
+T.16.NO_SYMBOL:
+	.tc	H.16.NO_SYMBOL{TC},H.18.NO_SYMBOL{RO}
+
+
+	.csect	wrap__xlc_exception_handle{DS}
+	.long	.wrap__xlc_exception_handle# "\0\0\0\0"
+	.long	TOC{TC0}                # "\0\0\0\200"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	wrap__xlc_exception_handle{DS}
+
+
+	.csect	H.18.NO_SYMBOL{RO}, 3   
+	.long	0x77726170              # "wrap"
+	.long	0x5f5f786c              # "__xl"
+	.long	0x635f6578              # "c_ex"
+	.long	0x63657074              # "cept"
+	.long	0x696f6e5f              # "ion_"
+	.long	0x68616e64              # "hand"
+	.long	0x6c652063              # "le c"
+	.long	0x616c6c65              # "alle"
+# End	csect	H.18.NO_SYMBOL{RO}
+	.long	0x640a0000              # "d\n\0\0"
+
+
+
+# .bss section
+
+
+# dwarf sections
+
+# end dwarf sections
+#endif // defined(T2_CPP_CODE)

diff  --git a/libcxxabi/test/vendor/ibm/aix_xlclang_passing_excp_obj_64.pass.sh.S b/libcxxabi/test/vendor/ibm/aix_xlclang_passing_excp_obj_64.pass.sh.S
new file mode 100644
index 0000000000000..011f5ff796b1f
--- /dev/null
+++ b/libcxxabi/test/vendor/ibm/aix_xlclang_passing_excp_obj_64.pass.sh.S
@@ -0,0 +1,710 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Test that the exception object is passed correctly from the personality
+// to the landing pad even when there are wrappers around runtime function
+// __xlc_exception_handle. This test is only for the legacy AIX xlclang
+// compiler generated code. The test source consists of two C++ source files
+// t1.cpp and t2.cpp which are compiled into assembly code by the legacy AIX
+// xlclang++ compiler included in this file. This file tests for the 64-bit
+// mode.
+
+# REQUIRES: target=powerpc64-ibm-aix
+# UNSUPPORTED: no-exceptions
+
+// RUN: %{cxx} -c %s -o %t1_64.o -DT1_CPP_CODE %{flags} %{compile_flags}
+// RUN: %{cxx} -c %s -o %t2_64.o -DT2_CPP_CODE %{flags} %{compile_flags}
+// RUN: %{cxx} -o %t_64.exe %t1_64.o %t2_64.o %{flags} %{link_flags}
+// RUN: %{exec} %t_64.exe
+
+#if defined(T1_CPP_CODE)
+#
+# This portion of assembly code is generated by IBM legacy xlclang++ compiler
+# from the following C++ source file for 64-bit mode.
+#
+# t.cpp:
+#
+#extern "C" int printf(const char *, ...);
+#
+#extern "C" unsigned int * __xlc_exception_handle() __attribute__((weak, alias("wrap__xlc_exception_handle")));
+#
+#void barf() __attribute__((noinline));
+#
+#int main(void) {
+#   try {
+#      barf();
+#   } catch(int) {
+#      printf("caught int\n");
+#   }
+#   return 0;
+#}
+#
+#void barf() { throw 42; }
+
+.set r0,0; .set SP,1; .set RTOC,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31
+.set fp0,0; .set fp1,1; .set fp2,2; .set fp3,3; .set fp4,4
+.set fp5,5; .set fp6,6; .set fp7,7; .set fp8,8; .set fp9,9
+.set fp10,10; .set fp11,11; .set fp12,12; .set fp13,13; .set fp14,14
+.set fp15,15; .set fp16,16; .set fp17,17; .set fp18,18; .set fp19,19
+.set fp20,20; .set fp21,21; .set fp22,22; .set fp23,23; .set fp24,24
+.set fp25,25; .set fp26,26; .set fp27,27; .set fp28,28; .set fp29,29
+.set fp30,30; .set fp31,31
+.set v0,0; .set v1,1; .set v2,2; .set v3,3; .set v4,4
+.set v5,5; .set v6,6; .set v7,7; .set v8,8; .set v9,9
+.set v10,10; .set v11,11; .set v12,12; .set v13,13; .set v14,14
+.set v15,15; .set v16,16; .set v17,17; .set v18,18; .set v19,19
+.set v20,20; .set v21,21; .set v22,22; .set v23,23; .set v24,24
+.set v25,25; .set v26,26; .set v27,27; .set v28,28; .set v29,29
+.set v30,30; .set v31,31
+.set x0,0; .set x1,1; .set x2,2; .set x3,3; .set x4,4
+.set x5,5; .set x6,6; .set x7,7; .set x8,8; .set x9,9
+.set x10,10; .set x11,11; .set x12,12; .set x13,13; .set x14,14
+.set x15,15; .set x16,16; .set x17,17; .set x18,18; .set x19,19
+.set x20,20; .set x21,21; .set x22,22; .set x23,23; .set x24,24
+.set x25,25; .set x26,26; .set x27,27; .set x28,28; .set x29,29
+.set x30,30; .set x31,31; .set x32,32; .set x33,33; .set x34,34
+.set x35,35; .set x36,36; .set x37,37; .set x38,38; .set x39,39
+.set x40,40; .set x41,41; .set x42,42; .set x43,43; .set x44,44
+.set x45,45; .set x46,46; .set x47,47; .set x48,48; .set x49,49
+.set x50,50; .set x51,51; .set x52,52; .set x53,53; .set x54,54
+.set x55,55; .set x56,56; .set x57,57; .set x58,58; .set x59,59
+.set x60,60; .set x61,61; .set x62,62; .set x63,63
+.set q0,0; .set q1,1; .set q2,2; .set q3,3; .set q4,4
+.set q5,5; .set q6,6; .set q7,7; .set q8,8; .set q9,9
+.set q10,10; .set q11,11; .set q12,12; .set q13,13; .set q14,14
+.set q15,15; .set q16,16; .set q17,17; .set q18,18; .set q19,19
+.set q20,20; .set q21,21; .set q22,22; .set q23,23; .set q24,24
+.set q25,25; .set q26,26; .set q27,27; .set q28,28; .set q29,29
+.set q30,30; .set q31,31
+.set MQ,0; .set XER,1; .set DSCR,3; .set FROM_RTCU,4; .set FROM_RTCL,5
+.set FROM_DEC,6; .set LR,8; .set CTR,9; .set AMR,13; .set TID,17; .set DSISR,18
+.set DAR,19; .set TO_RTCU,20; .set TO_RTCL,21; .set TO_DEC,22; .set SDR_0,24
+.set SDR_1,25; .set SRR_0,26; .set SRR_1,27
+.set BO_dCTR_NZERO_AND_NOT,0; .set BO_dCTR_NZERO_AND_NOT_1,1
+.set BO_dCTR_ZERO_AND_NOT,2; .set BO_dCTR_ZERO_AND_NOT_1,3
+.set BO_IF_NOT,4; .set BO_IF_NOT_1,5; .set BO_IF_NOT_2,6
+.set BO_IF_NOT_3,7; .set BO_dCTR_NZERO_AND,8; .set BO_dCTR_NZERO_AND_1,9
+.set BO_dCTR_ZERO_AND,10; .set BO_dCTR_ZERO_AND_1,11; .set BO_IF,12
+.set BO_IF_1,13; .set BO_IF_2,14; .set BO_IF_3,15; .set BO_dCTR_NZERO,16
+.set BO_dCTR_NZERO_1,17; .set BO_dCTR_ZERO,18; .set BO_dCTR_ZERO_1,19
+.set BO_ALWAYS,20; .set BO_ALWAYS_1,21; .set BO_ALWAYS_2,22
+.set BO_ALWAYS_3,23; .set BO_dCTR_NZERO_8,24; .set BO_dCTR_NZERO_9,25
+.set BO_dCTR_ZERO_8,26; .set BO_dCTR_ZERO_9,27; .set BO_ALWAYS_8,28
+.set BO_ALWAYS_9,29; .set BO_ALWAYS_10,30; .set BO_ALWAYS_11,31
+.set CR0_LT,0; .set CR0_GT,1; .set CR0_EQ,2; .set CR0_SO,3
+.set CR1_FX,4; .set CR1_FEX,5; .set CR1_VX,6; .set CR1_OX,7
+.set CR2_LT,8; .set CR2_GT,9; .set CR2_EQ,10; .set CR2_SO,11
+.set CR3_LT,12; .set CR3_GT,13; .set CR3_EQ,14; .set CR3_SO,15
+.set CR4_LT,16; .set CR4_GT,17; .set CR4_EQ,18; .set CR4_SO,19
+.set CR5_LT,20; .set CR5_GT,21; .set CR5_EQ,22; .set CR5_SO,23
+.set CR6_LT,24; .set CR6_GT,25; .set CR6_EQ,26; .set CR6_SO,27
+.set CR7_LT,28; .set CR7_GT,29; .set CR7_EQ,30; .set CR7_SO,31
+.set TO_LT,16; .set TO_GT,8; .set TO_EQ,4; .set TO_LLT,2; .set TO_LGT,1
+
+	.rename	H.4.NO_SYMBOL{PR},""
+	.rename	H.10..__4,".__4"
+	.rename	H.12..__8,".__8"
+	.rename	H.14..__3,".__3"
+	.rename	H.18.NO_SYMBOL{TC},""
+	.rename	H.20.NO_SYMBOL{RO},""
+	.rename	E.22.__STATIC{RW},"_$STATIC"
+	.rename	H.24.__STATIC{TC},"_$STATIC"
+	.rename	H.28.__4{TC},"__4"
+	.rename	H.32.__8{TC},"__8"
+	.rename	H.36.__3{TC},"__3"
+	.rename	H.40._Z4barfv{TC},"_Z4barfv"
+	.rename	H.44._ZTIi{TC},"_ZTIi"
+	.rename	H.48.main{TC},"main"
+
+	.lglobl	H.4.NO_SYMBOL{PR}       
+	.globl	._Z4barfv               
+	.globl	.main                   
+	.lglobl	H.10..__4               
+	.lglobl	H.12..__8               
+	.lglobl	H.14..__3               
+	.lglobl	H.20.NO_SYMBOL{RO}      
+	.lglobl	E.22.__STATIC{RW}       
+	.lglobl	__4{DS}                 
+	.lglobl	__8{DS}                 
+	.lglobl	__3{DS}                 
+	.globl	_Z4barfv{DS}            
+	.extern	_ZTIi{UA}               
+	.globl	main{DS}                
+	.extern	.__cxa_allocate_exception{PR}
+	.extern	.__cxa_throw{PR}        
+	.extern	.wrap__xlc_exception_handle{PR}
+	.extern	.__xlc_catch_matchv2{PR}
+	.extern	.__cxa_begin_catch{PR}  
+	.extern	.printf{PR}             
+	.extern	.__cxa_end_catch{PR}    
+	.extern	._Unwind_Resume{PR}     
+	.extern	.__cxa_rethrow{PR}      
+	.extern	._ZSt9terminatev{PR}    
+
+
+# .text section
+	.file	"t.cpp","Mon Jan 30 13:42:03 2023 ","IBM XL C/C++ for AIX, Version 16.1.0.13"
+	.machine	"ppc64"
+
+
+	.csect	H.4.NO_SYMBOL{PR}, 7    
+._Z4barfv:                              # 0x0000000000000000 (H.4.NO_SYMBOL)
+	mfspr      r0,LR
+	stdu       SP,-128(SP)
+	std        r0,144(SP)
+	addi       r3,r0,4
+	bl         .__cxa_allocate_exception{PR}
+	ori        r0,r0,0x0000
+	ori        r4,r3,0x0000
+	std        r4,112(SP)
+	addi       r3,r0,42
+	stw        r3,0(r4)
+	ld         r3,112(SP)
+	ld         r4,T.44._ZTIi(RTOC)
+	addi       r5,r0,0
+	bl         .__cxa_throw{PR}
+	ori        r0,r0,0x0000
+	ld         r0,144(SP)
+	mtspr      LR,r0
+	addi       SP,SP,128
+	bclr       BO_ALWAYS,CR0_LT
+	.long	0x00000000
+# traceback table
+	.byte	0x00			# VERSION=0
+	.byte	0x09			# LANG=TB_CPLUSPLUS
+	.byte	0x20			# IS_GL=0,IS_EPROL=0,HAS_TBOFF=1
+					# INT_PROC=0,HAS_CTL=0,TOCLESS=0
+					# FP_PRESENT=0,LOG_ABORT=0
+	.byte	0x41			# INT_HNDL=0,NAME_PRESENT=1
+					# USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND
+					# SAVES_CR=0,SAVES_LR=1
+	.byte	0x80			# STORES_BC=1,FPR_SAVED=0
+	.byte	0x00			# GPR_SAVED=0
+	.byte	0x00			# FIXEDPARMS=0
+	.byte	0x01			# FLOATPARMS=0,PARMSONSTK=1
+	.long	0x0000004c		# TB_OFFSET
+	.short	8			# NAME_LEN
+	.byte	"_Z4barfv"              # NAME
+
+	.byte	0			# padding
+	.byte	0			# padding
+# End of traceback table
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+.main:                                  # 0x0000000000000080 (H.4.NO_SYMBOL+0x080)
+	mfspr      r0,LR
+	std        r31,-8(SP)
+	std        r30,-16(SP)
+	std        r29,-24(SP)
+	std        r0,16(SP)
+	stdu       SP,-208(SP)
+	ori        r30,SP,0x0000
+	ld         r31,T.24.__STATIC(RTOC)
+	ld         r29,T.18.NO_SYMBOL(RTOC)
+	addi       r3,r0,0
+	stw        r3,112(r30)
+	ori        r4,r31,0x0000
+	std        r4,120(r30)
+	std        r3,128(r30)
+	stw        r3,136(r30)
+	addi       r3,r0,1
+	stb        r3,115(r30)
+	bl         ._Z4barfv
+	addi       r3,r0,0
+	stb        r3,115(r30)
+	b          __L188
+__Ld4:                                  # 0x00000000000000d4 (H.4.NO_SYMBOL+0x0d4)
+	ld         r31,T.24.__STATIC(RTOC)
+	ld         r29,T.18.NO_SYMBOL(RTOC)
+	addi       r3,r0,2
+	stb        r3,115(r30)
+	bl         .wrap__xlc_exception_handle{PR}
+	ori        r0,r0,0x0000
+	std        r3,144(r30)
+	ld         r4,T.44._ZTIi(RTOC)
+	addi       r5,r30,152
+	bl         .__xlc_catch_matchv2{PR}
+	ori        r0,r0,0x0000
+	cmpli      0,0,r3,0x0000
+	bc         BO_IF_NOT,CR0_EQ,__L10c
+	b          __L164
+__L10c:                                 # 0x000000000000010c (H.4.NO_SYMBOL+0x010c)
+	ld         r3,144(r30)
+	bl         .__cxa_begin_catch{PR}
+	ori        r0,r0,0x0000
+	ori        r3,r29,0x0000
+	bl         .printf{PR}
+	ori        r0,r0,0x0000
+	bl         .__cxa_end_catch{PR}
+	ori        r0,r0,0x0000
+	addi       r3,r0,0
+	stb        r3,115(r30)
+	b          __L188
+__L138:                                 # 0x0000000000000138 (H.4.NO_SYMBOL+0x0138)
+	ld         r31,T.24.__STATIC(RTOC)
+	ld         r29,T.18.NO_SYMBOL(RTOC)
+	bl         .__cxa_end_catch{PR}
+	ori        r0,r0,0x0000
+	addi       r3,r0,0
+	stb        r3,115(r30)
+	bl         .wrap__xlc_exception_handle{PR}
+	ori        r0,r0,0x0000
+	std        r3,160(r30)
+	bl         ._Unwind_Resume{PR}
+	ori        r0,r0,0x0000
+__L164:                                 # 0x0000000000000164 (H.4.NO_SYMBOL+0x0164)
+	addi       r3,r0,2
+	stb        r3,115(r30)
+	bl         .wrap__xlc_exception_handle{PR}
+	ori        r0,r0,0x0000
+	std        r3,168(r30)
+	bl         .__cxa_begin_catch{PR}
+	ori        r0,r0,0x0000
+	bl         .__cxa_rethrow{PR}
+	ori        r0,r0,0x0000
+__L188:                                 # 0x0000000000000188 (H.4.NO_SYMBOL+0x0188)
+	addi       r3,r0,0
+	b          __L1b8
+__L190:                                 # 0x0000000000000190 (H.4.NO_SYMBOL+0x0190)
+	bl         .wrap__xlc_exception_handle{PR}
+	ori        r0,r0,0x0000
+	std        r3,176(r30)
+	bl         ._Unwind_Resume{PR}
+	ori        r0,r0,0x0000
+__L1a4:                                 # 0x00000000000001a4 (H.4.NO_SYMBOL+0x01a4)
+	ld         r31,T.24.__STATIC(RTOC)
+	ld         r29,T.18.NO_SYMBOL(RTOC)
+	bl         ._ZSt9terminatev{PR}
+	ori        r0,r0,0x0000
+	b          __L190
+__L1b8:                                 # 0x00000000000001b8 (H.4.NO_SYMBOL+0x01b8)
+	ld         SP,0(SP)
+	ld         r29,-24(SP)
+	ld         r30,-16(SP)
+	ld         r31,-8(SP)
+	ld         r0,16(SP)
+	mtspr      LR,r0
+	bclr       BO_ALWAYS,CR0_LT
+	.long	0x00000000
+# traceback table
+	.byte	0x00			# VERSION=0
+	.byte	0x09			# LANG=TB_CPLUSPLUS
+	.byte	0x28			# IS_GL=0,IS_EPROL=0,HAS_TBOFF=1
+					# INT_PROC=0,HAS_CTL=1,TOCLESS=0
+					# FP_PRESENT=0,LOG_ABORT=0
+	.byte	0x61			# INT_HNDL=0,NAME_PRESENT=1
+					# USES_ALLOCA=1,CL_DIS_INV=WALK_ONCOND
+					# SAVES_CR=0,SAVES_LR=1
+	.byte	0x80			# STORES_BC=1,FPR_SAVED=0
+	.byte	0x03			# GPR_SAVED=3
+	.byte	0x00			# FIXEDPARMS=0
+	.byte	0x01			# FLOATPARMS=0,PARMSONSTK=1
+	.long	0x00000154		# TB_OFFSET
+	.long	0x00000001		# NUM_CTL_INFO
+	.long	0x00000070		# ctl_info_disp[0]
+	.short	4			# NAME_LEN
+	.byte	"main"                  # NAME
+
+	.byte	30			# ALLOCA_REG
+	.byte	0			# padding
+# End of traceback table
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+H.10..__4:                              # 0x0000000000000200 (H.4.NO_SYMBOL+0x0200)
+	b          __L1a4
+	bclr       BO_ALWAYS,CR0_LT
+	.long	0x00000000
+# traceback table
+	.byte	0x00			# VERSION=0
+	.byte	0x09			# LANG=TB_CPLUSPLUS
+	.byte	0x20			# IS_GL=0,IS_EPROL=0,HAS_TBOFF=1
+					# INT_PROC=0,HAS_CTL=0,TOCLESS=0
+					# FP_PRESENT=0,LOG_ABORT=0
+	.byte	0x40			# INT_HNDL=0,NAME_PRESENT=1
+					# USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND
+					# SAVES_CR=0,SAVES_LR=0
+	.byte	0x00			# STORES_BC=0,FPR_SAVED=0
+	.byte	0x00			# GPR_SAVED=0
+	.byte	0x00			# FIXEDPARMS=0
+	.byte	0x01			# FLOATPARMS=0,PARMSONSTK=1
+	.long	0x00000008		# TB_OFFSET
+	.short	3			# NAME_LEN
+	.byte	"__4"                   # NAME
+
+	.byte	0			# padding
+	.byte	0			# padding
+	.byte	0			# padding
+# End of traceback table
+H.12..__8:                              # 0x0000000000000220 (H.4.NO_SYMBOL+0x0220)
+	b          __L138
+	bclr       BO_ALWAYS,CR0_LT
+	.long	0x00000000
+# traceback table
+	.byte	0x00			# VERSION=0
+	.byte	0x09			# LANG=TB_CPLUSPLUS
+	.byte	0x20			# IS_GL=0,IS_EPROL=0,HAS_TBOFF=1
+					# INT_PROC=0,HAS_CTL=0,TOCLESS=0
+					# FP_PRESENT=0,LOG_ABORT=0
+	.byte	0x40			# INT_HNDL=0,NAME_PRESENT=1
+					# USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND
+					# SAVES_CR=0,SAVES_LR=0
+	.byte	0x00			# STORES_BC=0,FPR_SAVED=0
+	.byte	0x00			# GPR_SAVED=0
+	.byte	0x00			# FIXEDPARMS=0
+	.byte	0x01			# FLOATPARMS=0,PARMSONSTK=1
+	.long	0x00000008		# TB_OFFSET
+	.short	3			# NAME_LEN
+	.byte	"__8"                   # NAME
+
+	.byte	0			# padding
+	.byte	0			# padding
+	.byte	0			# padding
+# End of traceback table
+H.14..__3:                              # 0x0000000000000240 (H.4.NO_SYMBOL+0x0240)
+	b          __Ld4
+	bclr       BO_ALWAYS,CR0_LT
+	.long	0x00000000
+# traceback table
+	.byte	0x00			# VERSION=0
+	.byte	0x09			# LANG=TB_CPLUSPLUS
+	.byte	0x20			# IS_GL=0,IS_EPROL=0,HAS_TBOFF=1
+					# INT_PROC=0,HAS_CTL=0,TOCLESS=0
+					# FP_PRESENT=0,LOG_ABORT=0
+	.byte	0x40			# INT_HNDL=0,NAME_PRESENT=1
+					# USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND
+					# SAVES_CR=0,SAVES_LR=0
+	.byte	0x00			# STORES_BC=0,FPR_SAVED=0
+	.byte	0x00			# GPR_SAVED=0
+	.byte	0x00			# FIXEDPARMS=0
+	.byte	0x01			# FLOATPARMS=0,PARMSONSTK=1
+	.long	0x00000008		# TB_OFFSET
+	.short	3			# NAME_LEN
+	.byte	"__3"                   # NAME
+
+	.byte	0			# padding
+	.byte	0			# padding
+	.byte	0			# padding
+# End of traceback table
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	H.4.NO_SYMBOL{PR}
+
+# .data section
+
+
+	.toc	                        # 0x0000000000000280 
+T.40._Z4barfv:
+	.tc	H.40._Z4barfv{TC},_Z4barfv{DS}
+T.44._ZTIi:
+	.tc	H.44._ZTIi{TC},_ZTIi{UA}
+T.48.main:
+	.tc	H.48.main{TC},main{DS}  
+T.24.__STATIC:
+	.tc	H.24.__STATIC{TC},E.22.__STATIC{RW}
+T.18.NO_SYMBOL:
+	.tc	H.18.NO_SYMBOL{TC},H.20.NO_SYMBOL{RO}
+T.28.__4:
+	.tc	H.28.__4{TC},__4{DS}    
+T.32.__8:
+	.tc	H.32.__8{TC},__8{DS}    
+T.36.__3:
+	.tc	H.36.__3{TC},__3{DS}    
+
+
+	.csect	_Z4barfv{DS}, 3         
+	.llong	._Z4barfv               # "\0\0\0\0\0\0\0\0"
+	.llong	TOC{TC0}                # "\0\0\0\0\0\0\002\200"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	_Z4barfv{DS}
+
+
+	.csect	main{DS}, 3             
+	.llong	.main                   # "\0\0\0\0\0\0\0\200"
+	.llong	TOC{TC0}                # "\0\0\0\0\0\0\002\200"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	main{DS}
+
+
+	.csect	__4{DS}, 3              
+	.llong	H.10..__4               # "\0\0\0\0\0\0\002\0"
+	.llong	TOC{TC0}                # "\0\0\0\0\0\0\002\200"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	__4{DS}
+
+
+	.csect	__8{DS}, 3              
+	.llong	H.12..__8               # "\0\0\0\0\0\0\002 "
+	.llong	TOC{TC0}                # "\0\0\0\0\0\0\002\200"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	__8{DS}
+
+
+	.csect	__3{DS}, 3              
+	.llong	H.14..__3               # "\0\0\0\0\0\0\002@"
+	.llong	TOC{TC0}                # "\0\0\0\0\0\0\002\200"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	__3{DS}
+
+
+	.csect	E.22.__STATIC{RW}, 3    
+	.long	0x1cedbeef              # "\034\355\276\357"
+	.long	0x00000003              # "\0\0\0\003"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.llong	__3{DS}                 # "\0\0\0\0\0\0\003 "
+	.long	0xffffffff              # "\377\377\377\377"
+	.long	0xffffffff              # "\377\377\377\377"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.llong	__8{DS}                 # "\0\0\0\0\0\0\003\b"
+	.long	0xffffffff              # "\377\377\377\377"
+	.long	0xfffffffe              # "\377\377\377\376"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.llong	__4{DS}                 # "\0\0\0\0\0\0\002\360"
+	.long	0xffffffff              # "\377\377\377\377"
+	.long	0xfffffffc              # "\377\377\377\374"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	E.22.__STATIC{RW}
+
+
+	.csect	H.20.NO_SYMBOL{RO}, 3   
+	.long	0x63617567              # "caug"
+	.long	0x68742069              # "ht i"
+	.long	0x6e740a00              # "nt\n\0"
+# End	csect	H.20.NO_SYMBOL{RO}
+	.long	0x00000000              # "\0\0\0\0"
+
+
+
+# .bss section
+
+
+# dwarf sections
+
+# end dwarf sections
+#endif // defined(T1_CPP_CODE)
+
+#if defined(T2_CPP_CODE)
+#
+# This portion of assembly code is generated by IBM legacy xlclang++ compiler
+# from the following C++ source file for 64-bit mode.
+#
+# t2.cpp
+#
+#extern "C" int printf(const char *, ...);
+#
+#extern "C" unsigned int * __xlc_exception_handle();
+#
+#extern "C" unsigned int * wrap__xlc_exception_handle() {
+#  printf("wrap__xlc_exception_handle called\n");
+#  return __xlc_exception_handle();
+#}
+#
+.set r0,0; .set SP,1; .set RTOC,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31
+.set fp0,0; .set fp1,1; .set fp2,2; .set fp3,3; .set fp4,4
+.set fp5,5; .set fp6,6; .set fp7,7; .set fp8,8; .set fp9,9
+.set fp10,10; .set fp11,11; .set fp12,12; .set fp13,13; .set fp14,14
+.set fp15,15; .set fp16,16; .set fp17,17; .set fp18,18; .set fp19,19
+.set fp20,20; .set fp21,21; .set fp22,22; .set fp23,23; .set fp24,24
+.set fp25,25; .set fp26,26; .set fp27,27; .set fp28,28; .set fp29,29
+.set fp30,30; .set fp31,31
+.set v0,0; .set v1,1; .set v2,2; .set v3,3; .set v4,4
+.set v5,5; .set v6,6; .set v7,7; .set v8,8; .set v9,9
+.set v10,10; .set v11,11; .set v12,12; .set v13,13; .set v14,14
+.set v15,15; .set v16,16; .set v17,17; .set v18,18; .set v19,19
+.set v20,20; .set v21,21; .set v22,22; .set v23,23; .set v24,24
+.set v25,25; .set v26,26; .set v27,27; .set v28,28; .set v29,29
+.set v30,30; .set v31,31
+.set x0,0; .set x1,1; .set x2,2; .set x3,3; .set x4,4
+.set x5,5; .set x6,6; .set x7,7; .set x8,8; .set x9,9
+.set x10,10; .set x11,11; .set x12,12; .set x13,13; .set x14,14
+.set x15,15; .set x16,16; .set x17,17; .set x18,18; .set x19,19
+.set x20,20; .set x21,21; .set x22,22; .set x23,23; .set x24,24
+.set x25,25; .set x26,26; .set x27,27; .set x28,28; .set x29,29
+.set x30,30; .set x31,31; .set x32,32; .set x33,33; .set x34,34
+.set x35,35; .set x36,36; .set x37,37; .set x38,38; .set x39,39
+.set x40,40; .set x41,41; .set x42,42; .set x43,43; .set x44,44
+.set x45,45; .set x46,46; .set x47,47; .set x48,48; .set x49,49
+.set x50,50; .set x51,51; .set x52,52; .set x53,53; .set x54,54
+.set x55,55; .set x56,56; .set x57,57; .set x58,58; .set x59,59
+.set x60,60; .set x61,61; .set x62,62; .set x63,63
+.set q0,0; .set q1,1; .set q2,2; .set q3,3; .set q4,4
+.set q5,5; .set q6,6; .set q7,7; .set q8,8; .set q9,9
+.set q10,10; .set q11,11; .set q12,12; .set q13,13; .set q14,14
+.set q15,15; .set q16,16; .set q17,17; .set q18,18; .set q19,19
+.set q20,20; .set q21,21; .set q22,22; .set q23,23; .set q24,24
+.set q25,25; .set q26,26; .set q27,27; .set q28,28; .set q29,29
+.set q30,30; .set q31,31
+.set MQ,0; .set XER,1; .set DSCR,3; .set FROM_RTCU,4; .set FROM_RTCL,5
+.set FROM_DEC,6; .set LR,8; .set CTR,9; .set AMR,13; .set TID,17; .set DSISR,18
+.set DAR,19; .set TO_RTCU,20; .set TO_RTCL,21; .set TO_DEC,22; .set SDR_0,24
+.set SDR_1,25; .set SRR_0,26; .set SRR_1,27
+.set BO_dCTR_NZERO_AND_NOT,0; .set BO_dCTR_NZERO_AND_NOT_1,1
+.set BO_dCTR_ZERO_AND_NOT,2; .set BO_dCTR_ZERO_AND_NOT_1,3
+.set BO_IF_NOT,4; .set BO_IF_NOT_1,5; .set BO_IF_NOT_2,6
+.set BO_IF_NOT_3,7; .set BO_dCTR_NZERO_AND,8; .set BO_dCTR_NZERO_AND_1,9
+.set BO_dCTR_ZERO_AND,10; .set BO_dCTR_ZERO_AND_1,11; .set BO_IF,12
+.set BO_IF_1,13; .set BO_IF_2,14; .set BO_IF_3,15; .set BO_dCTR_NZERO,16
+.set BO_dCTR_NZERO_1,17; .set BO_dCTR_ZERO,18; .set BO_dCTR_ZERO_1,19
+.set BO_ALWAYS,20; .set BO_ALWAYS_1,21; .set BO_ALWAYS_2,22
+.set BO_ALWAYS_3,23; .set BO_dCTR_NZERO_8,24; .set BO_dCTR_NZERO_9,25
+.set BO_dCTR_ZERO_8,26; .set BO_dCTR_ZERO_9,27; .set BO_ALWAYS_8,28
+.set BO_ALWAYS_9,29; .set BO_ALWAYS_10,30; .set BO_ALWAYS_11,31
+.set CR0_LT,0; .set CR0_GT,1; .set CR0_EQ,2; .set CR0_SO,3
+.set CR1_FX,4; .set CR1_FEX,5; .set CR1_VX,6; .set CR1_OX,7
+.set CR2_LT,8; .set CR2_GT,9; .set CR2_EQ,10; .set CR2_SO,11
+.set CR3_LT,12; .set CR3_GT,13; .set CR3_EQ,14; .set CR3_SO,15
+.set CR4_LT,16; .set CR4_GT,17; .set CR4_EQ,18; .set CR4_SO,19
+.set CR5_LT,20; .set CR5_GT,21; .set CR5_EQ,22; .set CR5_SO,23
+.set CR6_LT,24; .set CR6_GT,25; .set CR6_EQ,26; .set CR6_SO,27
+.set CR7_LT,28; .set CR7_GT,29; .set CR7_EQ,30; .set CR7_SO,31
+.set TO_LT,16; .set TO_GT,8; .set TO_EQ,4; .set TO_LLT,2; .set TO_LGT,1
+
+	.rename	H.4.NO_SYMBOL{PR},""
+	.rename	H.10.NO_SYMBOL{TC},""
+	.rename	H.12.NO_SYMBOL{RO},""
+	.rename	H.16.wrap__xlc_exception_handle{TC},"wrap__xlc_exception_handle"
+
+	.lglobl	H.4.NO_SYMBOL{PR}       
+	.globl	.wrap__xlc_exception_handle
+	.lglobl	H.12.NO_SYMBOL{RO}      
+	.globl	wrap__xlc_exception_handle{DS}
+	.extern	.printf{PR}             
+	.extern	.__xlc_exception_handle{PR}
+
+
+# .text section
+	.file	"t2.cpp","Mon Jan 30 13:41:54 2023 ","IBM XL C/C++ for AIX, Version 16.1.0.13"
+	.machine	"ppc64"
+
+
+	.csect	H.4.NO_SYMBOL{PR}, 7    
+.wrap__xlc_exception_handle:            # 0x0000000000000000 (H.4.NO_SYMBOL)
+	mfspr      r0,LR
+	std        r31,-8(SP)
+	std        r0,16(SP)
+	stdu       SP,-128(SP)
+	ld         r31,T.10.NO_SYMBOL(RTOC)
+	ori        r3,r31,0x0000
+	bl         .printf{PR}
+	ori        r0,r0,0x0000
+	bl         .__xlc_exception_handle{PR}
+	ori        r0,r0,0x0000
+	ld         r0,144(SP)
+	mtspr      LR,r0
+	addi       SP,SP,128
+	ld         r31,-8(SP)
+	bclr       BO_ALWAYS,CR0_LT
+	.long	0x00000000
+# traceback table
+	.byte	0x00			# VERSION=0
+	.byte	0x09			# LANG=TB_CPLUSPLUS
+	.byte	0x20			# IS_GL=0,IS_EPROL=0,HAS_TBOFF=1
+					# INT_PROC=0,HAS_CTL=0,TOCLESS=0
+					# FP_PRESENT=0,LOG_ABORT=0
+	.byte	0x41			# INT_HNDL=0,NAME_PRESENT=1
+					# USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND
+					# SAVES_CR=0,SAVES_LR=1
+	.byte	0x80			# STORES_BC=1,FPR_SAVED=0
+	.byte	0x01			# GPR_SAVED=1
+	.byte	0x00			# FIXEDPARMS=0
+	.byte	0x01			# FLOATPARMS=0,PARMSONSTK=1
+	.long	0x0000003c		# TB_OFFSET
+	.short	26			# NAME_LEN
+	.byte	"wrap__xlc_exception_handle" # NAME
+
+# End of traceback table
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	H.4.NO_SYMBOL{PR}
+
+# .data section
+
+
+	.toc	                        # 0x0000000000000080 
+T.16.wrap__xlc_exception_handle:
+	.tc	H.16.wrap__xlc_exception_handle{TC},wrap__xlc_exception_handle{DS}
+T.10.NO_SYMBOL:
+	.tc	H.10.NO_SYMBOL{TC},H.12.NO_SYMBOL{RO}
+
+
+	.csect	wrap__xlc_exception_handle{DS}, 3
+	.llong	.wrap__xlc_exception_handle# "\0\0\0\0\0\0\0\0"
+	.llong	TOC{TC0}                # "\0\0\0\0\0\0\0\200"
+	.long	0x00000000              # "\0\0\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+# End	csect	wrap__xlc_exception_handle{DS}
+
+
+	.csect	H.12.NO_SYMBOL{RO}, 3   
+	.long	0x77726170              # "wrap"
+	.long	0x5f5f786c              # "__xl"
+	.long	0x635f6578              # "c_ex"
+	.long	0x63657074              # "cept"
+	.long	0x696f6e5f              # "ion_"
+	.long	0x68616e64              # "hand"
+	.long	0x6c652063              # "le c"
+	.long	0x616c6c65              # "alle"
+# End	csect	H.12.NO_SYMBOL{RO}
+	.long	0x640a0000              # "d\n\0\0"
+	.long	0x00000000              # "\0\0\0\0"
+
+
+
+# .bss section
+
+
+# dwarf sections
+
+# end dwarf sections
+
+#endif // defined(T2_CPP_CODE)


        


More information about the libcxx-commits mailing list