00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #undef OBJECT_FORMAT_COFF
00024 #undef EXTENDED_COFF
00025 #define OBJECT_FORMAT_ELF
00026
00027
00028 #undef SDB_DEBUGGING_INFO
00029
00030 #define DBX_DEBUGGING_INFO
00031 #define DWARF2_DEBUGGING_INFO
00032
00033 #undef PREFERRED_DEBUGGING_TYPE
00034 #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
00035
00036 #undef ASM_FINAL_SPEC
00037
00038 #undef CC1_SPEC
00039 #define CC1_SPEC "%{G*}"
00040
00041 #undef ASM_SPEC
00042 #define ASM_SPEC "%{G*} %{relax:-relax} %{!gstabs*:-no-mdebug}%{gstabs*:-mdebug}"
00043
00044 #undef LINK_SPEC
00045 #define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \
00046 %{O*:-O3} %{!O*:-O1} \
00047 %{shared:-shared} \
00048 %{!shared: \
00049 %{!static: \
00050 %{rdynamic:-export-dynamic} \
00051 %{!dynamic-linker:-dynamic-linker %(elf_dynamic_linker)}} \
00052 %{static:-static}}"
00053
00054
00055 #undef ASM_FILE_START
00056 #define ASM_FILE_START(FILE) \
00057 do { \
00058 if (write_symbols == DBX_DEBUG) \
00059 { \
00060 alpha_write_verstamp (FILE); \
00061 output_file_directive (FILE, main_input_filename); \
00062 } \
00063 fprintf (FILE, "\t.set noat\n"); \
00064 fprintf (FILE, "\t.set noreorder\n"); \
00065 if (TARGET_EXPLICIT_RELOCS) \
00066 fprintf (FILE, "\t.set nomacro\n"); \
00067 if (TARGET_BWX | TARGET_MAX | TARGET_FIX | TARGET_CIX) \
00068 { \
00069 fprintf (FILE, "\t.arch %s\n", \
00070 (TARGET_CPU_EV6 ? "ev6" \
00071 : TARGET_MAX ? "pca56" : "ev56")); \
00072 } \
00073 } while (0)
00074
00075 #undef IDENT_ASM_OP
00076 #define IDENT_ASM_OP "\t.ident\t"
00077
00078
00079 #define SCCS_DIRECTIVE
00080
00081
00082 #undef ASM_OUTPUT_IDENT
00083 #define ASM_OUTPUT_IDENT(FILE, NAME) \
00084 fprintf (FILE, "%s\"%s\"\n", IDENT_ASM_OP, NAME);
00085
00086
00087
00088
00089 #undef SKIP_ASM_OP
00090 #define SKIP_ASM_OP "\t.zero\t"
00091
00092 #undef ASM_OUTPUT_SKIP
00093 #define ASM_OUTPUT_SKIP(FILE, SIZE) \
00094 fprintf (FILE, "%s%u\n", SKIP_ASM_OP, (SIZE))
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 #undef ALIGN_ASM_OP
00105 #define ALIGN_ASM_OP "\t.align\t"
00106
00107 #ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
00108 #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE) \
00109 ASM_OUTPUT_ALIGN ((FILE), 2);
00110 #endif
00111
00112 #undef ASM_OUTPUT_CASE_LABEL
00113 #define ASM_OUTPUT_CASE_LABEL(FILE, PREFIX, NUM, JUMPTABLE) \
00114 do { \
00115 ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE) \
00116 ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
00117 } while (0)
00118
00119
00120
00121
00122
00123 #undef ASM_OUTPUT_EXTERNAL_LIBCALL
00124 #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
00125 ASM_GLOBALIZE_LABEL (FILE, XSTR (FUN, 0))
00126
00127
00128
00129
00130
00131
00132 #undef COMMON_ASM_OP
00133 #define COMMON_ASM_OP "\t.comm\t"
00134
00135 #undef ASM_OUTPUT_ALIGNED_COMMON
00136 #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
00137 do { \
00138 fprintf ((FILE), "%s", COMMON_ASM_OP); \
00139 assemble_name ((FILE), (NAME)); \
00140 fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
00141 } while (0)
00142
00143
00144
00145
00146
00147
00148 #undef ASM_OUTPUT_ALIGNED_LOCAL
00149 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
00150 do { \
00151 if ((SIZE) <= g_switch_value) \
00152 sbss_section(); \
00153 else \
00154 bss_section(); \
00155 fprintf (FILE, "%s", TYPE_ASM_OP); \
00156 assemble_name (FILE, NAME); \
00157 putc (',', FILE); \
00158 fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
00159 putc ('\n', FILE); \
00160 if (!flag_inhibit_size_directive) \
00161 { \
00162 fprintf (FILE, "%s", SIZE_ASM_OP); \
00163 assemble_name (FILE, NAME); \
00164 fprintf (FILE, ",%d\n", (SIZE)); \
00165 } \
00166 ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT)); \
00167 ASM_OUTPUT_LABEL(FILE, NAME); \
00168 ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1); \
00169 } while (0)
00170
00171
00172
00173
00174 #undef ASM_OUTPUT_ALIGNED_BSS
00175 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
00176 do { \
00177 ASM_GLOBALIZE_LABEL (FILE, NAME); \
00178 ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN); \
00179 } while (0)
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190 #undef MAX_OFILE_ALIGNMENT
00191 #define MAX_OFILE_ALIGNMENT \
00192 (1 << (HOST_BITS_PER_INT < 64 ? HOST_BITS_PER_INT - 2 : 62))
00193
00194
00195
00196
00197
00198 #undef ASCII_DATA_ASM_OP
00199 #define ASCII_DATA_ASM_OP "\t.ascii\t"
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 #undef USE_CONST_SECTION
00210 #define USE_CONST_SECTION 1
00211
00212 #undef CONST_SECTION_ASM_OP
00213 #define CONST_SECTION_ASM_OP "\t.section\t.rodata"
00214
00215 #undef BSS_SECTION_ASM_OP
00216 #define BSS_SECTION_ASM_OP "\t.section\t.bss"
00217 #undef SBSS_SECTION_ASM_OP
00218 #define SBSS_SECTION_ASM_OP "\t.section\t.sbss,\"aw\""
00219 #undef SDATA_SECTION_ASM_OP
00220 #define SDATA_SECTION_ASM_OP "\t.section\t.sdata,\"aw\""
00221
00222
00223
00224
00225
00226
00227
00228 #undef INIT_SECTION_ASM_OP
00229 #define INIT_SECTION_ASM_OP "\t.section\t.init"
00230 #undef FINI_SECTION_ASM_OP
00231 #define FINI_SECTION_ASM_OP "\t.section\t.fini"
00232
00233 #ifdef HAVE_GAS_SUBSECTION_ORDERING
00234
00235 #define ASM_SECTION_START_OP "\t.subsection\t-1"
00236
00237
00238 #define ASM_OUTPUT_SECTION_START(FILE) \
00239 fprintf ((FILE), "%s\n", ASM_SECTION_START_OP)
00240
00241 #endif
00242
00243
00244
00245
00246
00247
00248 #undef EXTRA_SECTIONS
00249 #define EXTRA_SECTIONS in_const, in_sbss, in_sdata
00250
00251
00252
00253
00254
00255 #undef EXTRA_SECTION_FUNCTIONS
00256 #define EXTRA_SECTION_FUNCTIONS \
00257 CONST_SECTION_FUNCTION \
00258 SECTION_FUNCTION_TEMPLATE(sbss_section, in_sbss, SBSS_SECTION_ASM_OP) \
00259 SECTION_FUNCTION_TEMPLATE(sdata_section, in_sdata, SDATA_SECTION_ASM_OP)
00260
00261 extern void sbss_section PARAMS ((void));
00262 extern void sdata_section PARAMS ((void));
00263
00264 #undef READONLY_DATA_SECTION
00265 #define READONLY_DATA_SECTION() const_section ()
00266
00267 #undef CONST_SECTION_FUNCTION
00268 #define CONST_SECTION_FUNCTION \
00269 void \
00270 const_section () \
00271 { \
00272 if (!USE_CONST_SECTION) \
00273 text_section(); \
00274 else if (in_section != in_const) \
00275 { \
00276 fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \
00277 in_section = in_const; \
00278 } \
00279 }
00280
00281 #undef SECTION_FUNCTION_TEMPLATE
00282 #define SECTION_FUNCTION_TEMPLATE(FN, ENUM, OP) \
00283 void FN () \
00284 { \
00285 if (in_section != ENUM) \
00286 { \
00287 fprintf (asm_out_file, "%s\n", OP); \
00288 in_section = ENUM; \
00289 } \
00290 }
00291
00292
00293 #define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309 #define DO_SELECT_SECTION(SECNUM, DECL, RELOC) \
00310 do \
00311 { \
00312 HOST_WIDE_INT size; \
00313 SECNUM = 1; \
00314 if (TREE_CODE (DECL) == FUNCTION_DECL) \
00315 { \
00316 SECNUM = 0; \
00317 break; \
00318 } \
00319 else if (TREE_CODE (DECL) == STRING_CST) \
00320 { \
00321 if (flag_writable_strings) \
00322 SECNUM = 2; \
00323 else \
00324 SECNUM = 0x101; \
00325 break; \
00326 } \
00327 else if (TREE_CODE (DECL) == VAR_DECL) \
00328 { \
00329 if (DECL_INITIAL (DECL) == NULL \
00330 || DECL_INITIAL (DECL) == error_mark_node) \
00331 SECNUM = 4; \
00332 else if ((flag_pic && RELOC) \
00333 || ! TREE_READONLY (DECL) \
00334 || TREE_SIDE_EFFECTS (DECL) \
00335 || ! TREE_CONSTANT (DECL_INITIAL (DECL))) \
00336 SECNUM = 2; \
00337 else if (flag_merge_constants >= 2) \
00338 { \
00339
00340
00341
00342 \
00343 if (TREE_CODE (DECL_INITIAL (DECL)) == STRING_CST)\
00344 SECNUM = 0x201; \
00345 else \
00346 SECNUM = 0x301; \
00347 } \
00348 } \
00349 else if (TREE_CODE (DECL) == CONSTRUCTOR) \
00350 { \
00351 if ((flag_pic && RELOC) \
00352 || TREE_SIDE_EFFECTS (DECL) \
00353 || ! TREE_CONSTANT (DECL)) \
00354 SECNUM = 2; \
00355 } \
00356 \
00357 \
00358 size = int_size_in_bytes (TREE_TYPE (DECL)); \
00359 if (size >= 0 && size <= g_switch_value) \
00360 { \
00361 if ((SECNUM & 0xff) >= 2) \
00362 SECNUM += 1; \
00363 \
00364
00365 \
00366 else if (TARGET_SMALL_DATA) \
00367 SECNUM = 3; \
00368 } \
00369 } \
00370 while (0)
00371
00372 #undef SELECT_SECTION
00373 #define SELECT_SECTION(DECL, RELOC, ALIGN) \
00374 do \
00375 { \
00376 typedef void (*sec_fn) PARAMS ((void)); \
00377 static sec_fn const sec_functions[6] = \
00378 { \
00379 text_section, \
00380 const_section, \
00381 data_section, \
00382 sdata_section, \
00383 bss_section, \
00384 sbss_section \
00385 }; \
00386 \
00387 int sec; \
00388 \
00389 DO_SELECT_SECTION (sec, DECL, RELOC); \
00390 \
00391 switch (sec) \
00392 { \
00393 case 0x101: \
00394 mergeable_string_section (DECL, ALIGN, 0); \
00395 break; \
00396 case 0x201: \
00397 mergeable_string_section (DECL_INITIAL (DECL),\
00398 ALIGN, 0); \
00399 break; \
00400 case 0x301: \
00401 mergeable_constant_section (DECL_MODE (DECL), \
00402 ALIGN, 0); \
00403 break; \
00404 default: \
00405 (*sec_functions[sec]) (); \
00406 break; \
00407 } \
00408 } \
00409 while (0)
00410
00411 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
00412
00413 #undef UNIQUE_SECTION
00414 #define UNIQUE_SECTION(DECL, RELOC) \
00415 do \
00416 { \
00417 static const char * const prefixes[6][2] = \
00418 { \
00419 { ".text.", ".gnu.linkonce.t." }, \
00420 { ".rodata.", ".gnu.linkonce.r." }, \
00421 { ".data.", ".gnu.linkonce.d." }, \
00422 { ".sdata.", ".gnu.linkonce.s." }, \
00423 { ".bss.", ".gnu.linkonce.b." }, \
00424 { ".sbss.", ".gnu.linkonce.sb." } \
00425 }; \
00426 \
00427 int nlen, plen, sec; \
00428 const char *name, *prefix; \
00429 char *string; \
00430 \
00431 DO_SELECT_SECTION (sec, DECL, RELOC); \
00432 \
00433 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL)); \
00434 STRIP_NAME_ENCODING (name, name); \
00435 nlen = strlen (name); \
00436 \
00437 prefix = prefixes[sec & 0xff][DECL_ONE_ONLY(DECL)]; \
00438 plen = strlen (prefix); \
00439 \
00440 string = alloca (nlen + plen + 1); \
00441 \
00442 memcpy (string, prefix, plen); \
00443 memcpy (string + plen, name, nlen + 1); \
00444 \
00445 DECL_SECTION_NAME (DECL) = build_string (nlen + plen, string); \
00446 } \
00447 while (0)
00448
00449
00450
00451
00452
00453
00454
00455 #undef SELECT_RTX_SECTION
00456 #define SELECT_RTX_SECTION(MODE, RTX, ALIGN) \
00457 do { \
00458 if (TARGET_SMALL_DATA && GET_MODE_SIZE (MODE) <= g_switch_value) \
00459 \
00460 sdata_section (); \
00461 else \
00462 mergeable_constant_section((MODE), (ALIGN), 0); \
00463 } while (0)
00464
00465
00466
00467
00468
00469
00470
00471 #undef TYPE_ASM_OP
00472 #define TYPE_ASM_OP "\t.type\t"
00473 #undef SIZE_ASM_OP
00474 #define SIZE_ASM_OP "\t.size\t"
00475
00476
00477
00478 #undef ASM_WEAKEN_LABEL
00479 #define ASM_WEAKEN_LABEL(FILE, NAME) \
00480 do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
00481 fputc ('\n', FILE); } while (0)
00482
00483
00484
00485 #undef ASM_OUTPUT_DEF
00486 #define ASM_OUTPUT_DEF(FILE, ALIAS, NAME) \
00487 do { \
00488 assemble_name(FILE, ALIAS); \
00489 fputs(" = ", FILE); \
00490 assemble_name(FILE, NAME); \
00491 fputc('\n', FILE); \
00492 } while (0)
00493
00494 #undef ASM_OUTPUT_DEF_FROM_DECLS
00495 #define ASM_OUTPUT_DEF_FROM_DECLS(FILE, DECL, TARGET) \
00496 do { \
00497 const char *alias = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
00498 const char *name = IDENTIFIER_POINTER (TARGET); \
00499 if (TREE_CODE (DECL) == FUNCTION_DECL) \
00500 { \
00501 fputc ('$', FILE); \
00502 assemble_name (FILE, alias); \
00503 fputs ("..ng = $", FILE); \
00504 assemble_name (FILE, name); \
00505 fputs ("..ng\n", FILE); \
00506 } \
00507 assemble_name(FILE, alias); \
00508 fputs(" = ", FILE); \
00509 assemble_name(FILE, name); \
00510 fputc('\n', FILE); \
00511 } while (0)
00512
00513
00514
00515
00516
00517
00518
00519 #undef TYPE_OPERAND_FMT
00520 #define TYPE_OPERAND_FMT "@%s"
00521
00522
00523
00524
00525
00526 #ifndef ASM_DECLARE_RESULT
00527 #define ASM_DECLARE_RESULT(FILE, RESULT)
00528 #endif
00529
00530
00531
00532
00533
00534
00535
00536
00537 #undef ASM_DECLARE_OBJECT_NAME
00538 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
00539 do { \
00540 HOST_WIDE_INT size; \
00541 fprintf (FILE, "%s", TYPE_ASM_OP); \
00542 assemble_name (FILE, NAME); \
00543 putc (',', FILE); \
00544 fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
00545 putc ('\n', FILE); \
00546 size_directive_output = 0; \
00547 if (!flag_inhibit_size_directive \
00548 && DECL_SIZE (DECL) \
00549 && (size = int_size_in_bytes (TREE_TYPE (DECL))) > 0) \
00550 { \
00551 size_directive_output = 1; \
00552 fprintf (FILE, "%s", SIZE_ASM_OP); \
00553 assemble_name (FILE, NAME); \
00554 fputc (',', FILE); \
00555 fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, size); \
00556 fputc ('\n', FILE); \
00557 } \
00558 ASM_OUTPUT_LABEL(FILE, NAME); \
00559 } while (0)
00560
00561
00562
00563
00564
00565
00566
00567 #undef ASM_FINISH_DECLARE_OBJECT
00568 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
00569 do { \
00570 const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
00571 HOST_WIDE_INT size; \
00572 if (!flag_inhibit_size_directive \
00573 && DECL_SIZE (DECL) \
00574 && ! AT_END && TOP_LEVEL \
00575 && DECL_INITIAL (DECL) == error_mark_node \
00576 && !size_directive_output \
00577 && (size = int_size_in_bytes (TREE_TYPE (DECL))) > 0) \
00578 { \
00579 size_directive_output = 1; \
00580 fprintf (FILE, "%s", SIZE_ASM_OP); \
00581 assemble_name (FILE, name); \
00582 fputc (',', FILE); \
00583 fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, size); \
00584 fputc ('\n', FILE); \
00585 } \
00586 } while (0)
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602 #undef ESCAPES
00603 #define ESCAPES \
00604 "\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\
00605 \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\
00606 \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\
00607 \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\
00608 \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\1\1\1\1\1\1\1\
00609 \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\1\1\1\1\1\1\1\
00610 \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\1\1\1\1\1\1\1\
00611 \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\1\1\1\1\1\1\1"
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624 #undef STRING_LIMIT
00625 #define STRING_LIMIT ((unsigned) 256)
00626 #undef STRING_ASM_OP
00627 #define STRING_ASM_OP "\t.string\t"
00628
00629
00630 #undef TARGET_GAS
00631 #define TARGET_GAS (1)
00632
00633
00634
00635
00636
00637
00638 #undef STARTFILE_SPEC
00639 #define STARTFILE_SPEC \
00640 "%{!shared: \
00641 %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}\
00642 crti.o%s %{static:crtbeginT.o%s}\
00643 %{!static:%{shared:crtbeginS.o%s}%{!shared:crtbegin.o%s}}"
00644
00645
00646
00647
00648
00649
00650 #undef ENDFILE_SPEC
00651 #define ENDFILE_SPEC \
00652 "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
00653 %{shared:crtendS.o%s}%{!shared:crtend.o%s} crtn.o%s"
00654
00655
00656 #define HANDLE_SYSV_PRAGMA
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
00667 (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4)
00668
00669
00670
00671 #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \
00672 (alpha_this_literal_sequence_number = 0, \
00673 alpha_this_gpdisp_sequence_number = 0)
00674 extern int alpha_this_literal_sequence_number;
00675 extern int alpha_this_gpdisp_sequence_number;
00676
00677
00678
00679
00680
00681
00682 #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
00683 asm (SECTION_OP "\n" \
00684 " br $29,1f\n" \
00685 "1: ldgp $29,0($29)\n" \
00686 " unop\n" \
00687 " jsr $26," USER_LABEL_PREFIX #FUNC "\n" \
00688 " .align 3\n" \
00689 " .previous");
00690
00691
00692
00693
00694
00695 #if defined(HAVE_LD_EH_FRAME_HDR)
00696 #define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
00697 #endif