# RUN: yaml2obj %s -o %t.dSYM

## Verify that we don't keep merged functions by default
# RUN: llvm-gsymutil --num-threads=1 --convert %t.dSYM --out-file=%t.default.gSYM
# RUN: llvm-gsymutil --verify --verbose %t.default.gSYM | FileCheck --check-prefix=CHECK-GSYM-DEFAULT %s

## Verify that we keep merged functions when specyfing --merged-functions
# RUN: llvm-gsymutil --num-threads=1 --convert %t.dSYM --out-file=%t.keep.gSYM --merged-functions
# RUN: llvm-gsymutil --verify --verbose %t.keep.gSYM | FileCheck --check-prefix=CHECK-GSYM-KEEP %s

## Note: For identical functions, the dSYM / gSYM cannot be counted on to be deterministic.
## So we can only match the general structure, not exact function names / offsets


# CHECK-GSYM-DEFAULT-NOT: Merged FunctionInfos
# CHECK-GSYM-DEFAULT:      FunctionInfo @ 0x{{[0-9a-fA-F]+}}: [0x{{[0-9a-fA-F]+}} - 0x{{[0-9a-fA-F]+}}) "my_func_03"


# CHECK-GSYM-KEEP:      Address Table:
# CHECK-GSYM-KEEP-NEXT: INDEX  OFFSET16 (ADDRESS)
# CHECK-GSYM-KEEP-NEXT: ====== ===============================
# CHECK-GSYM-KEEP-NEXT: [   0] 0x{{[0-9a-fA-F]+}}

# CHECK-GSYM-KEEP:      Address Info Offsets:
# CHECK-GSYM-KEEP-NEXT: INDEX  Offset
# CHECK-GSYM-KEEP-NEXT: ====== ==========
# CHECK-GSYM-KEEP-NEXT: [   0] 0x{{[0-9a-fA-F]+}}

# CHECK-GSYM-KEEP:      Files:
# CHECK-GSYM-KEEP-NEXT: INDEX  DIRECTORY  BASENAME   PATH
# CHECK-GSYM-KEEP-NEXT: ====== ========== ========== ==============================
# CHECK-GSYM-KEEP-NEXT: [   0] 0x{{[0-9a-fA-F]+}} 0x{{[0-9a-fA-F]+}}
# CHECK-GSYM-KEEP-NEXT: [   1] 0x{{[0-9a-fA-F]+}} 0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_01.cpp
# CHECK-GSYM-KEEP-NEXT: [   2] 0x{{[0-9a-fA-F]+}} 0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_02.cpp
# CHECK-GSYM-KEEP-NEXT: [   3] 0x{{[0-9a-fA-F]+}} 0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_03.cpp

# CHECK-GSYM-KEEP:      FunctionInfo @ 0x{{[0-9a-fA-F]+}}: [0x{{[0-9a-fA-F]+}} - 0x{{[0-9a-fA-F]+}}) "my_func_01"
# CHECK-GSYM-KEEP-NEXT: LineTable:
# CHECK-GSYM-KEEP-NEXT:   0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_01.cpp:5
# CHECK-GSYM-KEEP-NEXT:   0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_01.cpp:7
# CHECK-GSYM-KEEP-NEXT:   0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_01.cpp:9
# CHECK-GSYM-KEEP-NEXT:   0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_01.cpp:8
# CHECK-GSYM-KEEP-NEXT:   0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_01.cpp:11
# CHECK-GSYM-KEEP-NEXT:   0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_01.cpp:10
# CHECK-GSYM-KEEP-NEXT:   0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_01.cpp:6
# CHECK-GSYM-KEEP-NEXT: ++ Merged FunctionInfos[0]:
# CHECK-GSYM-KEEP-NEXT:     [0x{{[0-9a-fA-F]+}} - 0x{{[0-9a-fA-F]+}}) "my_func_02"
# CHECK-GSYM-KEEP-NEXT:     LineTable:
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_02.cpp:5
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_02.cpp:7
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_02.cpp:9
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_02.cpp:8
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_02.cpp:11
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_02.cpp:10
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_02.cpp:6
# CHECK-GSYM-KEEP-NEXT: ++ Merged FunctionInfos[1]:
# CHECK-GSYM-KEEP-NEXT:     [0x{{[0-9a-fA-F]+}} - 0x{{[0-9a-fA-F]+}}) "my_func_03"
# CHECK-GSYM-KEEP-NEXT:     LineTable:
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_03.cpp:5
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_03.cpp:7
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_03.cpp:9
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_03.cpp:8
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_03.cpp:11
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_03.cpp:10
# CHECK-GSYM-KEEP-NEXT:       0x{{[0-9a-fA-F]+}} /tmp/test_gsym_yaml{{[/\\]}}out/file_03.cpp:6

