blob: e72a07a8b090d2dac5904b3037943946448860bc [file] [log] [blame]
mostang.com!davidm3640bb42004-05-05 01:58:44 +00001#!/bin/sh
2verbose=false
3if [ "$1" = "-v" ]; then
4 verbose=true
5 shift
6fi
7
8build_plat=@build_arch@
9plat=@arch@
10os=@target_os@
11num_errors=0
12
13LIBUNWIND=../src/.libs/libunwind.so
14LIBUNWIND_GENERIC=../src/.libs/libunwind-${plat}.so
15
16function fetch_symtab {
17 filename=$1
18
19 if [ ! -r $filename ]; then
20 return
21 fi
22
23 if $verbose; then
24 echo "Checking $filename..."
25 fi
26
27 #
28 # Unfortunately, "nm --defined" is a GNU-extension. For portability,
29 # build the list of defined symbols by hand.
30 #
31 symtab=`nm -g $filename`
32 saved_IFS="$IFS"
33 IFS=""
34 undef=`nm -g -u $filename`
35 for line in $undef; do
36 symtab=`echo "$symtab" | grep -v "^${line}"\$`
37 done;
38 IFS="$saved_IFS"
39}
40
41function ignore {
42 sym=$1
43 symtab=`echo "$symtab" | grep -v " ${sym}\$"`
44}
45
46function match {
47 sym=$1
48 if `echo "$symtab" | grep -q " ${sym}\$"`; then
49 symtab=`echo "$symtab" | grep -v " ${sym}\$"`
50 else
51 echo " ERROR: Symbol \"$sym\" missing."
52 num_errors=`expr $num_errors + 1`
53 fi
54}
55
56#
57# Filter out miscellaneous symbols that get defined by the
58# linker for each shared object.
59#
60function filter_misc {
61 ignore _DYNAMIC
62 ignore _GLOBAL_OFFSET_TABLE_
63 ignore __bss_start
64 ignore _edata
65 ignore _end
66 ignore _Uelf32_get_proc_name
67 ignore _Uelf32_valid_object
68 ignore _Uelf64_get_proc_name
69 ignore _Uelf64_valid_object
70 ignore _U.*debug_level
71 ignore ICRT.INTERNAL # ICC 8.x defines this
72}
73
74function check_local_unw_abi {
75 match _UL${plat}_create_addr_space
76 match _UL${plat}_destroy_addr_space
77 match _UL${plat}_get_fpreg
78 match _UL${plat}_get_proc_info
79 match _UL${plat}_get_proc_info_by_ip
80 match _UL${plat}_get_proc_name
81 match _UL${plat}_get_reg
82 match _UL${plat}_get_save_loc
83 match _UL${plat}_init_local
84 match _UL${plat}_init_remote
85 match _UL${plat}_is_signal_frame
86 match _UL${plat}_local_addr_space
87 match _UL${plat}_resume
88 match _UL${plat}_set_caching_policy
89 match _UL${plat}_set_reg
90 match _UL${plat}_set_fpreg
91 match _UL${plat}_step
92
93 match _U${plat}_flush_cache
94 match _U${plat}_get_accessors
95 match _U${plat}_getcontext
96 match _U${plat}_regname
97
98 match _U_dyn_cancel
99 match _U_dyn_info_list_addr
100 match _U_dyn_register
101
102 match backtrace
103
104 case ${plat} in
105 ia64)
106 match _UL${plat}_search_unwind_table
107 match _U${plat}_get_elf_image
108 ;;
hp.com!davidmd7f8bd62004-05-06 22:02:00 +0000109 x86)
110 match _U${plat}_get_elf_image
111 match _U${plat}_is_fpreg
112 match _UL${plat}_dwarf_search_unwind_table
113 ;;
mostang.com!davidm3640bb42004-05-05 01:58:44 +0000114 *)
hp.com!davidmd7f8bd62004-05-06 22:02:00 +0000115 match _U${plat}_is_fpreg
mostang.com!davidm3640bb42004-05-05 01:58:44 +0000116 match _UL${plat}_dwarf_search_unwind_table
117 ;;
118 esac
119}
120
121function check_generic_unw_abi {
122 match _U${plat}_create_addr_space
123 match _U${plat}_destroy_addr_space
124 match _U${plat}_flush_cache
125 match _U${plat}_get_accessors
126 match _U${plat}_get_fpreg
127 match _U${plat}_get_proc_info
128 match _U${plat}_get_proc_info_by_ip
129 match _U${plat}_get_proc_name
130 match _U${plat}_get_reg
131 match _U${plat}_get_save_loc
132 match _U${plat}_init_local
133 match _U${plat}_init_remote
134 match _U${plat}_is_signal_frame
135 match _U${plat}_local_addr_space
136 match _U${plat}_regname
137 match _U${plat}_resume
138 match _U${plat}_set_caching_policy
139 match _U${plat}_set_fpreg
140 match _U${plat}_set_reg
141 match _U${plat}_step
142
143 case ${plat} in
144 ia64)
145 match _U${plat}_search_unwind_table
146 match _U${plat}_find_dyn_list
mostang.com!davidm3640bb42004-05-05 01:58:44 +0000147 match _U${plat}_get_elf_image
mostang.com!davidm74b22fe2004-05-05 05:03:20 +0000148 case $os in
149 linux*)
150 match _U${plat}_get_kernel_table
151 ;;
152 esac
mostang.com!davidm3640bb42004-05-05 01:58:44 +0000153 ;;
hp.com!davidmd7f8bd62004-05-06 22:02:00 +0000154 x86)
155 match _U${plat}_get_elf_image
156 match _U${plat}_is_fpreg
157 match _U${plat}_dwarf_search_unwind_table
158 ;;
mostang.com!davidm3640bb42004-05-05 01:58:44 +0000159 *)
160 match _U${plat}_is_fpreg
161 match _U${plat}_dwarf_search_unwind_table
162 ;;
163 esac
164}
165
166function check_cxx_abi {
167 match _Unwind_Backtrace
168 match _Unwind_DeleteException
169 match _Unwind_FindEnclosingFunction
170 match _Unwind_ForcedUnwind
171 match _Unwind_GetBSP
172 match _Unwind_GetCFA
173 match _Unwind_GetDataRelBase
174 match _Unwind_GetGR
175 match _Unwind_GetIP
176 match _Unwind_GetLanguageSpecificData
177 match _Unwind_GetRegionStart
178 match _Unwind_GetTextRelBase
179 match _Unwind_RaiseException
180 match _Unwind_Resume
181 match _Unwind_Resume_or_Rethrow
182 match _Unwind_SetGR
183 match _Unwind_SetIP
184 case $os in
185 linux*)
186 # needed only for Intel 8.0 bug-compatibility
187 match _ReadSLEB
188 match _ReadULEB
189 ;;
190 esac
191}
192
193function check_empty {
194 if [ -n "$symtab" ]; then
195 echo -e " ERROR: Extraneous symbols:\n$symtab"
196 num_errors=`expr $num_errors + 1`
197 fi
198}
199
200if [ $plat = $build_plat ]; then
201 fetch_symtab $LIBUNWIND
202 filter_misc
203 check_local_unw_abi
204 check_cxx_abi
205 check_empty
206fi
207
208fetch_symtab $LIBUNWIND_GENERIC
209filter_misc
210check_generic_unw_abi
211check_empty
212
213if [ $num_errors -gt 0 ]; then
214 echo "FAILURE: Detected $num_errors errors"
215 exit -1
216fi
217
218if $verbose; then
219 echo " SUCCESS: all checks passed"
220fi
221exit 0