xref: /netbsd-src/external/gpl3/binutils.old/dist/bfd/elf32-arm.h (revision c42dbd0ed2e61fe6eda8590caa852ccf34719964)
1867d70fcSchristos /* 32-bit ELF support for ARM
2*c42dbd0eSchristos    Copyright (C) 2019-2022 Free Software Foundation, Inc.
3867d70fcSchristos 
4867d70fcSchristos    This file is part of BFD, the Binary File Descriptor library.
5867d70fcSchristos 
6867d70fcSchristos    This program is free software; you can redistribute it and/or modify
7867d70fcSchristos    it under the terms of the GNU General Public License as published by
8867d70fcSchristos    the Free Software Foundation; either version 3 of the License, or
9867d70fcSchristos    (at your option) any later version.
10867d70fcSchristos 
11867d70fcSchristos    This program is distributed in the hope that it will be useful,
12867d70fcSchristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
13867d70fcSchristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14867d70fcSchristos    GNU General Public License for more details.
15867d70fcSchristos 
16867d70fcSchristos    You should have received a copy of the GNU General Public License
17867d70fcSchristos    along with this program; if not, write to the Free Software
18867d70fcSchristos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19867d70fcSchristos    MA 02110-1301, USA.  */
20867d70fcSchristos 
21867d70fcSchristos 
22867d70fcSchristos /* ARM VFP11 erratum workaround support.  */
23867d70fcSchristos typedef enum
24867d70fcSchristos {
25867d70fcSchristos   BFD_ARM_VFP11_FIX_DEFAULT,
26867d70fcSchristos   BFD_ARM_VFP11_FIX_NONE,
27867d70fcSchristos   BFD_ARM_VFP11_FIX_SCALAR,
28867d70fcSchristos   BFD_ARM_VFP11_FIX_VECTOR
29867d70fcSchristos } bfd_arm_vfp11_fix;
30867d70fcSchristos 
31867d70fcSchristos extern void bfd_elf32_arm_init_maps
32867d70fcSchristos   (bfd *);
33867d70fcSchristos 
34867d70fcSchristos extern void bfd_elf32_arm_set_vfp11_fix
35867d70fcSchristos   (bfd *, struct bfd_link_info *);
36867d70fcSchristos 
37867d70fcSchristos extern void bfd_elf32_arm_set_cortex_a8_fix
38867d70fcSchristos   (bfd *, struct bfd_link_info *);
39867d70fcSchristos 
40*c42dbd0eSchristos extern bool bfd_elf32_arm_vfp11_erratum_scan
41867d70fcSchristos   (bfd *, struct bfd_link_info *);
42867d70fcSchristos 
43867d70fcSchristos extern void bfd_elf32_arm_vfp11_fix_veneer_locations
44867d70fcSchristos   (bfd *, struct bfd_link_info *);
45867d70fcSchristos 
46867d70fcSchristos /* ARM STM STM32L4XX erratum workaround support.  */
47867d70fcSchristos typedef enum
48867d70fcSchristos {
49867d70fcSchristos   BFD_ARM_STM32L4XX_FIX_NONE,
50867d70fcSchristos   BFD_ARM_STM32L4XX_FIX_DEFAULT,
51867d70fcSchristos   BFD_ARM_STM32L4XX_FIX_ALL
52867d70fcSchristos } bfd_arm_stm32l4xx_fix;
53867d70fcSchristos 
54867d70fcSchristos extern void bfd_elf32_arm_set_stm32l4xx_fix
55867d70fcSchristos   (bfd *, struct bfd_link_info *);
56867d70fcSchristos 
57*c42dbd0eSchristos extern bool bfd_elf32_arm_stm32l4xx_erratum_scan
58867d70fcSchristos   (bfd *, struct bfd_link_info *);
59867d70fcSchristos 
60867d70fcSchristos extern void bfd_elf32_arm_stm32l4xx_fix_veneer_locations
61867d70fcSchristos   (bfd *, struct bfd_link_info *);
62867d70fcSchristos 
63867d70fcSchristos /* ELF ARM Interworking support.  Called from linker.  */
64*c42dbd0eSchristos extern bool bfd_elf32_arm_allocate_interworking_sections
65867d70fcSchristos   (struct bfd_link_info *);
66867d70fcSchristos 
67*c42dbd0eSchristos extern bool bfd_elf32_arm_process_before_allocation
68867d70fcSchristos   (bfd *, struct bfd_link_info *);
69867d70fcSchristos 
70867d70fcSchristos struct elf32_arm_params {
71867d70fcSchristos   char *thumb_entry_symbol;
72867d70fcSchristos   int byteswap_code;
73867d70fcSchristos   int target1_is_rel;
74867d70fcSchristos   char * target2_type;
75867d70fcSchristos   int fix_v4bx;
76867d70fcSchristos   int use_blx;
77867d70fcSchristos   bfd_arm_vfp11_fix vfp11_denorm_fix;
78867d70fcSchristos   bfd_arm_stm32l4xx_fix stm32l4xx_fix;
79867d70fcSchristos   int no_enum_size_warning;
80867d70fcSchristos   int no_wchar_size_warning;
81867d70fcSchristos   int pic_veneer;
82867d70fcSchristos   int fix_cortex_a8;
83867d70fcSchristos   int fix_arm1176;
84867d70fcSchristos   int merge_exidx_entries;
85867d70fcSchristos   int cmse_implib;
86867d70fcSchristos   bfd *in_implib_bfd;
87867d70fcSchristos };
88867d70fcSchristos 
89867d70fcSchristos void bfd_elf32_arm_set_target_params
90867d70fcSchristos   (bfd *, struct bfd_link_info *, struct elf32_arm_params *);
91867d70fcSchristos 
92*c42dbd0eSchristos extern bool bfd_elf32_arm_get_bfd_for_interworking
93867d70fcSchristos   (bfd *, struct bfd_link_info *);
94867d70fcSchristos 
95*c42dbd0eSchristos extern bool bfd_elf32_arm_add_glue_sections_to_bfd
96867d70fcSchristos   (bfd *, struct bfd_link_info *);
97867d70fcSchristos 
98867d70fcSchristos extern void bfd_elf32_arm_keep_private_stub_output_sections
99867d70fcSchristos   (struct bfd_link_info *);
100867d70fcSchristos 
101867d70fcSchristos extern void bfd_elf32_arm_set_byteswap_code
102867d70fcSchristos   (struct bfd_link_info *, int);
103867d70fcSchristos 
104867d70fcSchristos extern void bfd_elf32_arm_use_long_plt (void);
105867d70fcSchristos 
106867d70fcSchristos /* ARM stub generation support.  Called from the linker.  */
107867d70fcSchristos extern int elf32_arm_setup_section_lists
108867d70fcSchristos   (bfd *, struct bfd_link_info *);
109867d70fcSchristos extern void elf32_arm_next_input_section
110867d70fcSchristos   (struct bfd_link_info *, struct bfd_section *);
111*c42dbd0eSchristos extern bool elf32_arm_size_stubs
112867d70fcSchristos   (bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma,
113867d70fcSchristos    struct bfd_section * (*) (const char *, struct bfd_section *,
114867d70fcSchristos 			     struct bfd_section *, unsigned int),
115867d70fcSchristos    void (*) (void));
116*c42dbd0eSchristos extern bool elf32_arm_build_stubs
117867d70fcSchristos   (struct bfd_link_info *);
118867d70fcSchristos 
119867d70fcSchristos /* ARM unwind section editing support.  */
120*c42dbd0eSchristos extern bool elf32_arm_fix_exidx_coverage
121*c42dbd0eSchristos (struct bfd_section **, unsigned int, struct bfd_link_info *, bool);
122