--- gcc/config/svr4.h 2018/04/24 17:55:17 1.1.1.2 +++ gcc/config/svr4.h 2018/04/24 18:06:14 1.1.1.4 @@ -39,11 +39,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 @@ -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 @@ -250,10 +259,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 +283,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 +298,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 preceeds 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 +358,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 +373,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 @@ -391,7 +460,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,7 +471,7 @@ 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; \ } \ } @@ -470,6 +539,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 +549,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 +573,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) @@ -529,7 +611,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)