# REQUIRES: lldb-formatters-compatibility # # RUN: split-file %s %t # RUN: lldb -x \ # RUN: -o 'command script import %llvm_src_root/utils/lldbDataFormatters.py' \ # RUN: -s %t/commands.input %llvm_tools_dir/check-lldb-llvm-support-pointer-union \ # RUN: -o quit \ # RUN: | FileCheck %t/checks #--- commands.input break set -p "Break here" run p &f p &a p &z p &derived p &dv v -T z_float v -T raw_z_float v -T null_float v -T long_int_float v -T z_only v -T union_int_pair p z_float.Pointer p union_int_pair.Pointer p union_int_pair.Pointer.Pointer continue v -T z_float continue v -T virtual_float p virtual_float.Pointer continue p &local v -T local_float continue p &a4_0 p &a8_0 v -T varwidth v -T varwidth_tier1 #--- checks # CHECK: (lldb) p &f # CHECK-NEXT: (float *) [[PTR_F:0x[0-9a-zA-Z]+]] # CHECK: (lldb) p &a # CHECK-NEXT: (int *) [[PTR_A:0x[0-9a-zA-Z]+]] # CHECK: (lldb) p &z # CHECK-NEXT: (Z *) [[PTR_Z:0x[0-9a-zA-Z]+]] # CHECK: (lldb) p &derived # CHECK-NEXT: (Derived *) [[PTR_DERIVED:0x[0-9a-zA-Z]+]] # CHECK: (lldb) p &dv # CHECK-NEXT: (DerivedWithVirtual *) [[PTR_DV:0x[0-9a-zA-Z]+]] # CHECK: (lldb) v -T z_float # CHECK-NEXT: (llvm::PointerUnion) z_float = { # CHECK-NEXT: (float *) Pointer = [[PTR_F]] # CHECK-NEXT: } # CHECK: (lldb) v -T raw_z_float # CHECK-NEXT: (llvm::PointerUnion) raw_z_float = { # CHECK-NEXT: (Z *) Pointer = nullptr # CHECK-NEXT: } # null float* has non-zero raw_value (tag=1), pointer component=0. # LLDB renders this as an address literal rather than nullptr. # CHECK: (lldb) v -T null_float # CHECK-NEXT: (llvm::PointerUnion) null_float = { # CHECK-NEXT: (float *) Pointer = 0x{{0+}} # CHECK-NEXT: } # CHECK: (lldb) v -T long_int_float # CHECK-NEXT: (llvm::PointerUnion) long_int_float = { # CHECK-NEXT: (int *) Pointer = [[PTR_A]] # CHECK-NEXT: } # CHECK: (lldb) v -T z_only # CHECK-NEXT: (llvm::PointerUnion) z_only = { # CHECK-NEXT: (Z *) Pointer = [[PTR_Z]] # CHECK-NEXT: } # CHECK: (lldb) v -T union_int_pair # CHECK-NEXT: (llvm::PointerIntPair, 1>) union_int_pair = { # CHECK-NEXT: (llvm::PointerUnion) Pointer = { # CHECK-NEXT: (float *) Pointer = [[PTR_F]] # CHECK-NEXT: } # CHECK-NEXT: (unsigned int) Int = 1 # CHECK-NEXT: } # CHECK: (lldb) p z_float.Pointer # CHECK-NEXT: (float *) [[PTR_F]] # CHECK: (lldb) p union_int_pair.Pointer # CHECK-NEXT: (llvm::PointerUnion) { # CHECK-NEXT: Pointer = [[PTR_F]] # CHECK-NEXT: } # CHECK: (lldb) p union_int_pair.Pointer.Pointer # CHECK-NEXT: (float *) [[PTR_F]] # CHECK: (lldb) v -T z_float # CHECK-NEXT: (llvm::PointerUnion) z_float = { # CHECK-NEXT: (Z *) Pointer = [[PTR_DERIVED]] # CHECK-NEXT: } # CHECK: (lldb) v -T virtual_float # CHECK-NEXT: (llvm::PointerUnion) virtual_float = { # CHECK-NEXT: (DerivedWithVirtual *) Pointer = [[PTR_DV]] # CHECK-NEXT: } # CHECK: (lldb) p virtual_float.Pointer # CHECK-NEXT: (DerivedWithVirtual *) [[PTR_DV]] # CHECK: (lldb) p &local # CHECK-NEXT: (Local *) [[PTR_LOCAL:0x[0-9a-zA-Z]+]] # CHECK: (lldb) v -T local_float # CHECK-NEXT: (llvm::PointerUnion) local_float = { # CHECK-NEXT: (Local *) Pointer = [[PTR_LOCAL]] # CHECK-NEXT: } # CHECK: (lldb) p &a4_0 # CHECK-NEXT: (Align4<0> *) [[PTR_A4:0x[0-9a-zA-Z]+]] # CHECK: (lldb) p &a8_0 # CHECK-NEXT: (Align8<0> *) [[PTR_A8:0x[0-9a-zA-Z]+]] # Variable-width tag encoding: formatter falls back to void* with # tag bits stripped, since fixed-width decoding doesn't apply. # CHECK: (lldb) v -T varwidth # CHECK-NEXT: (llvm::PointerUnion *, Align4<1> *, Align4<2> *, Align8<0> *, Align8<1> *>) varwidth = { # CHECK-NEXT: (void *) Pointer = [[PTR_A4]] # CHECK-NEXT: } # CHECK: (lldb) v -T varwidth_tier1 # CHECK-NEXT: (llvm::PointerUnion *, Align4<1> *, Align4<2> *, Align8<0> *, Align8<1> *>) varwidth_tier1 = { # CHECK-NEXT: (void *) Pointer = [[PTR_A8]] # CHECK-NEXT: }