blob: ea411ee9a808d3ab2a37e8483befe31b9f20bd5b [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
hp.com!davidm72a03112004-05-07 00:30:27 +0000147 if [ $plat = $build_plat ]; then
148 match _U${plat}_get_elf_image
149 case $os in
150 linux*)
151 match _U${plat}_get_kernel_table
152 ;;
153 esac
154 fi
mostang.com!davidm3640bb42004-05-05 01:58:44 +0000155 ;;
hp.com!davidmd7f8bd62004-05-06 22:02:00 +0000156 x86)
157 match _U${plat}_get_elf_image
158 match _U${plat}_is_fpreg
159 match _U${plat}_dwarf_search_unwind_table
160 ;;
mostang.com!davidm3640bb42004-05-05 01:58:44 +0000161 *)
162 match _U${plat}_is_fpreg
163 match _U${plat}_dwarf_search_unwind_table
164 ;;
165 esac
166}
167
168function check_cxx_abi {
169 match _Unwind_Backtrace
170 match _Unwind_DeleteException
171 match _Unwind_FindEnclosingFunction
172 match _Unwind_ForcedUnwind
173 match _Unwind_GetBSP
174 match _Unwind_GetCFA
175 match _Unwind_GetDataRelBase
176 match _Unwind_GetGR
177 match _Unwind_GetIP
178 match _Unwind_GetLanguageSpecificData
179 match _Unwind_GetRegionStart
180 match _Unwind_GetTextRelBase
181 match _Unwind_RaiseException
182 match _Unwind_Resume
183 match _Unwind_Resume_or_Rethrow
184 match _Unwind_SetGR
185 match _Unwind_SetIP
186 case $os in
187 linux*)
188 # needed only for Intel 8.0 bug-compatibility
189 match _ReadSLEB
190 match _ReadULEB
191 ;;
192 esac
193}
194
195function check_empty {
196 if [ -n "$symtab" ]; then
197 echo -e " ERROR: Extraneous symbols:\n$symtab"
198 num_errors=`expr $num_errors + 1`
199 fi
200}
201
202if [ $plat = $build_plat ]; then
203 fetch_symtab $LIBUNWIND
204 filter_misc
205 check_local_unw_abi
206 check_cxx_abi
207 check_empty
208fi
209
210fetch_symtab $LIBUNWIND_GENERIC
211filter_misc
212check_generic_unw_abi
213check_empty
214
215if [ $num_errors -gt 0 ]; then
216 echo "FAILURE: Detected $num_errors errors"
217 exit -1
218fi
219
220if $verbose; then
221 echo " SUCCESS: all checks passed"
222fi
223exit 0