return 0
}
-standard_testfile .S
-set mainfile main.c
+standard_testfile main.c
proc test { dwarf_version offset_size addr_size ref_addr_size two_cu } {
- global testfile srcfile mainfile
+ global testfile srcfile
- # 32-bit targets do not support any of the testcases; keep quiet there.
- set opts {quiet}
- foreach n { dwarf_version offset_size addr_size ref_addr_size two_cu } {
- lappend opts "additional_flags=-D[string toupper $n]=[expr "\$$n"]"
+ set name "d${dwarf_version}o${offset_size}a${addr_size}r${ref_addr_size}t${two_cu}"
+
+ # Make some DWARF for the test.
+ set asm_file [standard_output_file ${testfile}-${name}.S]
+ Dwarf::assemble $asm_file {
+ upvar dwarf_version dwarf_version
+ upvar addr_size addr_size
+ upvar offset_size offset_size
+ upvar ref_addr_size ref_addr_size
+ upvar two_cu two_cu
+
+ set is_64 [expr { $offset_size == 4 ? 0 : 1 }]
+
+ cu {
+ version $dwarf_version
+ addr_size $addr_size
+ is_64 $is_64
+ } {
+ compile_unit {
+ { producer "GNU C 4.4.3" }
+ { language @DW_LANG_C89 }
+ { name 1.c }
+ } {
+ declare_labels struct_label variable_label int_label pointer_label
+
+ int_label: base_type {
+ { byte_size 4 DW_FORM_sdata }
+ { DW_AT_encoding @DW_ATE_signed }
+ { name int }
+ }
+
+ struct_label: structure_type {
+ { name s }
+ { byte_size 4 sdata }
+ } {
+ member {
+ { name f }
+ { type :$int_label }
+ { data_member_location 0 data1 }
+ }
+ }
+
+ pointer_label: pointer_type {
+ { byte_size $Dwarf::_cu_addr_size sdata }
+ { type :$struct_label }
+ }
+
+ variable_label: DW_TAG_variable {
+ { name v }
+ { location {
+ DW_OP_implicit_value 0x1 0x1 0x1 0x1
+ } SPECIAL_expr}
+ { type :$struct_label "DW_FORM_ref$ref_addr_size" }
+ }
+
+ if { !$two_cu } {
+ subprogram {
+ { name main }
+ { low_pc main addr }
+ { high_pc "main+0x100" addr }
+ { type %$int_label }
+ { external 1 flag }
+ } {
+ DW_TAG_variable {
+ { name p }
+ { location {
+ GNU_implicit_pointer $variable_label 0
+ } SPECIAL_expr }
+ { type :$pointer_label "DW_FORM_ref$ref_addr_size" }
+ }
+ }
+ }
+ }
+ }
+
+ if { $two_cu } {
+ cu {
+ version $dwarf_version
+ addr_size $addr_size
+ is_64 $is_64
+ } {
+ compile_unit {
+ { producer "GNU C 4.4.3" }
+ { language @DW_LANG_C89 }
+ { name 1.c }
+ } {
+ subprogram {
+ { name main }
+ { low_pc main addr }
+ { high_pc "main+0x100" addr }
+ { type %$int_label }
+ { external 1 flag }
+ } {
+ DW_TAG_variable {
+ { name p }
+ { location {
+ GNU_implicit_pointer $variable_label 0
+ } SPECIAL_expr }
+ { type %$pointer_label }
+ }
+ }
+ }
+ }
+ }
}
- set name "d${dwarf_version}o${offset_size}a${addr_size}r${ref_addr_size}t${two_cu}"
+ # 32-bit targets do not support any of the testcases; keep quiet there.
+ set opts {quiet}
set executable ${testfile}-${name}
- if [prepare_for_testing "failed to prepare" $executable "${srcfile} ${mainfile}" $opts] {
+ if [prepare_for_testing "failed to prepare" $executable "${asm_file} ${srcfile}" $opts] {
return -1
}