]> git.ipfire.org Git - thirdparty/gcc.git/blame - include/plugin-api.h
[c++] [testsuite] adjust contracts9.C for negative addresses
[thirdparty/gcc.git] / include / plugin-api.h
CommitLineData
d7f09764
DN
1/* plugin-api.h -- External linker plugin API. */
2
a945c346 3/* Copyright (C) 2009-2024 Free Software Foundation, Inc.
d7f09764
DN
4 Written by Cary Coutant <ccoutant@google.com>.
5
6 This file is part of binutils.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23/* This file defines the interface for writing a linker plugin, which is
24 described at < http://gcc.gnu.org/wiki/whopr/driver >. */
25
26#ifndef PLUGIN_API_H
27#define PLUGIN_API_H
28
21750c78 29#ifdef HAVE_STDINT_H
d7f09764 30#include <stdint.h>
21750c78
RE
31#elif defined(HAVE_INTTYPES_H)
32#include <inttypes.h>
33#endif
d7f09764 34#include <sys/types.h>
21750c78
RE
35#if !defined(HAVE_STDINT_H) && !defined(HAVE_INTTYPES_H) && \
36 !defined(UINT64_MAX) && !defined(uint64_t)
adcb167e 37#error cannot find uint64_t type
21750c78 38#endif
d7f09764 39
24f5a73a 40/* Detect endianess based on gcc's (>=4.6.0) __BYTE_ORDER__ macro. */
906b3eb9
ML
41#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \
42 defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_PDP_ENDIAN__)
43#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
44#define PLUGIN_LITTLE_ENDIAN 1
45#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
46#define PLUGIN_BIG_ENDIAN 1
47#elif __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__
48#define PLUGIN_PDP_ENDIAN 1
49#endif
24f5a73a 50
906b3eb9 51#else
24f5a73a 52/* Include header files to define endian macros. */
906b3eb9
ML
53#if defined(__GLIBC__) || defined(__GNU_LIBRARY__) || defined(__ANDROID__)
54#include <endian.h>
24f5a73a
AM
55
56#elif defined(__SVR4) && defined(__sun)
57#include <sys/byteorder.h>
58
59#elif defined(__FreeBSD__) || defined(__NetBSD__) || \
60 defined(__DragonFly__) || defined(__minix)
61#include <sys/endian.h>
62
63#elif defined(__OpenBSD__)
64#include <machine/endian.h>
65#endif
66
67/* Detect endianess based on __BYTE_ORDER. */
142d68f5 68#ifdef __BYTE_ORDER
906b3eb9
ML
69#if __BYTE_ORDER == __LITTLE_ENDIAN
70#define PLUGIN_LITTLE_ENDIAN 1
71#elif __BYTE_ORDER == __BIG_ENDIAN
72#define PLUGIN_BIG_ENDIAN 1
73#endif
24f5a73a 74
906b3eb9 75/* Detect endianess based on _BYTE_ORDER. */
24f5a73a 76#elif defined _BYTE_ORDER
906b3eb9
ML
77#if _BYTE_ORDER == _LITTLE_ENDIAN
78#define PLUGIN_LITTLE_ENDIAN 1
79#elif _BYTE_ORDER == _BIG_ENDIAN
80#define PLUGIN_BIG_ENDIAN 1
81#endif
24f5a73a 82
906b3eb9 83/* Detect based on _WIN32. */
24f5a73a 84#elif defined _WIN32
906b3eb9 85#define PLUGIN_LITTLE_ENDIAN 1
24f5a73a 86
906b3eb9 87/* Detect based on __BIG_ENDIAN__ and __LITTLE_ENDIAN__ */
24f5a73a 88#elif defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
906b3eb9 89#define PLUGIN_LITTLE_ENDIAN 1
24f5a73a 90#elif defined __BIG_ENDIAN__ || defined _BIG_ENDIAN
906b3eb9
ML
91#define PLUGIN_BIG_ENDIAN 1
92#endif
93#endif
94
d7f09764
DN
95#ifdef __cplusplus
96extern "C"
97{
98#endif
99
100/* Status code returned by most API routines. */
101
102enum ld_plugin_status
103{
104 LDPS_OK = 0,
105 LDPS_NO_SYMS, /* Attempt to get symbols that haven't been added. */
a12368e5 106 LDPS_BAD_HANDLE, /* No claimed object associated with given handle. */
d7f09764
DN
107 LDPS_ERR
108 /* Additional Error codes TBD. */
109};
110
111/* The version of the API specification. */
112
113enum ld_plugin_api_version
114{
115 LD_PLUGIN_API_VERSION = 1
116};
117
118/* The type of output file being generated by the linker. */
119
120enum ld_plugin_output_file_type
121{
122 LDPO_REL,
123 LDPO_EXEC,
b4cd65d1
RÁE
124 LDPO_DYN,
125 LDPO_PIE
d7f09764
DN
126};
127
128/* An input file managed by the plugin library. */
129
130struct ld_plugin_input_file
131{
132 const char *name;
133 int fd;
134 off_t offset;
135 off_t filesize;
136 void *handle;
137};
138
139/* A symbol belonging to an input file managed by the plugin library. */
140
141struct ld_plugin_symbol
142{
143 char *name;
144 char *version;
f5389e17
ML
145 /* This is for compatibility with older ABIs. The older ABI defined
146 only 'def' field. */
906b3eb9 147#if PLUGIN_BIG_ENDIAN == 1
f5389e17
ML
148 char unused;
149 char section_kind;
150 char symbol_type;
151 char def;
906b3eb9 152#elif PLUGIN_LITTLE_ENDIAN == 1
f5389e17
ML
153 char def;
154 char symbol_type;
155 char section_kind;
156 char unused;
906b3eb9
ML
157#elif PLUGIN_PDP_ENDIAN == 1
158 char symbol_type;
159 char def;
160 char unused;
161 char section_kind;
162#else
163#error "Could not detect architecture endianess"
f5389e17 164#endif
d7f09764
DN
165 int visibility;
166 uint64_t size;
167 char *comdat_key;
168 int resolution;
169};
170
8ff3369c
ST
171/* An object's section. */
172
173struct ld_plugin_section
174{
175 const void* handle;
176 unsigned int shndx;
177};
178
d7f09764
DN
179/* Whether the symbol is a definition, reference, or common, weak or not. */
180
181enum ld_plugin_symbol_kind
182{
183 LDPK_DEF,
184 LDPK_WEAKDEF,
185 LDPK_UNDEF,
186 LDPK_WEAKUNDEF,
187 LDPK_COMMON
188};
189
190/* The visibility of the symbol. */
191
192enum ld_plugin_symbol_visibility
193{
194 LDPV_DEFAULT,
195 LDPV_PROTECTED,
196 LDPV_INTERNAL,
197 LDPV_HIDDEN
198};
199
f5389e17
ML
200/* The type of the symbol. */
201
202enum ld_plugin_symbol_type
203{
204 LDST_UNKNOWN,
205 LDST_FUNCTION,
15711e83 206 LDST_VARIABLE
f5389e17
ML
207};
208
209enum ld_plugin_symbol_section_kind
210{
211 LDSSK_DEFAULT,
212 LDSSK_BSS
213};
214
d7f09764
DN
215/* How a symbol is resolved. */
216
217enum ld_plugin_symbol_resolution
218{
219 LDPR_UNKNOWN = 0,
220
221 /* Symbol is still undefined at this point. */
222 LDPR_UNDEF,
223
224 /* This is the prevailing definition of the symbol, with references from
225 regular object code. */
226 LDPR_PREVAILING_DEF,
227
228 /* This is the prevailing definition of the symbol, with no
229 references from regular objects. It is only referenced from IR
230 code. */
231 LDPR_PREVAILING_DEF_IRONLY,
232
233 /* This definition was pre-empted by a definition in a regular
234 object file. */
235 LDPR_PREEMPTED_REG,
236
237 /* This definition was pre-empted by a definition in another IR file. */
238 LDPR_PREEMPTED_IR,
239
240 /* This symbol was resolved by a definition in another IR file. */
241 LDPR_RESOLVED_IR,
242
243 /* This symbol was resolved by a definition in a regular object
244 linked into the main executable. */
245 LDPR_RESOLVED_EXEC,
246
247 /* This symbol was resolved by a definition in a shared object. */
59d605ad
CC
248 LDPR_RESOLVED_DYN,
249
250 /* This is the prevailing definition of the symbol, with no
251 references from regular objects. It is only referenced from IR
252 code, but the symbol is exported and may be referenced from
253 a dynamic object (not seen at link time). */
254 LDPR_PREVAILING_DEF_IRONLY_EXP
d7f09764
DN
255};
256
257/* The plugin library's "claim file" handler. */
258
259typedef
260enum ld_plugin_status
261(*ld_plugin_claim_file_handler) (
262 const struct ld_plugin_input_file *file, int *claimed);
263
c49d51fa
JM
264/* The plugin library's "claim file" handler, version 2. */
265
266typedef
267enum ld_plugin_status
268(*ld_plugin_claim_file_handler_v2) (
269 const struct ld_plugin_input_file *file, int *claimed, int known_used);
270
d7f09764
DN
271/* The plugin library's "all symbols read" handler. */
272
273typedef
274enum ld_plugin_status
275(*ld_plugin_all_symbols_read_handler) (void);
276
277/* The plugin library's cleanup handler. */
278
279typedef
280enum ld_plugin_status
281(*ld_plugin_cleanup_handler) (void);
282
283/* The linker's interface for registering the "claim file" handler. */
284
285typedef
286enum ld_plugin_status
287(*ld_plugin_register_claim_file) (ld_plugin_claim_file_handler handler);
288
c49d51fa
JM
289/* The linker's interface for registering the "claim file" handler,
290 version 2. */
291
292typedef
293enum ld_plugin_status
294(*ld_plugin_register_claim_file_v2) (ld_plugin_claim_file_handler_v2 handler);
295
d7f09764
DN
296/* The linker's interface for registering the "all symbols read" handler. */
297
298typedef
299enum ld_plugin_status
300(*ld_plugin_register_all_symbols_read) (
301 ld_plugin_all_symbols_read_handler handler);
302
303/* The linker's interface for registering the cleanup handler. */
304
305typedef
306enum ld_plugin_status
307(*ld_plugin_register_cleanup) (ld_plugin_cleanup_handler handler);
308
309/* The linker's interface for adding symbols from a claimed input file. */
310
311typedef
312enum ld_plugin_status
313(*ld_plugin_add_symbols) (void *handle, int nsyms,
314 const struct ld_plugin_symbol *syms);
315
a12368e5
RAE
316/* The linker's interface for getting the input file information with
317 an open (possibly re-opened) file descriptor. */
318
319typedef
320enum ld_plugin_status
321(*ld_plugin_get_input_file) (const void *handle,
322 struct ld_plugin_input_file *file);
323
40fb5033
RÁE
324typedef
325enum ld_plugin_status
326(*ld_plugin_get_view) (const void *handle, const void **viewp);
327
a12368e5
RAE
328/* The linker's interface for releasing the input file. */
329
330typedef
331enum ld_plugin_status
332(*ld_plugin_release_input_file) (const void *handle);
333
d7f09764
DN
334/* The linker's interface for retrieving symbol resolution information. */
335
336typedef
337enum ld_plugin_status
338(*ld_plugin_get_symbols) (const void *handle, int nsyms,
339 struct ld_plugin_symbol *syms);
340
341/* The linker's interface for adding a compiled input file. */
342
343typedef
344enum ld_plugin_status
47f3e769 345(*ld_plugin_add_input_file) (const char *pathname);
d7f09764 346
a12368e5
RAE
347/* The linker's interface for adding a library that should be searched. */
348
349typedef
350enum ld_plugin_status
47f3e769 351(*ld_plugin_add_input_library) (const char *libname);
a12368e5 352
c8259dd9
RAE
353/* The linker's interface for adding a library path that should be searched. */
354
355typedef
356enum ld_plugin_status
357(*ld_plugin_set_extra_library_path) (const char *path);
358
d7f09764
DN
359/* The linker's interface for issuing a warning or error message. */
360
361typedef
362enum ld_plugin_status
a12368e5 363(*ld_plugin_message) (int level, const char *format, ...);
d7f09764 364
8ff3369c
ST
365/* The linker's interface for retrieving the number of sections in an object.
366 The handle is obtained in the claim_file handler. This interface should
367 only be invoked in the claim_file handler. This function sets *COUNT to
368 the number of sections in the object. */
369
370typedef
371enum ld_plugin_status
372(*ld_plugin_get_input_section_count) (const void* handle, unsigned int *count);
373
374/* The linker's interface for retrieving the section type of a specific
375 section in an object. This interface should only be invoked in the
376 claim_file handler. This function sets *TYPE to an ELF SHT_xxx value. */
377
378typedef
379enum ld_plugin_status
380(*ld_plugin_get_input_section_type) (const struct ld_plugin_section section,
381 unsigned int *type);
382
383/* The linker's interface for retrieving the name of a specific section in
384 an object. This interface should only be invoked in the claim_file handler.
385 This function sets *SECTION_NAME_PTR to a null-terminated buffer allocated
386 by malloc. The plugin must free *SECTION_NAME_PTR. */
387
388typedef
389enum ld_plugin_status
390(*ld_plugin_get_input_section_name) (const struct ld_plugin_section section,
391 char **section_name_ptr);
392
393/* The linker's interface for retrieving the contents of a specific section
394 in an object. This interface should only be invoked in the claim_file
395 handler. This function sets *SECTION_CONTENTS to point to a buffer that is
396 valid until clam_file handler returns. It sets *LEN to the size of the
397 buffer. */
398
399typedef
400enum ld_plugin_status
401(*ld_plugin_get_input_section_contents) (const struct ld_plugin_section section,
402 const unsigned char **section_contents,
403 size_t* len);
404
405/* The linker's interface for specifying the desired order of sections.
406 The sections should be specifed using the array SECTION_LIST in the
407 order in which they should appear in the final layout. NUM_SECTIONS
408 specifies the number of entries in each array. This should be invoked
409 in the all_symbols_read handler. */
410
411typedef
412enum ld_plugin_status
413(*ld_plugin_update_section_order) (const struct ld_plugin_section *section_list,
414 unsigned int num_sections);
415
416/* The linker's interface for specifying that reordering of sections is
417 desired so that the linker can prepare for it. This should be invoked
418 before update_section_order, preferably in the claim_file handler. */
419
420typedef
421enum ld_plugin_status
422(*ld_plugin_allow_section_ordering) (void);
423
36ec6d1c
ST
424/* The linker's interface for specifying that a subset of sections is
425 to be mapped to a unique segment. If the plugin wants to call
426 unique_segment_for_sections, it must call this function from a
427 claim_file_handler or when it is first loaded. */
428
429typedef
430enum ld_plugin_status
431(*ld_plugin_allow_unique_segment_for_sections) (void);
432
433/* The linker's interface for specifying that a specific set of sections
434 must be mapped to a unique segment. ELF segments do not have names
435 and the NAME is used as the name of the newly created output section
436 that is then placed in the unique PT_LOAD segment. FLAGS is used to
437 specify if any additional segment flags need to be set. For instance,
438 a specific segment flag can be set to identify this segment. Unsetting
439 segment flags that would be set by default is not possible. The
440 parameter SEGMENT_ALIGNMENT when non-zero will override the default. */
441
442typedef
443enum ld_plugin_status
444(*ld_plugin_unique_segment_for_sections) (
445 const char* segment_name,
446 uint64_t segment_flags,
447 uint64_t segment_alignment,
448 const struct ld_plugin_section * section_list,
449 unsigned int num_sections);
450
e94da7c6
CC
451/* The linker's interface for retrieving the section alignment requirement
452 of a specific section in an object. This interface should only be invoked in the
453 claim_file handler. This function sets *ADDRALIGN to the ELF sh_addralign
454 value of the input section. */
455
456typedef
457enum ld_plugin_status
458(*ld_plugin_get_input_section_alignment) (const struct ld_plugin_section section,
459 unsigned int *addralign);
460
461/* The linker's interface for retrieving the section size of a specific section
462 in an object. This interface should only be invoked in the claim_file handler.
463 This function sets *SECSIZE to the ELF sh_size
464 value of the input section. */
465
466typedef
467enum ld_plugin_status
468(*ld_plugin_get_input_section_size) (const struct ld_plugin_section section,
469 uint64_t *secsize);
470
f382ac6d
SC
471typedef
472enum ld_plugin_status
473(*ld_plugin_new_input_handler) (const struct ld_plugin_input_file *file);
474
475/* The linker's interface for registering the "new_input" handler. This handler
476 will be notified when a new input file has been added after the
477 all_symbols_read event, allowing the plugin to, for example, set a unique
478 segment for sections in plugin-generated input files. */
479
480typedef
481enum ld_plugin_status
482(*ld_plugin_register_new_input) (ld_plugin_new_input_handler handler);
483
01f30ce6
ST
484/* The linker's interface for getting the list of wrapped symbols using the
485 --wrap option. This sets *NUM_SYMBOLS to number of wrapped symbols and
486 *WRAP_SYMBOL_LIST to the list of wrapped symbols. */
487
488typedef
489enum ld_plugin_status
490(*ld_plugin_get_wrap_symbols) (uint64_t *num_symbols,
491 const char ***wrap_symbol_list);
f382ac6d 492
d7f09764
DN
493enum ld_plugin_level
494{
495 LDPL_INFO,
496 LDPL_WARNING,
497 LDPL_ERROR,
498 LDPL_FATAL
499};
500
32a75350
ML
501/* Contract between a plug-in and a linker. */
502
503enum linker_api_version
504{
505 /* The linker/plugin do not implement any of the API levels below, the API
506 is determined solely via the transfer vector. */
507 LAPI_V0,
508
509 /* API level v1. The linker provides get_symbols_v3, add_symbols_v2,
510 the plugin will use that and not any lower versions.
511 claim_file is thread-safe on the plugin side and
512 add_symbols on the linker side. */
513 LAPI_V1
514};
515
516/* The linker's interface for API version negotiation. A plug-in calls
517 the function (with its IDENTIFIER and VERSION), plus minimal and maximal
518 version of linker_api_version is provided. Linker then returns selected
519 API version and provides its IDENTIFIER and VERSION. The returned value
520 by linker must be in range [MINIMAL_API_SUPPORTED, MAXIMAL_API_SUPPORTED].
521 Identifier pointers remain valid as long as the plugin is loaded. */
522
523typedef
524int
525(*ld_plugin_get_api_version) (const char *plugin_identifier,
526 const char *plugin_version,
527 int minimal_api_supported,
528 int maximal_api_supported,
529 const char **linker_identifier,
530 const char **linker_version);
531
d7f09764
DN
532/* Values for the tv_tag field of the transfer vector. */
533
534enum ld_plugin_tag
535{
c4ae1758
ML
536 LDPT_NULL,
537 LDPT_API_VERSION,
538 LDPT_GOLD_VERSION,
539 LDPT_LINKER_OUTPUT,
540 LDPT_OPTION,
541 LDPT_REGISTER_CLAIM_FILE_HOOK,
542 LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK,
543 LDPT_REGISTER_CLEANUP_HOOK,
544 LDPT_ADD_SYMBOLS,
545 LDPT_GET_SYMBOLS,
546 LDPT_ADD_INPUT_FILE,
547 LDPT_MESSAGE,
548 LDPT_GET_INPUT_FILE,
549 LDPT_RELEASE_INPUT_FILE,
550 LDPT_ADD_INPUT_LIBRARY,
551 LDPT_OUTPUT_NAME,
552 LDPT_SET_EXTRA_LIBRARY_PATH,
553 LDPT_GNU_LD_VERSION,
554 LDPT_GET_VIEW,
555 LDPT_GET_INPUT_SECTION_COUNT,
556 LDPT_GET_INPUT_SECTION_TYPE,
557 LDPT_GET_INPUT_SECTION_NAME,
558 LDPT_GET_INPUT_SECTION_CONTENTS,
559 LDPT_UPDATE_SECTION_ORDER,
560 LDPT_ALLOW_SECTION_ORDERING,
561 LDPT_GET_SYMBOLS_V2,
562 LDPT_ALLOW_UNIQUE_SEGMENT_FOR_SECTIONS,
563 LDPT_UNIQUE_SEGMENT_FOR_SECTIONS,
564 LDPT_GET_SYMBOLS_V3,
565 LDPT_GET_INPUT_SECTION_ALIGNMENT,
566 LDPT_GET_INPUT_SECTION_SIZE,
567 LDPT_REGISTER_NEW_INPUT_HOOK,
568 LDPT_GET_WRAP_SYMBOLS,
569 LDPT_ADD_SYMBOLS_V2,
32a75350 570 LDPT_GET_API_VERSION,
c49d51fa 571 LDPT_REGISTER_CLAIM_FILE_HOOK_V2
d7f09764
DN
572};
573
574/* The plugin transfer vector. */
575
576struct ld_plugin_tv
577{
578 enum ld_plugin_tag tv_tag;
579 union
580 {
581 int tv_val;
582 const char *tv_string;
583 ld_plugin_register_claim_file tv_register_claim_file;
c49d51fa 584 ld_plugin_register_claim_file_v2 tv_register_claim_file_v2;
d7f09764
DN
585 ld_plugin_register_all_symbols_read tv_register_all_symbols_read;
586 ld_plugin_register_cleanup tv_register_cleanup;
587 ld_plugin_add_symbols tv_add_symbols;
588 ld_plugin_get_symbols tv_get_symbols;
589 ld_plugin_add_input_file tv_add_input_file;
590 ld_plugin_message tv_message;
a12368e5 591 ld_plugin_get_input_file tv_get_input_file;
40fb5033 592 ld_plugin_get_view tv_get_view;
a12368e5
RAE
593 ld_plugin_release_input_file tv_release_input_file;
594 ld_plugin_add_input_library tv_add_input_library;
c8259dd9 595 ld_plugin_set_extra_library_path tv_set_extra_library_path;
8ff3369c
ST
596 ld_plugin_get_input_section_count tv_get_input_section_count;
597 ld_plugin_get_input_section_type tv_get_input_section_type;
598 ld_plugin_get_input_section_name tv_get_input_section_name;
599 ld_plugin_get_input_section_contents tv_get_input_section_contents;
600 ld_plugin_update_section_order tv_update_section_order;
601 ld_plugin_allow_section_ordering tv_allow_section_ordering;
36ec6d1c
ST
602 ld_plugin_allow_unique_segment_for_sections tv_allow_unique_segment_for_sections;
603 ld_plugin_unique_segment_for_sections tv_unique_segment_for_sections;
e94da7c6
CC
604 ld_plugin_get_input_section_alignment tv_get_input_section_alignment;
605 ld_plugin_get_input_section_size tv_get_input_section_size;
f382ac6d 606 ld_plugin_register_new_input tv_register_new_input;
01f30ce6 607 ld_plugin_get_wrap_symbols tv_get_wrap_symbols;
32a75350 608 ld_plugin_get_api_version tv_get_api_version;
d7f09764
DN
609 } tv_u;
610};
611
612/* The plugin library's "onload" entry point. */
613
614typedef
615enum ld_plugin_status
616(*ld_plugin_onload) (struct ld_plugin_tv *tv);
617
618#ifdef __cplusplus
e5dd62e2 619}
d7f09764
DN
620#endif
621
622#endif /* !defined(PLUGIN_API_H) */