Initial import
[external/libunwind.git] / tests / check-namespace.sh.in
1 #!/bin/sh
2 verbose=false
3 if [ "$1" = "-v" ]; then
4     verbose=true
5     shift
6 fi
7
8 build_plat=@build_arch@
9 plat=@arch@
10 os=@target_os@
11 num_errors=0
12
13 LIBUNWIND=../src/.libs/libunwind.so
14 LIBUNWIND_GENERIC=../src/.libs/libunwind-${plat}.so
15
16 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
41 ignore () {
42     sym=$1
43     symtab=`echo "$symtab" | grep -v " ${sym}\$"`
44 }
45
46 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 #
60 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     # Ignore symbols generated by the ARM Linux default linker script.
74     # For details see the binutils sources (src/ld/emulparams/armelf_linux.sh).
75     if [ ${plat} = "arm" ]; then
76         ignore __bss_start__
77         ignore __bss_end__
78         ignore __end__
79         ignore _bss_end__
80     fi
81
82     if [ ${plat} = "mips" ]; then
83         ignore _fbss
84         ignore _fdata
85         ignore _ftext
86         ignore _gp
87     fi
88 }
89
90 check_local_unw_abi () {
91     match _UL${plat}_create_addr_space
92     match _UL${plat}_destroy_addr_space
93     match _UL${plat}_get_fpreg
94     match _UL${plat}_get_proc_info
95     match _UL${plat}_get_proc_info_by_ip
96     match _UL${plat}_get_proc_name
97     match _UL${plat}_get_reg
98     match _UL${plat}_get_save_loc
99     match _UL${plat}_init_local
100     match _UL${plat}_init_remote
101     match _UL${plat}_is_signal_frame
102     match _UL${plat}_handle_signal_frame
103     match _UL${plat}_local_addr_space
104     match _UL${plat}_resume
105     match _UL${plat}_set_caching_policy
106     match _UL${plat}_set_reg
107     match _UL${plat}_set_fpreg
108     match _UL${plat}_step
109
110     match _U${plat}_flush_cache
111     match _U${plat}_get_accessors
112     match _U${plat}_getcontext
113     match _U${plat}_regname
114     match _U${plat}_strerror
115
116     match _U_dyn_cancel
117     match _U_dyn_info_list_addr
118     match _U_dyn_register
119
120     match unw_backtrace
121     match backtrace
122
123     case ${plat} in
124         arm)
125             match _U${plat}_get_elf_image
126             match _U${plat}_is_fpreg
127             match _UL${plat}_search_unwind_table
128             match _UL${plat}_dwarf_search_unwind_table
129             match _UL${plat}_dwarf_find_unwind_table
130             ;;
131         hppa)
132             match _UL${plat}_dwarf_search_unwind_table
133             match _UL${plat}_dwarf_find_unwind_table
134             match _U${plat}_get_elf_image
135             match _U${plat}_setcontext
136             ;;
137         ia64)
138             match _UL${plat}_search_unwind_table
139             match _U${plat}_get_elf_image
140             ;;
141         x86)
142             match _U${plat}_get_elf_image
143             match _U${plat}_is_fpreg
144             match _UL${plat}_dwarf_search_unwind_table
145             match _UL${plat}_dwarf_find_unwind_table
146             ;;
147         x86_64)
148             match _U${plat}_get_elf_image
149             match _U${plat}_is_fpreg
150             match _UL${plat}_dwarf_search_unwind_table
151             match _UL${plat}_dwarf_find_unwind_table
152             match _U${plat}_setcontext
153             ;;
154         ppc*)
155             match _U${plat}_get_func_addr
156             match _U${plat}_get_elf_image
157             match _U${plat}_is_fpreg
158             match _UL${plat}_dwarf_search_unwind_table
159             match _UL${plat}_dwarf_find_unwind_table
160             ;;
161         *)
162             match _U${plat}_is_fpreg
163             match _UL${plat}_dwarf_search_unwind_table
164             match _UL${plat}_dwarf_find_unwind_table
165             ;;
166     esac
167
168     if [ x@enable_debug_frame@ = xyes ]; then
169         match _UL${plat}_dwarf_find_debug_frame
170     fi
171
172 }
173
174 check_generic_unw_abi () {
175     match _U${plat}_create_addr_space
176     match _U${plat}_destroy_addr_space
177     match _U${plat}_flush_cache
178     match _U${plat}_get_accessors
179     match _U${plat}_get_fpreg
180     match _U${plat}_get_proc_info
181     match _U${plat}_get_proc_info_by_ip
182     match _U${plat}_get_proc_name
183     match _U${plat}_get_reg
184     match _U${plat}_get_save_loc
185     match _U${plat}_init_local
186     match _U${plat}_init_remote
187     match _U${plat}_is_signal_frame
188     match _U${plat}_handle_signal_frame
189     match _U${plat}_local_addr_space
190     match _U${plat}_regname
191     match _U${plat}_resume
192     match _U${plat}_set_caching_policy
193     match _U${plat}_set_fpreg
194     match _U${plat}_set_reg
195     match _U${plat}_step
196     match _U${plat}_strerror
197
198     case ${plat} in
199         arm)
200             match _U${plat}_is_fpreg
201             match _U${plat}_get_elf_image
202             match _U${plat}_search_unwind_table
203             match _U${plat}_dwarf_search_unwind_table
204             match _U${plat}_dwarf_find_unwind_table
205             ;;
206         hppa)
207             match _U${plat}_dwarf_search_unwind_table
208             match _U${plat}_dwarf_find_unwind_table
209             match _U${plat}_get_elf_image
210             ;;
211         ia64)
212             match _U${plat}_search_unwind_table
213             match _U${plat}_find_dyn_list
214             if [ $plat = $build_plat ]; then
215                 match _U${plat}_get_elf_image
216                 case $os in
217                     linux*)
218                         match _U${plat}_get_kernel_table
219                         ;;
220                 esac
221             fi
222             ;;
223         x86)
224             match _U${plat}_get_elf_image
225             match _U${plat}_is_fpreg
226             match _U${plat}_dwarf_search_unwind_table
227             match _U${plat}_dwarf_find_unwind_table
228             ;;
229         x86_64)
230             match _U${plat}_get_elf_image
231             match _U${plat}_is_fpreg
232             match _U${plat}_dwarf_search_unwind_table
233             match _U${plat}_dwarf_find_unwind_table
234             ;;
235         ppc*)
236             match _U${plat}_get_elf_image
237             match _U${plat}_get_func_addr
238             match _U${plat}_is_fpreg
239             match _U${plat}_dwarf_search_unwind_table
240             match _U${plat}_dwarf_find_unwind_table
241             ;;
242         *)
243             match _U${plat}_is_fpreg
244             match _U${plat}_dwarf_search_unwind_table
245             match _U${plat}_dwarf_find_unwind_table
246             ;;
247     esac
248
249     if [ x@enable_debug_frame@ = xyes ]; then
250         match _U${plat}_dwarf_find_debug_frame
251     fi
252 }
253
254 check_cxx_abi () {
255     match _Unwind_Backtrace
256     match _Unwind_DeleteException
257     match _Unwind_FindEnclosingFunction
258     match _Unwind_ForcedUnwind
259     match _Unwind_GetBSP
260     match _Unwind_GetCFA
261     match _Unwind_GetDataRelBase
262     match _Unwind_GetGR
263     match _Unwind_GetIP
264     match _Unwind_GetIPInfo
265     match _Unwind_GetLanguageSpecificData
266     match _Unwind_GetRegionStart
267     match _Unwind_GetTextRelBase
268     match _Unwind_RaiseException
269     match _Unwind_Resume
270     match _Unwind_Resume_or_Rethrow
271     match _Unwind_SetGR
272     match _Unwind_SetIP
273     match __libunwind_Unwind_Backtrace
274     match __libunwind_Unwind_DeleteException
275     match __libunwind_Unwind_FindEnclosingFunction
276     match __libunwind_Unwind_ForcedUnwind
277     match __libunwind_Unwind_GetBSP
278     match __libunwind_Unwind_GetCFA
279     match __libunwind_Unwind_GetDataRelBase
280     match __libunwind_Unwind_GetGR
281     match __libunwind_Unwind_GetIP
282     match __libunwind_Unwind_GetIPInfo
283     match __libunwind_Unwind_GetLanguageSpecificData
284     match __libunwind_Unwind_GetRegionStart
285     match __libunwind_Unwind_GetTextRelBase
286     match __libunwind_Unwind_RaiseException
287     match __libunwind_Unwind_Resume
288     match __libunwind_Unwind_Resume_or_Rethrow
289     match __libunwind_Unwind_SetGR
290     match __libunwind_Unwind_SetIP
291     case $os in
292         linux*)
293             # needed only for Intel 8.0 bug-compatibility
294             match _ReadSLEB
295             match _ReadULEB
296             ;;
297     esac
298 }
299
300 check_empty () {
301     if [ -n "$symtab" ]; then
302         printf "  ERROR: Extraneous symbols:\n$symtab\n"
303         num_errors=`expr $num_errors + 1`
304     fi
305 }
306
307 if [ $plat = $build_plat ]; then
308     fetch_symtab $LIBUNWIND
309     filter_misc
310     check_local_unw_abi
311     if [ x@enable_cxx_exceptions@ = xyes ]; then
312       check_cxx_abi
313     fi
314     check_empty
315 fi
316
317 fetch_symtab $LIBUNWIND_GENERIC
318 filter_misc
319 check_generic_unw_abi
320 check_empty
321
322 if [ $num_errors -gt 0 ]; then
323     echo "FAILURE: Detected $num_errors errors"
324     exit 1
325 fi
326
327 if $verbose; then
328     echo "  SUCCESS: all checks passed"
329 fi
330 exit 0