]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgcc/config/rs6000/darwin-crt2.c
Update copyright years.
[thirdparty/gcc.git] / libgcc / config / rs6000 / darwin-crt2.c
CommitLineData
3cfe49da 1/* KeyMgr backwards-compatibility support for Darwin.
a945c346 2 Copyright (C) 2001-2024 Free Software Foundation, Inc.
3cfe49da
GK
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
748086b7 8Software Foundation; either version 3, or (at your option) any later
3cfe49da
GK
9version.
10
3cfe49da
GK
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
748086b7
JJ
16Under Section 7 of GPL version 3, you are granted additional
17permissions described in the GCC Runtime Library Exception, version
183.1, as published by the Free Software Foundation.
19
20You should have received a copy of the GNU General Public License and
21a copy of the GCC Runtime Library Exception along with this program;
22see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23<http://www.gnu.org/licenses/>. */
3cfe49da
GK
24
25/* It is incorrect to include config.h here, because this file is being
26 compiled for the target, and hence definitions concerning only the host
27 do not apply. */
28
29#include "tconfig.h"
30#include "tsystem.h"
31
2f70eed1
GK
32/* This file doesn't do anything useful on non-powerpc targets, since they
33 don't have backwards compatibility anyway. */
34
35#ifdef __ppc__
36
3cfe49da
GK
37/* Homemade decls substituting for getsect.h and dyld.h, so cross
38 compilation works. */
39struct mach_header;
40extern char *getsectdatafromheader (struct mach_header *, const char *,
41 const char *, unsigned long *);
42extern void _dyld_register_func_for_add_image
43 (void (*) (struct mach_header *, unsigned long));
44extern void _dyld_register_func_for_remove_image
45 (void (*) (struct mach_header *, unsigned long));
46
47extern void __darwin_gcc3_preregister_frame_info (void);
48
49/* These are from "keymgr.h". */
50extern void _init_keymgr (void);
51extern void *_keymgr_get_and_lock_processwide_ptr (unsigned key);
52extern void _keymgr_set_and_unlock_processwide_ptr (unsigned key, void *ptr);
53
54extern void *__keymgr_global[];
55typedef struct _Sinfo_Node {
56 unsigned int size ; /*size of this node*/
57 unsigned short major_version ; /*API major version.*/
58 unsigned short minor_version ; /*API minor version.*/
59 } _Tinfo_Node ;
60
61/* KeyMgr 3.x is the first one supporting GCC3 stuff natively. */
62#define KEYMGR_API_MAJOR_GCC3 3
63/* ... with these keys. */
64#define KEYMGR_GCC3_LIVE_IMAGE_LIST 301 /* loaded images */
65#define KEYMGR_GCC3_DW2_OBJ_LIST 302 /* Dwarf2 object list */
66
67/* Node of KEYMGR_GCC3_LIVE_IMAGE_LIST. Info about each resident image. */
68struct live_images {
69 unsigned long this_size; /* sizeof (live_images) */
70 struct mach_header *mh; /* the image info */
71 unsigned long vm_slide;
72 void (*destructor)(struct live_images *); /* destructor for this */
73 struct live_images *next;
74 unsigned int examined_p;
75 void *fde;
76 void *object_info;
77 unsigned long info[2]; /* Future use. */
78};
79
80\f
81/* These routines are used only on Darwin versions before 10.2.
82 Later versions have equivalent code in the system.
83 Eventually, they might go away, although it might be a long time... */
84
85static void darwin_unwind_dyld_remove_image_hook
86 (struct mach_header *m, unsigned long s);
87static void darwin_unwind_dyld_remove_image_hook
88 (struct mach_header *m, unsigned long s);
89extern void __darwin_gcc3_preregister_frame_info (void);
90
91static void
92darwin_unwind_dyld_add_image_hook (struct mach_header *mh, unsigned long slide)
93{
94 struct live_images *l = (struct live_images *)calloc (1, sizeof (*l));
95 l->mh = mh;
96 l->vm_slide = slide;
97 l->this_size = sizeof (*l);
98 l->next = (struct live_images *)
99 _keymgr_get_and_lock_processwide_ptr (KEYMGR_GCC3_LIVE_IMAGE_LIST);
100 _keymgr_set_and_unlock_processwide_ptr (KEYMGR_GCC3_LIVE_IMAGE_LIST, l);
101}
102
103static void
104darwin_unwind_dyld_remove_image_hook (struct mach_header *m, unsigned long s)
105{
106 struct live_images *top, **lip, *destroy = NULL;
107
108 /* Look for it in the list of live images and delete it. */
109
110 top = (struct live_images *)
111 _keymgr_get_and_lock_processwide_ptr (KEYMGR_GCC3_LIVE_IMAGE_LIST);
112 for (lip = &top; *lip != NULL; lip = &(*lip)->next)
113 {
114 if ((*lip)->mh == m && (*lip)->vm_slide == s)
115 {
116 destroy = *lip;
117 *lip = destroy->next; /* unlink DESTROY */
118
119 if (destroy->this_size != sizeof (*destroy)) /* sanity check */
120 abort ();
121
122 break;
123 }
124 }
125 _keymgr_set_and_unlock_processwide_ptr (KEYMGR_GCC3_LIVE_IMAGE_LIST, top);
126
127 /* Now that we have unlinked this from the image list, toss it. */
128 if (destroy != NULL)
129 {
130 if (destroy->destructor != NULL)
131 (*destroy->destructor) (destroy);
132 free (destroy);
133 }
134}
135
136void
137__darwin_gcc3_preregister_frame_info (void)
138{
139 const _Tinfo_Node *info;
140 _init_keymgr ();
141 info = (_Tinfo_Node *)__keymgr_global[2];
142 if (info != NULL)
143 {
144 if (info->major_version >= KEYMGR_API_MAJOR_GCC3)
145 return;
146 /* Otherwise, use our own add_image_hooks. */
147 }
148
149 _dyld_register_func_for_add_image (darwin_unwind_dyld_add_image_hook);
150 _dyld_register_func_for_remove_image (darwin_unwind_dyld_remove_image_hook);
151}
2f70eed1
GK
152
153#endif /* __ppc__ */