1## Test that yaml2obj emits .debug_abbrev section. 2 3## a) Generate the .debug_abbrev section from the "DWARF" entry. 4 5# RUN: yaml2obj --docnum=1 %s -o %t1.o 6# RUN: llvm-readobj --sections --section-data %t1.o | \ 7# RUN: FileCheck -DSIZE=59 -DADDRALIGN=1 %s --check-prefixes=SHDR,CONTENT 8 9# SHDR: Index: 1 10# SHDR-NEXT: Name: .debug_abbrev (1) 11# SHDR-NEXT: Type: SHT_PROGBITS (0x1) 12# SHDR-NEXT: Flags [ (0x0) 13# SHDR-NEXT: ] 14# SHDR-NEXT: Address: 0x0 15# SHDR-NEXT: Offset: 0x40 16# SHDR-NEXT: Size: [[SIZE]] 17# SHDR-NEXT: Link: 0 18# SHDR-NEXT: Info: 0 19# SHDR-NEXT: AddressAlignment: [[ADDRALIGN]] 20# SHDR-NEXT: EntrySize: 0 21# CONTENT-NEXT: SectionData ( 22# CONTENT-NEXT: 000: 01110125 0E130503 23## ^- abbreviation code ULEB128 ^- DW_FORM_strp ULEB128 24## ^- DW_TAG_compile_unit ULEB128 ^- DW_AT_language ULEB128 25## ^- DW_CHILDREN_yes 1-byte ^- DW_FORM_data2 ULEB128 26## ^- DW_AT_producer ULEB128 ^- DW_AT_name ULEB128 27## 28## CONTENT: 1A000002 2E011101 |...%............| 29## ^- DW_AT_strx ULEB128 ^- DW_TAG_subprogram ULEB128 30## ^--- attr terminator ^- DW_CHILDREN_yes 1-byte 31## ^- abbreviation code ULEB128 ^- DW_AT_low_pc ULEB128 32## ^- DW_FORM_addr ULEB128 33## 34# CONTENT-NEXT: 0010: 121B0000 03060081 35## ^- DW_AT_high_pc ULEB128 ^- abbreviation code ULEB128 36## ^- DW_FORM_addrx ULEB128 ^- Tag: value UELB128 37## ^--- attr terminator ^- DW_CHILDREN_no 1-byte 38## ^- DW_AT_call_pc ULEB128 (0x81) 39## 40# CONTENT: 01810104 02A04021 |..............@!| 41## -- ^- Form: reserved ULEB128 42## ^--- Form: invalid ULEB128 (0x81) ^--- Attribute: reserved ULEB128 (0x2020) 43## ^- Attribute: reserved ULEB128 ^- DW_FORM_implicit_const ULEB128 44## 45# CONTENT-NEXT: 0020: CEC2F105 00000001 46## ^------- Value SLEB128 (12345678) ^--- attr terminator 47## ^- abbrev terminator 48## ^- abbreviation code ULEB128 49# CONTENT: 1101250E 0000022E |..........%.....| 50## ^- DW_TAG_compile_unit ULEB128 ^--- attr terminator 51## ^- DW_CHILDREN_yes 1-byte ^- abbreviation code ULEB128 52## ^- DW_AT_producer ULEB128 ^- DW_TAG_subprogram ULEB128 53## ^- DW_FORM_strp ULEB128 54# CONTENT-NEXT: 0030: 01110100 00031100 000000 |...........| 55## ^- DW_CHILDREN_yes 1-byte ^--- attr terminator 56## ^- DW_AT_low_pc ULEB128 ^- abbrev table terminator 57## ^- DW_FORM_addr UELB128 58## ^---- attr terminator 59## ^- abbrev code ULEB128 (0x03) 60## ^- DW_TAG_compile_unit 61## ^- DW_CHILDREN_no 62# CONTENT-NEXT: ) 63 64--- !ELF 65FileHeader: 66 Class: ELFCLASS64 67 Data: ELFDATA2LSB 68 Type: ET_EXEC 69DWARF: 70 debug_abbrev: 71 - Table: 72 - Code: 1 73 Tag: DW_TAG_compile_unit 74 Children: DW_CHILDREN_yes 75 Attributes: 76 - Attribute: DW_AT_producer 77 Form: DW_FORM_strp 78 - Attribute: DW_AT_language 79 Form: DW_FORM_data2 80 - Attribute: DW_AT_name 81 Form: DW_FORM_strx 82 - Code: 2 83 Tag: DW_TAG_subprogram 84 Children: DW_CHILDREN_yes 85 Attributes: 86 - Attribute: DW_AT_low_pc 87 Form: DW_FORM_addr 88 - Attribute: DW_AT_high_pc 89 Form: DW_FORM_addrx 90 - Code: 3 91 ## Test a reserved tag value. 92 Tag: 0x06 93 Children: DW_CHILDREN_no 94 Attributes: 95 ## Test an attribute value that is more than one byte. 96 - Attribute: DW_AT_call_pc 97 ## Test a form value that is more than one byte. 98 Form: 0x81 99 ## Test a reserved attribute value. 100 - Attribute: 0x04 101 ## Test a reserved form value. 102 Form: 0x02 103 - Attribute: 0x2020 104 ## Test one special attribute form DW_FORM_implicit_const, 105 ## who is followed by a SLEB128 value. 106 Form: DW_FORM_implicit_const 107 Value: 12345678 108 - Table: 109 - Code: 1 110 Tag: DW_TAG_compile_unit 111 Children: DW_CHILDREN_yes 112 Attributes: 113 - Attribute: DW_AT_producer 114 Form: DW_FORM_strp 115 - Code: 2 116 Tag: DW_TAG_subprogram 117 Children: DW_CHILDREN_yes 118 Attributes: 119 - Attribute: DW_AT_low_pc 120 Form: DW_FORM_addr 121 ## Test that if the 'Attributes' field is not specified, yaml2obj emits 122 ## a terminating entry, 0 for the attribute, 0 for the form. 123 - Tag: DW_TAG_compile_unit 124 Children: DW_CHILDREN_no 125 126## b) Generate the .debug_abbrev section from raw section content. 127 128# RUN: yaml2obj --docnum=2 %s -o %t2.o 129# RUN: llvm-readobj --sections --section-data %t2.o | \ 130# RUN: FileCheck -DADDRALIGN=0 -DSIZE=3 %s --check-prefixes=SHDR,ARBITRARY-CONTENT 131 132# ARBITRARY-CONTENT-NEXT: SectionData ( 133# ARBITRARY-CONTENT-NEXT: 0000: 112233 134# ARBITRARY-CONTENT-NEXT: ) 135 136--- !ELF 137FileHeader: 138 Class: ELFCLASS64 139 Data: ELFDATA2LSB 140 Type: ET_EXEC 141Sections: 142 - Name: .debug_abbrev 143 Type: SHT_PROGBITS 144 Content: "112233" 145 146## c) Generate the .debug_abbrev section when the "Size" is specified. 147 148# RUN: yaml2obj --docnum=3 %s -o %t3.o 149# RUN: llvm-readobj --sections --section-data %t3.o | \ 150# RUN: FileCheck -DSIZE=16 -DADDRALIGN=0 %s --check-prefixes=SHDR,SIZE 151 152# SIZE-NEXT: SectionData ( 153# SIZE-NEXT: 0000: 00000000 00000000 00000000 00000000 |................| 154# SIZE-NEXT: ) 155 156--- !ELF 157FileHeader: 158 Class: ELFCLASS64 159 Data: ELFDATA2LSB 160 Type: ET_EXEC 161Sections: 162 - Name: .debug_abbrev 163 Type: SHT_PROGBITS 164 Size: 0x10 165 166## d) Test that yaml2obj emits an error message when both the "Size" and the 167## "debug_abbrev" entry are specified at the same time. 168 169# RUN: not yaml2obj --docnum=4 %s 2>&1 | FileCheck %s --check-prefix=ERROR 170 171# ERROR: yaml2obj: error: cannot specify section '.debug_abbrev' contents in the 'DWARF' entry and the 'Content' or 'Size' in the 'Sections' entry at the same time 172 173--- !ELF 174FileHeader: 175 Class: ELFCLASS64 176 Data: ELFDATA2LSB 177 Type: ET_EXEC 178Sections: 179 - Name: .debug_abbrev 180 Type: SHT_PROGBITS 181 Size: 0x10 182DWARF: 183 debug_abbrev: 184 - Table: 185 - Code: 1 186 Tag: DW_TAG_compile_unit 187 Children: DW_CHILDREN_no 188 189## e) Test that yaml2obj emits an error message when both the "Content" and the 190## "debug_abbrev" entry are specified at the same time. 191 192# RUN: not yaml2obj --docnum=5 %s 2>&1 | FileCheck %s --check-prefix=ERROR 193 194--- !ELF 195FileHeader: 196 Class: ELFCLASS64 197 Data: ELFDATA2LSB 198 Type: ET_EXEC 199Sections: 200 - Name: .debug_abbrev 201 Type: SHT_PROGBITS 202 Content: "00" 203DWARF: 204 debug_abbrev: 205 - Table: 206 - Code: 1 207 Tag: DW_TAG_compile_unit 208 Children: DW_CHILDREN_no 209 210## f) Test that all the properties can be overridden by the section header when 211## the "debug_abbrev" entry doesn't exist. 212 213# RUN: yaml2obj --docnum=6 %s -o %t6.o 214# RUN: llvm-readelf --sections %t6.o | FileCheck %s --check-prefix=OVERRIDDEN 215 216# OVERRIDDEN: [Nr] Name Type Address Off Size ES Flg Lk Inf Al 217# OVERRIDDEN: [ 1] .debug_abbrev STRTAB 0000000000002020 000050 000006 01 A 2 1 2 218# OVERRIDDEN-NEXT: [ 2] .sec STRTAB 0000000000000000 000056 000000 00 0 0 0 219 220--- !ELF 221FileHeader: 222 Class: ELFCLASS64 223 Data: ELFDATA2LSB 224 Type: ET_EXEC 225Sections: 226 - Name: .debug_abbrev 227 Type: SHT_STRTAB ## SHT_PROGBITS by default. 228 Flags: [SHF_ALLOC] ## 0 by default. 229 Link: .sec ## 0 by default. 230 EntSize: 1 ## 0 by default. 231 Info: 1 ## 0 by default. 232 AddressAlign: 2 ## 0 by default. 233 Address: 0x2020 ## 0x00 by default. 234 Offset: 0x50 ## 0x40 for the first section. 235 Size: 0x06 ## Set the "Size" so that we can reuse the check tag "OVERRIDDEN". 236 - Name: .sec ## Linked by .debug_abbrev. 237 Type: SHT_STRTAB 238 239## g) Test that all the properties can be overridden by the section header when 240## the "debug_abbrev" entry exists. 241 242# RUN: yaml2obj --docnum=7 %s -o %t7.o 243# RUN: llvm-readelf --sections %t7.o | FileCheck %s --check-prefix=OVERRIDDEN 244 245--- !ELF 246FileHeader: 247 Class: ELFCLASS64 248 Data: ELFDATA2LSB 249 Type: ET_EXEC 250Sections: 251 - Name: .debug_abbrev 252 Type: SHT_STRTAB ## SHT_PROGBITS by default. 253 Flags: [SHF_ALLOC] ## 0 by default. 254 Link: .sec ## 0 by default. 255 EntSize: 1 ## 0 by default. 256 Info: 1 ## 0 by default. 257 AddressAlign: 2 ## 1 by default. 258 Address: 0x2020 ## 0x00 by default. 259 Offset: 0x50 ## 0x40 for the first section. 260 - Name: .sec ## Linked by .debug_abbrev. 261 Type: SHT_STRTAB 262DWARF: 263 debug_abbrev: 264 - Table: 265 - Code: 1 266 Tag: DW_TAG_compile_unit 267 Children: DW_CHILDREN_no 268 269## h) Test that yaml2obj automatically generates abbreviation codes for us. 270 271# RUN: yaml2obj --docnum=8 %s -o %t8.o 272# RUN: llvm-readelf --hex-dump=.debug_abbrev %t8.o | FileCheck %s --check-prefix=CODE 273 274# CODE: 0x00000000 01110000 00022e00 0000042e 00000004 275## ^- abbreviation code ULEB128 276## ^- abbreviation code ULEB128 277## ^- abbreviation code (ULEB128) 0x04 278## ^- abbreviation code (ULEB128) 0x04 279## 280# CODE-NEXT: 0x00000010 2e000000 052e0000 00062e00 00000001 281## ^- abbreviation code ULEB128 282## ^- abbreviation code ULEB128 283## ^- abbreviation code ULEB128 284# CODE-NEXT: 0x00000020 11000000 022e0000 0000 285## ^- abbreviation code ULEB128 286 287--- !ELF 288FileHeader: 289 Class: ELFCLASS64 290 Data: ELFDATA2LSB 291 Type: ET_EXEC 292DWARF: 293 debug_abbrev: 294 - Table: 295 - Tag: DW_TAG_compile_unit 296 Children: DW_CHILDREN_no 297 - Tag: DW_TAG_subprogram 298 Children: DW_CHILDREN_no 299 - Code: 4 300 Tag: DW_TAG_subprogram 301 Children: DW_CHILDREN_no 302 - Code: 4 303 Tag: DW_TAG_subprogram 304 Children: DW_CHILDREN_no 305 - Tag: DW_TAG_subprogram 306 Children: DW_CHILDREN_no 307 - Tag: DW_TAG_subprogram 308 Children: DW_CHILDREN_no 309 - Table: 310 ## Test that the abbrev codes in a new table start from 1 by default. 311 - Tag: DW_TAG_compile_unit 312 Children: DW_CHILDREN_no 313 - Tag: DW_TAG_subprogram 314 Children: DW_CHILDREN_no 315 316## i) Test that yaml2obj emits an error message when there are non-empty compilation units 317## and multiple abbrev tables are assigned the same ID. 318 319## RUN: not yaml2obj --docnum=9 %s 2>&1 | FileCheck %s --check-prefix=ID-COLLISION 320 321# ID-COLLISION: yaml2obj: error: the ID (1) of abbrev table with index 1 has been used by abbrev table with index 0 322 323--- !ELF 324FileHeader: 325 Class: ELFCLASS64 326 Data: ELFDATA2LSB 327 Type: ET_EXEC 328 Machine: EM_X86_64 329DWARF: 330 debug_abbrev: 331 - ID: 1 332 - ID: 1 333 debug_info: 334 - Version: 4 335 AbbrOffset: 0x00 336 Entries: 337 - AbbrCode: 1 338 Values: 339 - Value: 0x1234 340