(root)/
gcc-13.2.0/
gcc/
config/
openbsd.h
       1  /* Base configuration file for all OpenBSD targets.
       2     Copyright (C) 1999-2023 Free Software Foundation, Inc.
       3  
       4  This file is part of GCC.
       5  
       6  GCC is free software; you can redistribute it and/or modify
       7  it under the terms of the GNU General Public License as published by
       8  the Free Software Foundation; either version 3, or (at your option)
       9  any later version.
      10  
      11  GCC is distributed in the hope that it will be useful,
      12  but WITHOUT ANY WARRANTY; without even the implied warranty of
      13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14  GNU General Public License for more details.
      15  
      16  You should have received a copy of the GNU General Public License
      17  along with GCC; see the file COPYING3.  If not see
      18  <http://www.gnu.org/licenses/>.  */
      19  
      20  /* Common OpenBSD configuration. 
      21     All OpenBSD architectures include this file, which is intended as
      22     a repository for common defines. 
      23  
      24     Some defines are common to all architectures, a few of them are
      25     triggered by OBSD_* guards, so that we won't override architecture
      26     defaults by mistakes.
      27  
      28     OBSD_HAS_CORRECT_SPECS: 
      29        another mechanism provides correct specs already.
      30     OBSD_NO_DYNAMIC_LIBRARIES: 
      31        no implementation of dynamic libraries.
      32     OBSD_OLD_GAS: 
      33        older flavor of gas which needs help for PIC.
      34     OBSD_HAS_DECLARE_FUNCTION_NAME, OBSD_HAS_DECLARE_FUNCTION_SIZE,
      35     OBSD_HAS_DECLARE_OBJECT: 
      36        PIC support, FUNCTION_NAME/FUNCTION_SIZE are independent, whereas
      37        the corresponding logic for OBJECTS is necessarily coupled.
      38  
      39     There are also a few `default' defines such as ASM_WEAKEN_LABEL,
      40     intended as common ground for arch that don't provide 
      41     anything suitable.  */
      42  
      43  /* OPENBSD_NATIVE is defined only when gcc is configured as part of
      44     the OpenBSD source tree, specifically through Makefile.bsd-wrapper.
      45  
      46     In such a case the include path can be trimmed as there is no
      47     distinction between system includes and gcc includes.  */
      48  
      49  /* This configuration method, namely Makefile.bsd-wrapper and
      50     OPENBSD_NATIVE is NOT recommended for building cross-compilers.  */
      51  
      52  #ifdef OPENBSD_NATIVE
      53  
      54  /* The compiler is configured with ONLY the gcc/g++ standard headers.  */
      55  #undef INCLUDE_DEFAULTS
      56  #define INCLUDE_DEFAULTS			\
      57    {						\
      58      { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 },	\
      59      { GPLUSPLUS_TOOL_INCLUDE_DIR, "G++", 1, 1 }, \
      60      { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1 }, \
      61      { NATIVE_SYSTEM_HEADER_DIR, NATIVE_SYSTEM_HEADER_COMPONENT, 0, 0 }, \
      62      { 0, 0, 0, 0 }				\
      63    }
      64  
      65  /* Under OpenBSD, the normal location of the various *crt*.o files is the
      66     /usr/lib directory.  */
      67  #undef STANDARD_STARTFILE_PREFIX
      68  #define STANDARD_STARTFILE_PREFIX	"/usr/local/lib/"
      69  
      70  #endif
      71  
      72  
      73  /* Controlling the compilation driver.  */
      74  /* TARGET_OS_CPP_BUILTINS() common to all OpenBSD targets.  */
      75  #define OPENBSD_OS_CPP_BUILTINS()		\
      76    do						\
      77      {						\
      78        builtin_define ("__OpenBSD__");		\
      79        builtin_define ("__unix__");		\
      80        builtin_define ("__ANSI_COMPAT");		\
      81        builtin_assert ("system=unix");		\
      82        builtin_assert ("system=bsd");		\
      83        builtin_assert ("system=OpenBSD");	\
      84      }						\
      85    while (0)
      86  
      87  /* TARGET_OS_CPP_BUILTINS() common to all OpenBSD ELF targets.  */
      88  #define OPENBSD_OS_CPP_BUILTINS_ELF()		\
      89    do						\
      90      {						\
      91        OPENBSD_OS_CPP_BUILTINS();		\
      92        builtin_define ("__ELF__");		\
      93      }						\
      94  while (0)
      95  
      96  /* TARGET_OS_CPP_BUILTINS() common to all LP64 OpenBSD targets.  */
      97  #define OPENBSD_OS_CPP_BUILTINS_LP64()		\
      98    do						\
      99      {						\
     100        builtin_define ("_LP64");			\
     101        builtin_define ("__LP64__");		\
     102      }						\
     103    while (0)
     104  
     105  /* CPP_SPEC appropriate for OpenBSD. We deal with -posix and -pthread.
     106     XXX the way threads are handled currently is not very satisfying,
     107     since all code must be compiled with -pthread to work. 
     108     This two-stage defines makes it easy to pick that for targets that
     109     have subspecs.  */
     110  #ifdef CPP_CPU_SPEC
     111  #define OBSD_CPP_SPEC "%(cpp_cpu) %{posix:-D_POSIX_SOURCE} %{pthread:-D_POSIX_THREADS}"
     112  #else
     113  #define OBSD_CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_POSIX_THREADS}"
     114  #endif
     115  
     116  #undef LIB_SPEC
     117  #define LIB_SPEC OBSD_LIB_SPEC
     118  
     119  #ifndef OBSD_HAS_CORRECT_SPECS
     120  
     121  #undef CPP_SPEC
     122  #define CPP_SPEC OBSD_CPP_SPEC
     123  
     124  #ifdef OBSD_OLD_GAS
     125  /* ASM_SPEC appropriate for OpenBSD.  For some architectures, OpenBSD 
     126     still uses a special flavor of gas that needs to be told when generating 
     127     pic code.  */
     128  #undef ASM_SPEC
     129  #define ASM_SPEC "%{" FPIE1_OR_FPIC1_SPEC ":-k} %{" FPIE2_OR_FPIC2_SPEC ":-k -K}"
     130  #endif
     131  
     132  /* Since we use gas, stdin -> - is a good idea.  */
     133  #define AS_NEEDS_DASH_FOR_PIPED_INPUT
     134  
     135  #undef LIB_SPEC
     136  #define LIB_SPEC OBSD_LIB_SPEC
     137  
     138  #if defined(HAVE_LD_EH_FRAME_HDR)
     139  #define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} "
     140  #endif
     141  
     142  #undef LIB_SPEC
     143  #define LIB_SPEC OBSD_LIB_SPEC
     144  #endif
     145  
     146  #define TARGET_POSIX_IO
     147  
     148  /* All new versions of OpenBSD have C99 functions.  We redefine this hook
     149     so the version from elfos.h header won't be used.  */
     150  #undef TARGET_LIBC_HAS_FUNCTION
     151  #define TARGET_LIBC_HAS_FUNCTION default_libc_has_function
     152  
     153  
     154  /* - we use . - _func instead of a local label,
     155     - we put extra spaces in expressions such as 
     156       .type _func , @function
     157       This is more readable for a human being and confuses c++filt less.  */
     158  
     159  /* Assembler format: output and generation of labels.  */
     160  
     161  /* Define the strings used for the .type and .size directives.
     162     These strings generally do not vary from one system running OpenBSD
     163     to another, but if a given system needs to use different pseudo-op
     164     names for these, they may be overridden in the arch specific file.  */ 
     165  
     166  /* OpenBSD assembler is hacked to have .type & .size support even in a.out
     167     format object files.  Functions size are supported but not activated 
     168     yet (look for GRACE_PERIOD_EXPIRED in gas/config/obj-aout.c).  
     169     SET_ASM_OP is needed for attribute alias to work.  */
     170  
     171  #undef TYPE_ASM_OP
     172  #undef SIZE_ASM_OP
     173  #undef SET_ASM_OP
     174  #undef GLOBAL_ASM_OP
     175  
     176  #define TYPE_ASM_OP	"\t.type\t"
     177  #define SIZE_ASM_OP	"\t.size\t"
     178  #define SET_ASM_OP	"\t.set\t"
     179  #define GLOBAL_ASM_OP	"\t.globl\t"
     180  
     181  /* The following macro defines the format used to output the second
     182     operand of the .type assembler directive.  */
     183  #undef TYPE_OPERAND_FMT
     184  #define TYPE_OPERAND_FMT	"@%s"
     185  
     186  /* Provision if extra assembler code is needed to declare a function's result
     187     (taken from svr4, not needed yet actually).  */
     188  #ifndef ASM_DECLARE_RESULT
     189  #define ASM_DECLARE_RESULT(FILE, RESULT)
     190  #endif
     191  
     192  /* These macros generate the special .type and .size directives which
     193     are used to set the corresponding fields of the linker symbol table
     194     entries under OpenBSD.  These macros also have to output the starting 
     195     labels for the relevant functions/objects.  */
     196  
     197  #ifndef OBSD_HAS_DECLARE_FUNCTION_NAME
     198  /* Extra assembler code needed to declare a function properly.
     199     Some assemblers may also need to also have something extra said 
     200     about the function's return value.  We allow for that here.  */
     201  #undef ASM_DECLARE_FUNCTION_NAME
     202  #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)			\
     203    do {									\
     204      ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");			\
     205      ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));			\
     206      ASM_OUTPUT_FUNCTION_LABEL (FILE, NAME, DECL);			\
     207    } while (0)
     208  #endif
     209  
     210  #ifndef OBSD_HAS_DECLARE_FUNCTION_SIZE
     211  /* Declare the size of a function.  */
     212  #undef ASM_DECLARE_FUNCTION_SIZE
     213  #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)		\
     214    do {								\
     215      if (!flag_inhibit_size_directive)				\
     216        ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME);			\
     217    } while (0)
     218  #endif
     219  
     220  #ifndef OBSD_HAS_DECLARE_OBJECT
     221  /* Extra assembler code needed to declare an object properly.  */
     222  #undef ASM_DECLARE_OBJECT_NAME
     223  #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)		\
     224    do {								\
     225        HOST_WIDE_INT size;					\
     226        ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");		\
     227        size_directive_output = 0;				\
     228        if (!flag_inhibit_size_directive				\
     229  	  && (DECL) && DECL_SIZE (DECL))			\
     230  	{							\
     231  	  size_directive_output = 1;				\
     232  	  size = int_size_in_bytes (TREE_TYPE (DECL));		\
     233  	  ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size);		\
     234  	}							\
     235        ASM_OUTPUT_LABEL (FILE, NAME);				\
     236    } while (0)
     237  
     238  /* Output the size directive for a decl in rest_of_decl_compilation
     239     in the case where we did not do so before the initializer.
     240     Once we find the error_mark_node, we know that the value of
     241     size_directive_output was set by ASM_DECLARE_OBJECT_NAME 
     242     when it was run for the same decl.  */
     243  #undef ASM_FINISH_DECLARE_OBJECT
     244  #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)	 \
     245  do {									 \
     246       const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);		 \
     247       HOST_WIDE_INT size;						 \
     248       if (!flag_inhibit_size_directive && DECL_SIZE (DECL)		 \
     249           && ! AT_END && TOP_LEVEL					 \
     250  	 && DECL_INITIAL (DECL) == error_mark_node			 \
     251  	 && !size_directive_output)					 \
     252         {								 \
     253  	 size_directive_output = 1;					 \
     254  	 size = int_size_in_bytes (TREE_TYPE (DECL));			 \
     255  	 ASM_OUTPUT_SIZE_DIRECTIVE (FILE, name, size);			 \
     256         }								 \
     257     } while (0)
     258  #endif
     259  
     260  
     261  /* Those are `generic' ways to weaken/globalize a label. We shouldn't need
     262     to override a processor specific definition. Hence, #ifndef ASM_*
     263     In case overriding turns out to be needed, one can always #undef ASM_* 
     264     before including this file.  */
     265  
     266  /* Tell the assembler that a symbol is weak.  */
     267  /* Note: netbsd arm32 assembler needs a .globl here. An override may 
     268     be needed when/if we go for arm32 support.  */
     269  #ifndef ASM_WEAKEN_LABEL
     270  #define ASM_WEAKEN_LABEL(FILE,NAME) \
     271    do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
     272         fputc ('\n', FILE); } while (0)
     273  #endif
     274  
     275  /* Storage layout.  */
     276  
     277  
     278  #define HAVE_ENABLE_EXECUTE_STACK