## Test the lookup functionality for merged functions:
# RUN: llvm-gsymutil --verify %t.keep.gSYM --address 0x248 --merged-functions | FileCheck --check-prefix=CHECK-MERGED-LOOKUP %s
# RUN: llvm-gsymutil --verify %t.keep.gSYM --address 0x248 | FileCheck --check-prefix=CHECK-NORMAL-LOOKUP %s


# CHECK-MERGED-LOOKUP: Found 3 functions at address 0x0000000000000248:
# CHECK-MERGED-LOOKUP-NEXT:       0x0000000000000248: my_func_01 @ /tmp/test_gsym_yaml{{[/\\]}}out/file_01.cpp:5
# CHECK-MERGED-LOOKUP-NEXT-NEXT:  0x0000000000000248: my_func_02 @ /tmp/test_gsym_yaml{{[/\\]}}out/file_02.cpp:5
# CHECK-MERGED-LOOKUP-NEXT-NEXT:  0x0000000000000248: my_func_03 @ /tmp/test_gsym_yaml{{[/\\]}}out/file_03.cpp:5
 
# CHECK-NORMAL-LOOKUP: 0x0000000000000248: my_func_01 @ /tmp/test_gsym_yaml{{[/\\]}}out/file_01.cpp:5


--- !mach-o
FileHeader:
  magic:           0xFEEDFACF
  cputype:         0x100000C
  cpusubtype:      0x0
  filetype:        0xA
  ncmds:           6
  sizeofcmds:      1168
  flags:           0x0
  reserved:        0x0
