diff options
Diffstat (limited to 'test_cases')
15 files changed, 183 insertions, 30 deletions
diff --git a/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_flat b/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_flat index 73846d7..59e5a0e 100644 --- a/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_flat +++ b/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_flat @@ -1,5 +1,7 @@ function symbol 'int struct S::* s2()' {_Z2s2v} was added +function symbol 'int s10(int struct S::*)' {_Z3s10M1Si} was added + function symbol 'void pmz_fun()' {_Z7pmz_funv} was added variable symbol 'char struct Y::* pmc' was added diff --git a/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_plain b/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_plain index 73846d7..59e5a0e 100644 --- a/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_plain +++ b/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_plain @@ -1,5 +1,7 @@ function symbol 'int struct S::* s2()' {_Z2s2v} was added +function symbol 'int s10(int struct S::*)' {_Z3s10M1Si} was added + function symbol 'void pmz_fun()' {_Z7pmz_funv} was added variable symbol 'char struct Y::* pmc' was added diff --git a/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_small b/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_small index 73846d7..59e5a0e 100644 --- a/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_small +++ b/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_small @@ -1,5 +1,7 @@ function symbol 'int struct S::* s2()' {_Z2s2v} was added +function symbol 'int s10(int struct S::*)' {_Z3s10M1Si} was added + function symbol 'void pmz_fun()' {_Z7pmz_funv} was added variable symbol 'char struct Y::* pmc' was added diff --git a/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_viz b/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_viz index 31262c8..292ca80 100644 --- a/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_viz +++ b/test_cases/diff_tests/member/expected/pointer_to_member_cc.o_o_viz @@ -2,46 +2,48 @@ digraph "ABI diff" { "0" [shape=rectangle, label="'interface'"] "1" [color=red, label="added(int struct S::* s2() {_Z2s2v})"] "0" -> "1" [label=""] - "2" [color=red, label="added(void pmz_fun() {_Z7pmz_funv})"] + "2" [color=red, label="added(int s10(int struct S::*) {_Z3s10M1Si})"] "0" -> "2" [label=""] - "3" [color=red, label="added(char struct Y::* pmc)"] + "3" [color=red, label="added(void pmz_fun() {_Z7pmz_funv})"] "0" -> "3" [label=""] - "4" [color=red, label="added(int union U::* pmcu)"] + "4" [color=red, label="added(char struct Y::* pmc)"] "0" -> "4" [label=""] - "5" [color=red, label="added(double struct X::* pmd)"] + "5" [color=red, label="added(int union U::* pmcu)"] "0" -> "5" [label=""] - "6" [color=red, label="added(void(struct X::* pmf)(struct X*, int))"] + "6" [color=red, label="added(double struct X::* pmd)"] "0" -> "6" [label=""] - "7" [color=red, label="added(int struct X::* pmi)"] + "7" [color=red, label="added(void(struct X::* pmf)(struct X*, int))"] "0" -> "7" [label=""] - "8" [color=red, label="added(int union U::* pmu)"] + "8" [color=red, label="added(int struct X::* pmi)"] "0" -> "8" [label=""] - "9" [color=red, label="added(int struct { int t; }::* pmy)"] + "9" [color=red, label="added(int union U::* pmu)"] "0" -> "9" [label=""] - "10" [color=red, label="added(int struct S::* s0)"] + "10" [color=red, label="added(int struct { int t; }::* pmy)"] "0" -> "10" [label=""] - "11" [color=red, label="added(int struct S::** s1)"] + "11" [color=red, label="added(int struct S::* s0)"] "0" -> "11" [label=""] - "12" [color=red, label="added(int struct S::*(* s3)())"] + "12" [color=red, label="added(int struct S::** s1)"] "0" -> "12" [label=""] - "13" [color=red, label="added(int struct S::* s4[7])"] + "13" [color=red, label="added(int struct S::*(* s3)())"] "0" -> "13" [label=""] - "14" [color=red, label="added(int* struct S::* s5)"] + "14" [color=red, label="added(int struct S::* s4[7])"] "0" -> "14" [label=""] - "15" [color=red, label="added(int(* struct S::* s6)())"] + "15" [color=red, label="added(int* struct S::* s5)"] "0" -> "15" [label=""] - "16" [color=red, label="added(int(struct S::* s7)(struct S*))"] + "16" [color=red, label="added(int(* struct S::* s6)())"] "0" -> "16" [label=""] - "17" [color=red, label="added(int(struct S::* s8)[7])"] + "17" [color=red, label="added(int(struct S::* s7)(struct S*))"] "0" -> "17" [label=""] - "18" [color=red, label="added(const int struct S::* volatile s9)"] + "18" [color=red, label="added(int(struct S::* s8)[7])"] "0" -> "18" [label=""] - "19" [label="'char struct A::* diff' -> 'int struct B::* diff'"] - "20" [label="'char struct A::*' -> 'int struct B::*'"] - "21" [color=red, label="'struct A' -> 'struct B'"] - "20" -> "21" [label="containing"] - "22" [color=red, label="'char' -> 'int'"] - "20" -> "22" [label=""] - "19" -> "20" [label=""] + "19" [color=red, label="added(const int struct S::* volatile s9)"] "0" -> "19" [label=""] + "20" [label="'char struct A::* diff' -> 'int struct B::* diff'"] + "21" [label="'char struct A::*' -> 'int struct B::*'"] + "22" [color=red, label="'struct A' -> 'struct B'"] + "21" -> "22" [label="containing"] + "23" [color=red, label="'char' -> 'int'"] + "21" -> "23" [label=""] + "20" -> "21" [label=""] + "0" -> "20" [label=""] } diff --git a/test_cases/diff_tests/member/pointer_to_member.1.cc b/test_cases/diff_tests/member/pointer_to_member.1.cc index 61011ee..9779061 100644 --- a/test_cases/diff_tests/member/pointer_to_member.1.cc +++ b/test_cases/diff_tests/member/pointer_to_member.1.cc @@ -21,6 +21,9 @@ int (S::*s7)(); int (S::*s8)[7]; // declare s9 as volatile pointer to member of class S const int const int S::* volatile s9; +// declare s10 as function (pointer to member of class S int) returning int +int s10(int S::*); +int s10(int S::*) { return 0; } struct X { void f(int); @@ -48,8 +51,6 @@ auto pmu = &U::u; typedef const U CU; auto pmcu = &CU::u; -// TODO: everything above here should be an info test - struct B { int x; }; diff --git a/test_cases/info_tests/member/expected/pointer_to_member_cc.elf_stg b/test_cases/info_tests/member/expected/pointer_to_member_cc.elf_stg index 7b197b6..6d9e1d4 100644 --- a/test_cases/info_tests/member/expected/pointer_to_member_cc.elf_stg +++ b/test_cases/info_tests/member/expected/pointer_to_member_cc.elf_stg @@ -206,6 +206,11 @@ function { id: 0x9d80e32f return_type_id: 0x6720d32f } +function { + id: 0xa875fb6e + return_type_id: 0x6720d32f + parameter_id: 0xd7d46104 +} elf_symbol { id: 0xba0e5cd0 name: "_Z2s2v" @@ -215,6 +220,14 @@ elf_symbol { full_name: "s2" } elf_symbol { + id: 0x94e5eb64 + name: "_Z3s10M1Si" + is_defined: true + symbol_type: FUNCTION + type_id: 0xa875fb6e + full_name: "s10" +} +elf_symbol { id: 0x13e4cc52 name: "_Z7pmz_funv" is_defined: true @@ -353,6 +366,7 @@ elf_symbol { interface { id: 0x84ea5130 symbol_id: 0xba0e5cd0 + symbol_id: 0x94e5eb64 symbol_id: 0x13e4cc52 symbol_id: 0x648621f2 symbol_id: 0xff819903 diff --git a/test_cases/info_tests/member/pointer_to_member.cc b/test_cases/info_tests/member/pointer_to_member.cc index 5e5321c..20f9dcb 100644 --- a/test_cases/info_tests/member/pointer_to_member.cc +++ b/test_cases/info_tests/member/pointer_to_member.cc @@ -21,6 +21,9 @@ int (S::*s7)(); int (S::*s8)[7]; // declare s9 as volatile pointer to member of class S const int const int S::* volatile s9; +// declare s10 as function (pointer to member of class S int) returning int +int s10(int S::*); +int s10(int S::*) { return 0; } struct X { void f(int); diff --git a/test_cases/info_tests/source_filter/expected/type_roots_cc.elf_stg b/test_cases/info_tests/source_filter/expected/type_roots_cc.elf_stg new file mode 100644 index 0000000..e91b30c --- /dev/null +++ b/test_cases/info_tests/source_filter/expected/type_roots_cc.elf_stg @@ -0,0 +1,5 @@ +version: 0x00000002 +root_id: 0x84ea5130 +interface { + id: 0x84ea5130 +} diff --git a/test_cases/info_tests/source_filter/expected/composite_and_enum_cc.elf_stg b/test_cases/info_tests/source_filter/expected/types_cc.elf_stg index 4ec229b..f6c669d 100644 --- a/test_cases/info_tests/source_filter/expected/composite_and_enum_cc.elf_stg +++ b/test_cases/info_tests/source_filter/expected/types_cc.elf_stg @@ -1,5 +1,19 @@ version: 0x00000002 root_id: 0x84ea5130 +special { + id: 0x48b5725f + kind: VOID +} +pointer_reference { + id: 0x18bd6530 + kind: POINTER + pointee_type_id: 0x48b5725f +} +typedef { + id: 0x4f137329 + name: "Typedef" + referred_type_id: 0x18bd6530 +} struct_union { id: 0x54a61673 kind: STRUCT @@ -56,6 +70,14 @@ elf_symbol { full_name: "foo_struct" } elf_symbol { + id: 0x90772e58 + name: "foo_typedef" + is_defined: true + symbol_type: OBJECT + type_id: 0x4f137329 + full_name: "foo_typedef" +} +elf_symbol { id: 0xc77e6f56 name: "foo_union" is_defined: true @@ -69,5 +91,6 @@ interface { symbol_id: 0x5f43725e symbol_id: 0x49093003 symbol_id: 0x8361f42b + symbol_id: 0x90772e58 symbol_id: 0xc77e6f56 } diff --git a/test_cases/info_tests/source_filter/composite_and_enum.cc b/test_cases/info_tests/source_filter/type_roots.cc index b73bcb0..5d393dd 100644 --- a/test_cases/info_tests/source_filter/composite_and_enum.cc +++ b/test_cases/info_tests/source_filter/type_roots.cc @@ -20,8 +20,11 @@ enum class EnumClass { ONE = 1, }; +typedef void* Typedef; + Struct foo_struct; Union foo_union; Class foo_class; Enum foo_enum; EnumClass foo_enum_class; +Typedef foo_typedef; diff --git a/test_cases/info_tests/source_filter/types.cc b/test_cases/info_tests/source_filter/types.cc new file mode 100644 index 0000000..5d393dd --- /dev/null +++ b/test_cases/info_tests/source_filter/types.cc @@ -0,0 +1,30 @@ +struct Struct { + long x; +}; + +union Union { + long y; +}; + +class Class { + long z; +}; + +enum Enum { + ENUM_ZERO = 0, + ENUM_ONE = 1, +}; + +enum class EnumClass { + ZERO = 0, + ONE = 1, +}; + +typedef void* Typedef; + +Struct foo_struct; +Union foo_union; +Class foo_class; +Enum foo_enum; +EnumClass foo_enum_class; +Typedef foo_typedef; diff --git a/test_cases/info_tests/symbol/expected/tls_emulated_c.elf_stg b/test_cases/info_tests/symbol/expected/tls_emulated_c.elf_stg new file mode 100644 index 0000000..b4cd4f9 --- /dev/null +++ b/test_cases/info_tests/symbol/expected/tls_emulated_c.elf_stg @@ -0,0 +1,26 @@ +version: 0x00000002 +root_id: 0x84ea5130 +elf_symbol { + id: 0x688c97e0 + name: "__emutls_t.var2" + is_defined: true + symbol_type: OBJECT +} +elf_symbol { + id: 0xa2dcdaef + name: "__emutls_v.var1" + is_defined: true + symbol_type: OBJECT +} +elf_symbol { + id: 0xe19c7b87 + name: "__emutls_v.var2" + is_defined: true + symbol_type: OBJECT +} +interface { + id: 0x84ea5130 + symbol_id: 0x688c97e0 + symbol_id: 0xa2dcdaef + symbol_id: 0xe19c7b87 +} diff --git a/test_cases/info_tests/symbol/expected/tls_emulated_cc.elf_stg b/test_cases/info_tests/symbol/expected/tls_emulated_cc.elf_stg new file mode 100644 index 0000000..3ddf217 --- /dev/null +++ b/test_cases/info_tests/symbol/expected/tls_emulated_cc.elf_stg @@ -0,0 +1,38 @@ +version: 0x00000002 +root_id: 0x84ea5130 +primitive { + id: 0x6720d32f + name: "int" + encoding: SIGNED_INTEGER + bytesize: 0x00000004 +} +function { + id: 0x9d80e32f + return_type_id: 0x6720d32f +} +elf_symbol { + id: 0x92009dc1 + name: "_Z3barv" + is_defined: true + symbol_type: FUNCTION + type_id: 0x9d80e32f + full_name: "bar" +} +elf_symbol { + id: 0x6c57e66c + name: "__emutls_v._ZN2ns3fooE" + is_defined: true + symbol_type: OBJECT +} +elf_symbol { + id: 0xb0192ccb + name: "__emutls_v.foo" + is_defined: true + symbol_type: OBJECT +} +interface { + id: 0x84ea5130 + symbol_id: 0x92009dc1 + symbol_id: 0x6c57e66c + symbol_id: 0xb0192ccb +} diff --git a/test_cases/info_tests/symbol/expected/version_definition_c.elf_stg b/test_cases/info_tests/symbol/expected/version_definition_c.elf_stg index e9e0b9b..6342898 100644 --- a/test_cases/info_tests/symbol/expected/version_definition_c.elf_stg +++ b/test_cases/info_tests/symbol/expected/version_definition_c.elf_stg @@ -32,7 +32,7 @@ elf_symbol { is_defined: true symbol_type: FUNCTION type_id: 0x10985193 - full_name: "versioned_foo_v1" + full_name: "versioned_foo" } elf_symbol { id: 0xc828cd97 diff --git a/test_cases/info_tests/symbol/version_definition.c b/test_cases/info_tests/symbol/version_definition.c index 0127d57..af87429 100644 --- a/test_cases/info_tests/symbol/version_definition.c +++ b/test_cases/info_tests/symbol/version_definition.c @@ -6,14 +6,16 @@ void tweak(int dummy); +void versioned_foo(void) { tweak(1); } + __asm__(".symver versioned_foo_v1, versioned_foo@@VERS_1"); -void versioned_foo_v1(void) { tweak(1); } +void versioned_foo_v1(void) { tweak(2); } __asm__(".symver versioned_foo_v2, versioned_foo@VERS_2"); -void versioned_foo_v2(void) { tweak(2); } +void versioned_foo_v2(void) { tweak(3); } __asm__(".symver versioned_foo_v3, versioned_foo@VERS_3"); -void versioned_foo_v3(void) { tweak(3); } +void versioned_foo_v3(void) { tweak(4); } // Using a libc function helps to add the "version needs" section // in addition to the "version definitions". This helps to catch |