Free errstring if _dl_addr doesn't returns 0
[glibc.git] / sysdeps / sh / ____longjmp_chk.S
blobb37a94861cf9bcc9d617cc4f25a8f678799a63a6
1 /* Copyright (C) 2009-2012 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <http://www.gnu.org/licenses/>.  */
18         .section .rodata.str1.1,"aMS",@progbits,1
19         .type   longjmp_msg,@object
20 longjmp_msg:
21         .string "longjmp causes uninitialized stack frame"
22         .size   longjmp_msg, .-longjmp_msg
23         .text
25 #define __longjmp ____longjmp_chk
27 #ifdef PIC
28 # define CALL_FAIL \
29         mov.l   .Lfail, r1;                             \
30         mov.l   .Lstr, r4;                              \
31         mov.l   r12, @-r15;                             \
32         cfi_remember_state;                             \
33         cfi_adjust_cfa_offset (4);                      \
34         cfi_rel_offset (r12, 0);                        \
35         mova    .Lgot, r0;                              \
36         mov.l   .Lgot, r12;                             \
37         add     r0, r12;                                \
38         sts.l   pr, @-r15;                              \
39         cfi_adjust_cfa_offset (4);                      \
40         cfi_rel_offset (pr, 0);                         \
41         bsrf    r1;                                     \
42          add    r12, r4;                                \
43         /* Unreachable.  */                             \
44 .Lfail0:                                                \
45         .align  2;                                      \
46 .Lgot:                                                  \
47         .long   _GLOBAL_OFFSET_TABLE_;                  \
48 .Lstr:                                                  \
49         .long   longjmp_msg@GOTOFF;                     \
50 .Lfail:                                                 \
51         .long   __GI___fortify_fail@PLT-(.Lfail0-.);    \
52         cfi_restore_state;
53 #else
54 # define CALL_FAIL \
55         mov.l   .Lfail, r1;                             \
56         mov.l   .Lstr, r4;                              \
57         sts.l   pr, @-r15;                              \
58         cfi_remember_state;                             \
59         cfi_adjust_cfa_offset (4);                      \
60         cfi_rel_offset (pr, 0);                         \
61         jsr     @r1;                                    \
62          nop;                                           \
63         /* Unreachable.  */                             \
64         .align  2;                                      \
65 .Lstr:                                                  \
66         .long   longjmp_msg;                            \
67 .Lfail:                                                 \
68         .long   __fortify_fail;                         \
69         cfi_restore_state;
70 #endif
72 #define CHECK_SP(reg) \
73         cmp/hs  r15, reg;                               \
74         bt      .Lok;                                   \
75         CALL_FAIL                                       \
76 .Lok:
78 #include <__longjmp.S>