LoadCommands:
  - cmd:             LC_UUID
    cmdsize:         24
    uuid:            4C4C44EA-5555-3144-A15B-1DD428F7F3A2
  - cmd:             LC_BUILD_VERSION
    cmdsize:         24
    platform:        1
    minos:           720896
    sdk:             720896
    ntools:          0
  - cmd:             LC_SYMTAB
    cmdsize:         24
    symoff:          4096
    nsyms:           3
    stroff:          4144
    strsize:         38
  - cmd:             LC_SEGMENT_64
    cmdsize:         152
    segname:         __TEXT
    vmaddr:          0
    vmsize:          16384
    fileoff:         0
    filesize:        0
    maxprot:         5
    initprot:        5
    nsects:          1
    flags:           0
    Sections:
      - sectname:        __text
        segname:         __TEXT
        addr:            0x248
        size:            40
        offset:          0x0
        align:           2
        reloff:          0x0
        nreloc:          0
        flags:           0x80000400
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
        content:         CFFAEDFE0C000001000000000A000000060000009004000000000000000000001B00000018000000
  - cmd:             LC_SEGMENT_64
    cmdsize:         72
    segname:         __LINKEDIT
    vmaddr:          16384
    vmsize:          4096
    fileoff:         4096
    filesize:        86
    maxprot:         1
    initprot:        1
    nsects:          0
    flags:           0
  - cmd:             LC_SEGMENT_64
    cmdsize:         872
    segname:         __DWARF
    vmaddr:          20480
    vmsize:          4096
    fileoff:         8192
    filesize:        1405
    maxprot:         7
    initprot:        3
    nsects:          10
    flags:           0
    Sections:
      - sectname:        __debug_line
        segname:         __DWARF
        addr:            0x5000
        size:            234
        offset:          0x2000
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
      - sectname:        __debug_aranges
        segname:         __DWARF
        addr:            0x50EA
        size:            144
        offset:          0x20EA
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
      - sectname:        __debug_info
        segname:         __DWARF
        addr:            0x517A
        size:            324
        offset:          0x217A
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
      - sectname:        __debug_frame
        segname:         __DWARF
        addr:            0x52BE
        size:            120
        offset:          0x22BE
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
        content:         14000000FFFFFFFF0400080001781E0C1F000000000000001C0000000000000048020000000000002800000000000000440E1000000000001C0000000000000048020000000000002800000000000000440E1000000000001C0000000000000048020000000000002800000000000000440E100000000000
      - sectname:        __debug_abbrev
        segname:         __DWARF
        addr:            0x5336
        size:            73
        offset:          0x2336
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
      - sectname:        __debug_str
        segname:         __DWARF
        addr:            0x537F
        size:            221
        offset:          0x237F
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
      - sectname:        __apple_namespac
        segname:         __DWARF
        addr:            0x545C
        size:            36
        offset:          0x245C
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
        content:         485341480100000001000000000000000C000000000000000100000001000600FFFFFFFF
      - sectname:        __apple_names
        segname:         __DWARF
        addr:            0x5480
        size:            116
        offset:          0x2480
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
        content:         485341480100000003000000030000000C00000000000000010000000100060000000000010000000200000038450B6E36450B6E37450B6E440000005400000064000000D200000001000000060100000000000094000000010000002E00000000000000B7000000010000009A00000000000000
      - sectname:        __apple_types
        segname:         __DWARF
        addr:            0x54F4
        size:            101
        offset:          0x24F4
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
        content:         48534148010000000100000001000000180000000000000004000000010006000300050005000B0006000600000000003080880B38000000A30000000300000064000000240000A4283A0CD0000000240000A4283A0C3C010000240000A4283A0C00000000
      - sectname:        __apple_objc
        segname:         __DWARF
        addr:            0x5559
        size:            36
        offset:          0x2559
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
        content:         485341480100000001000000000000000C000000000000000100000001000600FFFFFFFF
LinkEditData:
  NameList:
    - n_strx:          2
      n_type:          0xF
      n_sect:          1
      n_desc:          0
      n_value:         584
    - n_strx:          14
      n_type:          0xF
      n_sect:          1
      n_desc:          0
      n_value:         584
    - n_strx:          26
      n_type:          0xF
      n_sect:          1
      n_desc:          0
      n_value:         584
  StringTable:
    - ''
    - ''
    - _my_func_01
    - _my_func_02
    - _my_func_03
