--- gcc/config/svr4.h 2018/04/24 17:55:17 1.1.1.2 +++ gcc/config/svr4.h 2018/04/24 18:20:29 1.1.1.7 @@ -1,8 +1,7 @@ /* svr4.h -- operating system specific defines to be used when targeting GCC for some generic System V Release 4 system. - Copyright (C) 1991 Free Software Foundation, Inc. - - Written by Ron Guilmette (rfg@ncd.com). + Copyright (C) 1991, 1994 Free Software Foundation, Inc. + Contributed by Ron Guilmette (rfg@netcom.com). This file is part of GNU CC. @@ -39,11 +38,8 @@ the Free Software Foundation, 675 Mass A appropriate define for the type of hardware that you are targeting. */ -/* Define a symbol so that libgcc* can know what sort of operating - environment and assembler syntax we are targeting for. */ -#ifndef SVR4 -#define SVR4 -#endif +/* Define a symbol indicating that we are using svr4.h. */ +#define USING_SVR4_H /* For the sake of libgcc2.c, indicate target supports atexit. */ #define HAVE_ATEXIT @@ -72,8 +68,9 @@ the Free Software Foundation, 675 Mass A there are no such switches except those implemented by GCC itself. */ #define WORD_SWITCH_TAKES_ARG(STR) \ - (!strcmp (STR, "include") || !strcmp (STR, "imacros") \ - || !strcmp (STR, "aux-info")) + (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ + && strcmp (STR, "Tdata") && strcmp (STR, "Ttext") \ + && strcmp (STR, "Tbss")) /* You should redefine CPP_PREDEFINES in any file which includes this one. The definition should be appropriate for the type of target system @@ -112,6 +109,12 @@ the Free Software Foundation, 675 Mass A #undef ASM_FINAL_SPEC #define ASM_FINAL_SPEC "%{pipe:-}" +/* Under svr4, the normal location of the `ld' and `as' programs is the + /usr/ccs/bin directory. */ + +#undef MD_EXEC_PREFIX +#define MD_EXEC_PREFIX "/usr/ccs/bin/" + /* Under svr4, the normal location of the various *crt*.o files is the /usr/ccs/lib directory. */ @@ -193,10 +196,12 @@ the Free Software Foundation, 675 Mass A .ident string is patterned after the ones produced by native svr4 C compilers. */ +#define IDENT_ASM_OP ".ident" + #define ASM_FILE_END(FILE) \ do { \ - fprintf ((FILE), "\t.ident\t\"GCC: (GNU) %s\"\n", \ - version_string); \ + fprintf ((FILE), "\t%s\t\"GCC: (GNU) %s\"\n", \ + IDENT_ASM_OP, version_string); \ } while (0) /* Allow #sccs in preprocessor. */ @@ -206,7 +211,7 @@ do { \ /* Output #ident as a .ident. */ #define ASM_OUTPUT_IDENT(FILE, NAME) \ - fprintf (FILE, "\t.ident \"%s\"\n", NAME); + fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME); /* Use periods rather than dollar signs in special g++ assembler names. */ @@ -220,6 +225,10 @@ do { \ #define TARGET_MEM_FUNCTIONS +/* Handle #pragma weak and #pragma pack. */ + +#define HANDLE_SYSV_PRAGMA + /* System V Release 4 uses DWARF debugging info. */ #define DWARF_DEBUGGING_INFO @@ -235,6 +244,66 @@ do { \ #undef DBX_REGISTER_NUMBER +/* gas on SVR4 supports the use of .stabs. Permit -gstabs to be used + in general, although it will only work when using gas. */ + +#define DBX_DEBUGGING_INFO + +/* Use DWARF debugging info by default. */ + +#ifndef PREFERRED_DEBUGGING_TYPE +#define PREFERRED_DEBUGGING_TYPE DWARF_DEBUG +#endif + +/* Make LBRAC and RBRAC addresses relative to the start of the + function. The native Solaris stabs debugging format works this + way, gdb expects it, and it reduces the number of relocation + entries. */ + +#define DBX_BLOCKS_FUNCTION_RELATIVE 1 + +/* When using stabs, gcc2_compiled must be a stabs entry, not an + ordinary symbol, or gdb won't see it. Furthermore, since gdb reads + the input piecemeal, starting with each N_SO, it's a lot easier if + the gcc2 flag symbol is *after* the N_SO rather than before it. So + we emit an N_OPT stab there. */ + +#define ASM_IDENTIFY_GCC(FILE) \ +do \ + { \ + if (write_symbols != DBX_DEBUG) \ + fputs ("gcc2_compiled.:\n", FILE); \ + } \ +while (0) + +#define ASM_IDENTIFY_GCC_AFTER_SOURCE(FILE) \ +do \ + { \ + if (write_symbols == DBX_DEBUG) \ + fputs ("\t.stabs\t\"gcc2_compiled.\", 0x3c, 0, 0, 0\n", FILE); \ + } \ +while (0) + +/* Like block addresses, stabs line numbers are relative to the + current function. */ + +#define ASM_OUTPUT_SOURCE_LINE(file, line) \ +do \ + { \ + static int sym_lineno = 1; \ + fprintf (file, ".stabn 68,0,%d,.LM%d-%s\n.LM%d:\n", \ + line, sym_lineno, \ + XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0), \ + sym_lineno); \ + sym_lineno += 1; \ + } \ +while (0) + +/* In order for relative line numbers to work, we must output the + stabs entry for the function name first. */ + +#define DBX_FUNCTION_FIRST + /* Define the actual types of some ANSI-mandated types. (These definitions should work for most SVR4 systems). */ @@ -250,10 +319,15 @@ do { \ #undef WCHAR_TYPE_SIZE #define WCHAR_TYPE_SIZE BITS_PER_WORD -#define MULTIBYTE_CHARS +/* This causes trouble, because it requires the host machine + to support ANSI C. */ +/* #define MULTIBYTE_CHARS */ #undef ASM_BYTE_OP -#define ASM_BYTE_OP "\t.byte" +#define ASM_BYTE_OP ".byte" + +#undef SET_ASM_OP +#define SET_ASM_OP ".set" /* This is how to begin an assembly language file. Most svr4 assemblers want at least a .file directive to come first, and some want to see a .version @@ -269,8 +343,11 @@ do { \ /* This is how to allocate empty space in some section. The .zero pseudo-op is used for this on most svr4 assemblers. */ +#define SKIP_ASM_OP ".zero" + #undef ASM_OUTPUT_SKIP -#define ASM_OUTPUT_SKIP(FILE,SIZE) fprintf (FILE, "\t.zero\t%u\n", (SIZE)) +#define ASM_OUTPUT_SKIP(FILE,SIZE) \ + fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE)) /* This is how to output a reference to a user-level label named NAME. `assemble_name' uses this. @@ -281,6 +358,54 @@ do { \ #undef ASM_OUTPUT_LABELREF #define ASM_OUTPUT_LABELREF(FILE,NAME) fprintf (FILE, "%s", NAME) +/* This is how to output an internal numbered label where + PREFIX is the class of label and NUM is the number within the class. + + For most svr4 systems, the convention is that any symbol which begins + with a period is not put into the linker symbol table by the assembler. */ + +#undef ASM_OUTPUT_INTERNAL_LABEL +#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \ +do { \ + fprintf (FILE, ".%s%d:\n", PREFIX, NUM); \ +} while (0) + +/* This is how to store into the string LABEL + the symbol_ref name of an internal numbered label where + PREFIX is the class of label and NUM is the number within the class. + This is suitable for output with `assemble_name'. + + For most svr4 systems, the convention is that any symbol which begins + with a period is not put into the linker symbol table by the assembler. */ + +#undef ASM_GENERATE_INTERNAL_LABEL +#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \ +do { \ + sprintf (LABEL, "*.%s%d", PREFIX, NUM); \ +} while (0) + +/* Output the label which precedes a jumptable. Note that for all svr4 + systems where we actually generate jumptables (which is to say every + svr4 target except i386, where we use casesi instead) we put the jump- + tables into the .rodata section and since other stuff could have been + put into the .rodata section prior to any given jumptable, we have to + make sure that the location counter for the .rodata section gets pro- + perly re-aligned prior to the actual beginning of the jump table. */ + +#define ALIGN_ASM_OP ".align" + +#ifndef ASM_OUTPUT_BEFORE_CASE_LABEL +#define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \ + ASM_OUTPUT_ALIGN ((FILE), 2); +#endif + +#undef ASM_OUTPUT_CASE_LABEL +#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE) \ + do { \ + ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE) \ + ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \ + } while (0) + /* The standard SVR4 assembler seems to require that certain builtin library routines (e.g. .udiv) be explicitly declared as .globl in each assembly file where they are referenced. */ @@ -293,10 +418,12 @@ do { \ the linker seems to want the alignment of data objects to depend on their types. We do exactly that here. */ +#define COMMON_ASM_OP ".comm" + #undef ASM_OUTPUT_ALIGNED_COMMON #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ do { \ - fputs ("\t.comm\t", (FILE)); \ + fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \ assemble_name ((FILE), (NAME)); \ fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ } while (0) @@ -306,13 +433,15 @@ do { \ the linker seems to want the alignment of data objects to depend on their types. We do exactly that here. */ -#define BSS_ASM_OP ".bss" +#define LOCAL_ASM_OP ".local" #undef ASM_OUTPUT_ALIGNED_LOCAL #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ do { \ - fprintf ((FILE), "\t%s\t%s,%u,%u\n", \ - BSS_ASM_OP, (NAME), (SIZE), (ALIGN) / BITS_PER_UNIT); \ + fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \ + assemble_name ((FILE), (NAME)); \ + fprintf ((FILE), "\n"); \ + ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \ } while (0) /* This is the pseudo-op used to generate a 32-bit word of data with a @@ -370,7 +499,7 @@ do { \ #define READONLY_DATA_SECTION() const_section () -extern void text_section(); +extern void text_section (); #define CONST_SECTION_FUNCTION \ void \ @@ -391,7 +520,7 @@ ctors_section () \ { \ if (in_section != in_ctors) \ { \ - fprintf (asm_out_file, CTORS_SECTION_ASM_OP); \ + fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \ in_section = in_ctors; \ } \ } @@ -402,11 +531,17 @@ dtors_section () \ { \ if (in_section != in_dtors) \ { \ - fprintf (asm_out_file, DTORS_SECTION_ASM_OP); \ + fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \ in_section = in_dtors; \ } \ } +/* Switch into a generic section. + This is currently only used to support section attributes. */ + +#define ASM_OUTPUT_SECTION(FILE, NAME) \ + fprintf (FILE, ".section\t%s,\"a\",@progbits\n", NAME) + /* A C statement (sans semicolon) to output an element in the table of global constructors. */ #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \ @@ -444,7 +579,10 @@ dtors_section () \ else if (TREE_CODE (DECL) == VAR_DECL) \ { \ if ((flag_pic && RELOC) \ - || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)) \ + || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \ + || !DECL_INITIAL (DECL) \ + || (DECL_INITIAL (DECL) != error_mark_node \ + && !TREE_CONSTANT (DECL_INITIAL (DECL)))) \ data_section (); \ else \ const_section (); \ @@ -470,6 +608,7 @@ dtors_section () \ #define TYPE_ASM_OP ".type" #define SIZE_ASM_OP ".size" +#define WEAK_ASM_OP ".weak" /* The following macro defines the format used to output the second operand of the .type assembler directive. Different svr4 assemblers @@ -479,11 +618,22 @@ dtors_section () \ #define TYPE_OPERAND_FMT "@%s" +/* Write the extra assembler code needed to declare a function's result. + Most svr4 assemblers don't require any special declaration of the + result value, but there are exceptions. */ + +#ifndef ASM_DECLARE_RESULT +#define ASM_DECLARE_RESULT(FILE, RESULT) +#endif + /* These macros generate the special .type and .size directives which are used to set the corresponding fields of the linker symbol table - entries in an ELF object file under SVR4. */ + entries in an ELF object file under SVR4. These macros also output + the starting labels for the relevant functions/objects. */ -/* Write the extra assembler code needed to declare a function properly. */ +/* Write the extra assembler code needed to declare a function properly. + Some svr4 assemblers need to also have something extra said about the + function's return value. We allow for that here. */ #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ do { \ @@ -492,6 +642,7 @@ dtors_section () \ putc (',', FILE); \ fprintf (FILE, TYPE_OPERAND_FMT, "function"); \ putc ('\n', FILE); \ + ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \ ASM_OUTPUT_LABEL(FILE, NAME); \ } while (0) @@ -504,15 +655,38 @@ dtors_section () \ putc (',', FILE); \ fprintf (FILE, TYPE_OPERAND_FMT, "object"); \ putc ('\n', FILE); \ - if (!flag_inhibit_size_directive) \ + size_directive_output = 0; \ + if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \ { \ + size_directive_output = 1; \ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \ assemble_name (FILE, NAME); \ - fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (decl))); \ + fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \ } \ ASM_OUTPUT_LABEL(FILE, NAME); \ } while (0) +/* Output the size directive for a decl in rest_of_decl_compilation + in the case where we did not do so before the initializer. + Once we find the error_mark_node, we know that the value of + size_directive_output was set + by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */ + +#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \ +do { \ + char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \ + if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \ + && ! AT_END && TOP_LEVEL \ + && DECL_INITIAL (DECL) == error_mark_node \ + && !size_directive_output) \ + { \ + size_directive_output = 1; \ + fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \ + assemble_name (FILE, name); \ + fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \ + } \ + } while (0) + /* This is how to declare the size of a function. */ #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \ @@ -529,7 +703,7 @@ dtors_section () \ fprintf (FILE, ","); \ assemble_name (FILE, label); \ fprintf (FILE, "-"); \ - ASM_OUTPUT_LABELREF (FILE, (FNAME)); \ + assemble_name (FILE, (FNAME)); \ putc ('\n', FILE); \ } \ } while (0) @@ -545,10 +719,11 @@ dtors_section () \ in the table. Note that we can use standard UN*X escape sequences for many control characters, but we don't use \a to represent BEL because some svr4 assemblers (e.g. on - the i386) don't know about that. */ + the i386) don't know about that. Also, we don't use \v + since some versions of gas, such as 2.2 did not accept it. */ #define ESCAPES \ -"\1\1\1\1\1\1\1\1btnvfr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ +"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ \0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\