[PATCH] D129828: [BOLT][DWARF] Fix incorrect DW_AT_type offset for unittest

Rui Zhong via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 15 11:54:14 PDT 2022


zr33 added a comment.

In D129828#3655934 <https://reviews.llvm.org/D129828#3655934>, @Amir wrote:

> Some general questions:
> Why are tests incorrect? Were they generated by a buggy clang version? How do we know they are correct now?

Thanks for you questions!

The clang version is `clang version 15.0.0`.
These tests are manual edit at beginning , when I pass them to my IR constructor, I found some reference offset in them are incorrect so IR construction process failed.
For example, debug information in the pre-bolt binary `bolt/test/X86/high_pc_udata.s` like following,

  .debug_info contents:
  0x00000000: Compile Unit: length = 0x00000044, format = DWARF32, version = 0x0004, abbr_offset = 0x0000, addr_size = 0x08 (next unit at 0x00000048)
  
  0x0000000b: DW_TAG_compile_unit [1] *
                DW_AT_producer [DW_FORM_strp]     ( .debug_str[0x00000009] = "clang")
                DW_AT_language [DW_FORM_data2]    (DW_LANG_C_plus_plus_14)
                DW_AT_stmt_list [DW_FORM_sec_offset]      (0x00000000)
                DW_AT_comp_dir [DW_FORM_strp]     ( .debug_str[0x0000000f] = "test")
                DW_AT_low_pc [DW_FORM_addr]       (0x00000000000012f0)
                DW_AT_high_pc [DW_FORM_udata]     (15)
                DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000000] = "main.cpp")
  
  0x00000027:   DW_TAG_subprogram [2]
                  DW_AT_low_pc [DW_FORM_addr]     (0x00000000000012f0)
                  DW_AT_high_pc [DW_FORM_data4]   (0x0000000f)
                  DW_AT_frame_base [DW_FORM_exprloc]      (DW_OP_reg6 RBP)
                  DW_AT_name [DW_FORM_strp]       ( .debug_str[0x00000014] = "main")
                  DW_AT_decl_file [DW_FORM_data1] ("test/main.cpp")
                  DW_AT_decl_line [DW_FORM_data1] (1)
                  DW_AT_type [DW_FORM_ref4]       (cu + 0x0043 => {0x00000043})
                  DW_AT_external [DW_FORM_flag_present]   (true)
  
  0x00000040:   DW_TAG_base_type [3]
                  DW_AT_name [DW_FORM_strp]       ( .debug_str[0x00000019] = "int")
                  DW_AT_encoding [DW_FORM_data1]  (DW_ATE_signed)
                  DW_AT_byte_size [DW_FORM_data1] (0x04)
  
  0x00000047:   NULL

`DW_AT_type [DW_FORM_ref4]       (cu + 0x0043 => {0x00000043})` at Entry 0x00000027 does not refer to any entry. Ideally, it should point to 0x00000040 which is the entry for  `int`

There are same situations happened for other patched tests.

After I patch it, it looks good as following,

  .debug_info contents:
  0x00000000: Compile Unit: length = 0x00000044, format = DWARF32, version = 0x0004, abbr_offset = 0x0000, addr_size = 0x08 (next unit at 0x00000048)
  
  0x0000000b: DW_TAG_compile_unit [1] *
                DW_AT_producer [DW_FORM_strp]     ( .debug_str[0x00000009] = "clang")
                DW_AT_language [DW_FORM_data2]    (DW_LANG_C_plus_plus_14)
                DW_AT_stmt_list [DW_FORM_sec_offset]      (0x00000000)
                DW_AT_comp_dir [DW_FORM_strp]     ( .debug_str[0x0000000f] = "test")
                DW_AT_low_pc [DW_FORM_addr]       (0x00000000000012f0)
                DW_AT_high_pc [DW_FORM_udata]     (15)
                DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000000] = "main.cpp")
  
  0x00000027:   DW_TAG_subprogram [2]
                  DW_AT_low_pc [DW_FORM_addr]     (0x00000000000012f0)
                  DW_AT_high_pc [DW_FORM_data4]   (0x0000000f)
                  DW_AT_frame_base [DW_FORM_exprloc]      (DW_OP_reg6 RBP)
                  DW_AT_name [DW_FORM_strp]       ( .debug_str[0x00000014] = "main")
                  DW_AT_decl_file [DW_FORM_data1] ("test/main.cpp")
                  DW_AT_decl_line [DW_FORM_data1] (1)
                  DW_AT_type [DW_FORM_ref4]       (cu + 0x0040 => {0x00000040} "int")
                  DW_AT_external [DW_FORM_flag_present]   (true)
  
  0x00000040:   DW_TAG_base_type [3]
                  DW_AT_name [DW_FORM_strp]       ( .debug_str[0x00000019] = "int")
                  DW_AT_encoding [DW_FORM_data1]  (DW_ATE_signed)
                  DW_AT_byte_size [DW_FORM_data1] (0x04)
  
  0x00000047:   NULL

The patched tests can pass both current test and my IR constructor (the IR constructor have check for reference destination, if invalid, it will failed), so I consider they are correct now.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D129828/new/

https://reviews.llvm.org/D129828



More information about the llvm-commits mailing list