DWARF:
  debug_str:
    - ''
    - 'clang version 20.0.0git (https://github.com/alx32/llvm-project.git cfb92be0a9cdd0f4595100c5add4e2795a44134e)'
    - 'out/file_01.cpp'
    - '/'
    - '/tmp/test_gsym_yaml'
    - my_func_01
    - a
    - b
    - int
    - 'out/file_02.cpp'
    - my_func_02
    - 'out/file_03.cpp'
    - my_func_03
  debug_abbrev:
    - ID:              0
      Table:
        - Code:            0x1
          Tag:             DW_TAG_compile_unit
          Children:        DW_CHILDREN_yes
          Attributes:
            - Attribute:       DW_AT_producer
              Form:            DW_FORM_strp
            - Attribute:       DW_AT_language
              Form:            DW_FORM_data2
            - Attribute:       DW_AT_name
              Form:            DW_FORM_strp
            - Attribute:       DW_AT_LLVM_sysroot
              Form:            DW_FORM_strp
            - Attribute:       DW_AT_stmt_list
              Form:            DW_FORM_sec_offset
            - Attribute:       DW_AT_comp_dir
              Form:            DW_FORM_strp
            - Attribute:       DW_AT_low_pc
              Form:            DW_FORM_addr
            - Attribute:       DW_AT_high_pc
              Form:            DW_FORM_data4
        - Code:            0x2
          Tag:             DW_TAG_subprogram
          Children:        DW_CHILDREN_yes
          Attributes:
            - Attribute:       DW_AT_low_pc
              Form:            DW_FORM_addr
            - Attribute:       DW_AT_high_pc
              Form:            DW_FORM_data4
            - Attribute:       DW_AT_APPLE_omit_frame_ptr
              Form:            DW_FORM_flag_present
            - Attribute:       DW_AT_frame_base
              Form:            DW_FORM_exprloc
            - Attribute:       DW_AT_name
              Form:            DW_FORM_strp
            - Attribute:       DW_AT_decl_file
              Form:            DW_FORM_data1
            - Attribute:       DW_AT_decl_line
              Form:            DW_FORM_data1
            - Attribute:       DW_AT_type
              Form:            DW_FORM_ref_addr
            - Attribute:       DW_AT_external
              Form:            DW_FORM_flag_present
        - Code:            0x3
          Tag:             DW_TAG_formal_parameter
          Children:        DW_CHILDREN_no
          Attributes:
            - Attribute:       DW_AT_location
              Form:            DW_FORM_exprloc
            - Attribute:       DW_AT_name
              Form:            DW_FORM_strp
            - Attribute:       DW_AT_decl_file
              Form:            DW_FORM_data1
            - Attribute:       DW_AT_decl_line
              Form:            DW_FORM_data1
            - Attribute:       DW_AT_type
              Form:            DW_FORM_ref_addr
        - Code:            0x4
          Tag:             DW_TAG_base_type
          Children:        DW_CHILDREN_no
          Attributes:
            - Attribute:       DW_AT_name
              Form:            DW_FORM_strp
            - Attribute:       DW_AT_encoding
              Form:            DW_FORM_data1
            - Attribute:       DW_AT_byte_size
              Form:            DW_FORM_data1
  debug_aranges:
    - Length:          0x2C
      Version:         2
      CuOffset:        0x0
      AddressSize:     0x8
      Descriptors:
        - Address:         0x248
          Length:          0x28
    - Length:          0x2C
      Version:         2
      CuOffset:        0x6C
      AddressSize:     0x8
      Descriptors:
        - Address:         0x248
          Length:          0x28
    - Length:          0x2C
      Version:         2
      CuOffset:        0xD8
      AddressSize:     0x8
      Descriptors:
        - Address:         0x248
          Length:          0x28
  debug_info:
    - Length:          0x68
      Version:         4
      AbbrevTableID:   0
      AbbrOffset:      0x0
      AddrSize:        8
      Entries:
        - AbbrCode:        0x1
          Values:
            - Value:           0x1
            - Value:           0x21
            - Value:           0x6E
            - Value:           0x7E
            - Value:           0x0
            - Value:           0x80
            - Value:           0x248
            - Value:           0x28
        - AbbrCode:        0x2
          Values:
            - Value:           0x248
            - Value:           0x28
            - Value:           0x1
            - Value:           0x1
              BlockData:       [ 0x6F ]
            - Value:           0x94
            - Value:           0x1
            - Value:           0x2
            - Value:           0x64
            - Value:           0x1
        - AbbrCode:        0x3
          Values:
            - Value:           0x2
              BlockData:       [ 0x91, 0xC ]
            - Value:           0x9F
            - Value:           0x1
            - Value:           0x3
            - Value:           0x64
        - AbbrCode:        0x3
          Values:
            - Value:           0x2
              BlockData:       [ 0x91, 0x8 ]
            - Value:           0xA1
            - Value:           0x1
            - Value:           0x4
            - Value:           0x64
        - AbbrCode:        0x0
        - AbbrCode:        0x4
          Values:
            - Value:           0xA3
            - Value:           0x5
            - Value:           0x4
        - AbbrCode:        0x0
    - Length:          0x68
      Version:         4
      AbbrevTableID:   0
      AbbrOffset:      0x0
      AddrSize:        8
      Entries:
        - AbbrCode:        0x1
          Values:
            - Value:           0x1
            - Value:           0x21
            - Value:           0xA7
            - Value:           0x7E
            - Value:           0x4E
            - Value:           0x80
            - Value:           0x248
            - Value:           0x28
        - AbbrCode:        0x2
          Values:
            - Value:           0x248
            - Value:           0x28
            - Value:           0x1
            - Value:           0x1
              BlockData:       [ 0x6F ]
            - Value:           0xB7
            - Value:           0x1
            - Value:           0x2
            - Value:           0xD0
            - Value:           0x1
        - AbbrCode:        0x3
          Values:
            - Value:           0x2
              BlockData:       [ 0x91, 0xC ]
            - Value:           0x9F
            - Value:           0x1
            - Value:           0x3
            - Value:           0xD0
        - AbbrCode:        0x3
          Values:
            - Value:           0x2
              BlockData:       [ 0x91, 0x8 ]
            - Value:           0xA1
            - Value:           0x1
            - Value:           0x4
            - Value:           0xD0
        - AbbrCode:        0x0
        - AbbrCode:        0x4
          Values:
            - Value:           0xA3
            - Value:           0x5
            - Value:           0x4
        - AbbrCode:        0x0
    - Length:          0x68
      Version:         4
      AbbrevTableID:   0
      AbbrOffset:      0x0
      AddrSize:        8
      Entries:
        - AbbrCode:        0x1
          Values:
            - Value:           0x1
            - Value:           0x21
            - Value:           0xC2
            - Value:           0x7E
            - Value:           0x9C
            - Value:           0x80
            - Value:           0x248
            - Value:           0x28
        - AbbrCode:        0x2
          Values:
            - Value:           0x248
            - Value:           0x28
            - Value:           0x1
            - Value:           0x1
              BlockData:       [ 0x6F ]
            - Value:           0xD2
            - Value:           0x1
            - Value:           0x2
            - Value:           0x13C
            - Value:           0x1
        - AbbrCode:        0x3
          Values:
            - Value:           0x2
              BlockData:       [ 0x91, 0xC ]
            - Value:           0x9F
            - Value:           0x1
            - Value:           0x3
            - Value:           0x13C
        - AbbrCode:        0x3
          Values:
            - Value:           0x2
              BlockData:       [ 0x91, 0x8 ]
            - Value:           0xA1
            - Value:           0x1
            - Value:           0x4
            - Value:           0x13C
        - AbbrCode:        0x0
        - AbbrCode:        0x4
          Values:
            - Value:           0xA3
            - Value:           0x5
            - Value:           0x4
        - AbbrCode:        0x0
  debug_line:
    - Length:          74
      Version:         4
      PrologueLength:  39
      MinInstLength:   1
      MaxOpsPerInst:   1
      DefaultIsStmt:   1
      LineBase:        251
      LineRange:       14
      OpcodeBase:      13
      StandardOpcodeLengths: [ 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 ]
      IncludeDirs:
        - out
      Files:
        - Name:            file_01.cpp
          DirIdx:          1
          ModTime:         0
          Length:          0
      Opcodes:
        - Opcode:          DW_LNS_extended_op
          ExtLen:          9
          SubOpcode:       DW_LNE_set_address
          Data:            584
        - Opcode:          0x16
          Data:            0
        - Opcode:          DW_LNS_set_column
          Data:            7
        - Opcode:          DW_LNS_set_prologue_end
          Data:            0
        - Opcode:          0xBC
          Data:            0
        - Opcode:          0x4C
          Data:            0
        - Opcode:          0x49
          Data:            0
        - Opcode:          0x4D
          Data:            0
        - Opcode:          0x49
          Data:            0
        - Opcode:          DW_LNS_set_column
          Data:            5
        - Opcode:          DW_LNS_set_epilogue_begin
          Data:            0
        - Opcode:          0x46
          Data:            0
        - Opcode:          DW_LNS_advance_pc
          Data:            8
        - Opcode:          DW_LNS_extended_op
          ExtLen:          1
          SubOpcode:       DW_LNE_end_sequence
          Data:            0
    - Length:          74
      Version:         4
      PrologueLength:  39
      MinInstLength:   1
      MaxOpsPerInst:   1
      DefaultIsStmt:   1
      LineBase:        251
      LineRange:       14
      OpcodeBase:      13
      StandardOpcodeLengths: [ 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 ]
      IncludeDirs:
        - out
      Files:
        - Name:            file_02.cpp
          DirIdx:          1
          ModTime:         0
          Length:          0
      Opcodes:
        - Opcode:          DW_LNS_extended_op
          ExtLen:          9
          SubOpcode:       DW_LNE_set_address
          Data:            584
        - Opcode:          0x16
          Data:            0
        - Opcode:          DW_LNS_set_column
          Data:            7
        - Opcode:          DW_LNS_set_prologue_end
          Data:            0
        - Opcode:          0xBC
          Data:            0
        - Opcode:          0x4C
          Data:            0
        - Opcode:          0x49
          Data:            0
        - Opcode:          0x4D
          Data:            0
        - Opcode:          0x49
          Data:            0
        - Opcode:          DW_LNS_set_column
          Data:            5
        - Opcode:          DW_LNS_set_epilogue_begin
          Data:            0
        - Opcode:          0x46
          Data:            0
        - Opcode:          DW_LNS_advance_pc
          Data:            8
        - Opcode:          DW_LNS_extended_op
          ExtLen:          1
          SubOpcode:       DW_LNE_end_sequence
          Data:            0
    - Length:          74
      Version:         4
      PrologueLength:  39
      MinInstLength:   1
      MaxOpsPerInst:   1
      DefaultIsStmt:   1
      LineBase:        251
      LineRange:       14
      OpcodeBase:      13
      StandardOpcodeLengths: [ 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 ]
      IncludeDirs:
        - out
      Files:
        - Name:            file_03.cpp
          DirIdx:          1
          ModTime:         0
          Length:          0
      Opcodes:
        - Opcode:          DW_LNS_extended_op
          ExtLen:          9
          SubOpcode:       DW_LNE_set_address
          Data:            584
        - Opcode:          0x16
          Data:            0
        - Opcode:          DW_LNS_set_column
          Data:            7
        - Opcode:          DW_LNS_set_prologue_end
          Data:            0
        - Opcode:          0xBC
          Data:            0
        - Opcode:          0x4C
          Data:            0
        - Opcode:          0x49
          Data:            0
        - Opcode:          0x4D
          Data:            0
        - Opcode:          0x49
          Data:            0
        - Opcode:          DW_LNS_set_column
          Data:            5
        - Opcode:          DW_LNS_set_epilogue_begin
          Data:            0
        - Opcode:          0x46
          Data:            0
        - Opcode:          DW_LNS_advance_pc
          Data:            8
        - Opcode:          DW_LNS_extended_op
          ExtLen:          1
          SubOpcode:       DW_LNE_end_sequence
          Data:            0
...


###################################################################################
############################# yaml generation script ##############################
# #!/bin/bash
# set -ex
# # Global variable for LLVM toolchain path
# TOOLCHAIN_PATH=[...]
# # Switch to the script directory
# cd "$(dirname "$0")"
# # Create and clean 'out' directory
# mkdir -p out
# rm -rf out/*
# # Generate C++ files
# for i in {1..3}; do
#     cat << EOF > out/file_0${i}.cpp
# extern "C" int my_func_0${i}(
#     int a,
#     int b)
# {
#     return
#       a
#       *
#       a
#       +
#       b;
# }
# EOF
# done
# # Compile to object files with debug info
# for i in {1..3}; do
#     ${TOOLCHAIN_PATH}/bin/clang++  \
#     -fno-unwind-tables -fno-asynchronous-unwind-tables  \
#     -target arm64-apple-macos -c -g out/file_0${i}.cpp -o out/file_0${i}.o
# done
# # Link object files to dylib using lld directly
# ${TOOLCHAIN_PATH}/bin/ld64.lld \
#     -dylib \
#     -arch arm64 \
#     -platform_version macos 11.0 11.0 \
#     -o out/libmyfuncs.dylib \
#     --icf=all --keep-icf-stabs \
#     -o out/mydylib out/file_01.o out/file_02.o out/file_03.o
# # Create dsym with --flat option
# "$TOOLCHAIN_PATH/bin/dsymutil" --flat out/mydylib -o out/mydylib.dSYM
# # Convert dsym to yaml
# "$TOOLCHAIN_PATH/bin/obj2yaml" out/mydylib.dSYM > out/mydylib.yaml
###################################################################################
