1 /* 2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. 3 * 4 * This file is part of libFirm. 5 * 6 * This file may be distributed and/or modified under the terms of the 7 * GNU General Public License version 2 as published by the Free Software 8 * Foundation and appearing in the file LICENSE.GPL included in the 9 * packaging of this file. 10 * 11 * Licensees holding valid libFirm Professional Edition licenses may use 12 * this file in accordance with the libFirm Commercial License. 13 * Agreement provided with the Software. 14 * 15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE. 18 */ 19 20 /** 21 * @file 22 * @brief Dumps global variables and constants as gas assembler. 23 * @author Christian Wuerdig, Matthias Braun 24 * @date 04.11.2005 25 */ 26 #ifndef FIRM_BE_BEGNUAS_H 27 #define FIRM_BE_BEGNUAS_H 28 29 #include <stdbool.h> 30 #include "be_types.h" 31 #include "beemitter.h" 32 #include "bedwarf.h" 33 34 typedef enum { 35 GAS_SECTION_TEXT, /**< text section - program code */ 36 GAS_SECTION_DATA, /**< data section - arbitrary data */ 37 GAS_SECTION_RODATA, /**< rodata section - read-only data */ 38 GAS_SECTION_BSS, /**< bss section - zero initialized data */ 39 GAS_SECTION_CONSTRUCTORS, /**< ctors section */ 40 GAS_SECTION_DESTRUCTORS, /**< dtors section */ 41 GAS_SECTION_CSTRING, /**< section for constant strings */ 42 GAS_SECTION_PIC_TRAMPOLINES, /**< trampolines for pic codes */ 43 GAS_SECTION_PIC_SYMBOLS, /**< contains resolved pic symbols */ 44 GAS_SECTION_DEBUG_INFO, /**< dwarf debug info */ 45 GAS_SECTION_DEBUG_ABBREV, /**< dwarf debug abbrev */ 46 GAS_SECTION_DEBUG_LINE, /**< dwarf debug line */ 47 GAS_SECTION_DEBUG_PUBNAMES, /**< dwarf pub names */ 48 GAS_SECTION_DEBUG_FRAME, /**< dwarf callframe infos */ 49 GAS_SECTION_LAST = GAS_SECTION_DEBUG_FRAME, 50 GAS_SECTION_TYPE_MASK = 0xFF, 51 52 GAS_SECTION_FLAG_TLS = 1 << 8, /**< thread local flag */ 53 GAS_SECTION_FLAG_COMDAT = 1 << 9 /**< thread local version of _BSS */ 54 } be_gas_section_t; 55 ENUM_BITSET(be_gas_section_t) 56 57 typedef enum object_file_format_t { 58 OBJECT_FILE_FORMAT_ELF, /**< Executable and Linkable Format (unixes) */ 59 OBJECT_FILE_FORMAT_COFF, /**< Common Object File Format (Windows) */ 60 OBJECT_FILE_FORMAT_MACH_O, /**< Mach Object File Format (OS/X) */ 61 OBJECT_FILE_FORMAT_LAST = OBJECT_FILE_FORMAT_MACH_O 62 } object_file_format_t; 63 64 typedef enum elf_variant_t { 65 ELF_VARIANT_NORMAL, 66 ELF_VARIANT_SPARC 67 } elf_variant_t; 68 69 /** The variable where the GAS dialect is stored. */ 70 extern object_file_format_t be_gas_object_file_format; 71 extern bool be_gas_emit_types; 72 extern elf_variant_t be_gas_elf_variant; 73 74 /** 75 * the .type directive needs to specify @function, #function or %function 76 * depending on the target architecture 77 */ 78 extern char be_gas_elf_type_char; 79 80 /** 81 * Switch the current output section to the given out. 82 * 83 * @param section the new output section 84 */ 85 void be_gas_emit_switch_section(be_gas_section_t section); 86 87 /** 88 * emit assembler instructions necessary before starting function code 89 */ 90 void be_gas_emit_function_prolog(const ir_entity *entity, 91 unsigned po2alignment, 92 const parameter_dbg_info_t *paramter_infos); 93 94 void be_gas_emit_function_epilog(const ir_entity *entity); 95 96 char const *be_gas_get_private_prefix(void); 97 98 /** 99 * emit ld_ident of an entity and performs additional mangling if necessary. 100 * (mangling is necessary for ir_visibility_private for example). 101 * Emits a block label for type_code entities. 102 */ 103 void be_gas_emit_entity(const ir_entity *entity); 104 105 /** 106 * Emit (a private) symbol name for a firm block 107 */ 108 void be_gas_emit_block_name(const ir_node *block); 109 110 /** 111 * Starts a basic block. Emits an assembler label "blockname:" if needs_label 112 * is true, otherwise a comment with the blockname if verboseasm is enabled. 113 */ 114 void be_gas_begin_block(const ir_node *block, bool needs_label); 115 116 /** 117 * emit a string (takes care of escaping special chars) 118 */ 119 void be_gas_emit_cstring(const char *string); 120 121 /** 122 * Starts emitting a compilation unit. This emits: 123 * - global assembler snippets 124 * - debug info 125 */ 126 void be_gas_begin_compilation_unit(const be_main_env_t *env); 127 128 /** 129 * ends a compilation unit. This emits: 130 * - global declarations/variables 131 * - debug info 132 */ 133 void be_gas_end_compilation_unit(const be_main_env_t *env); 134 135 /** 136 * Return the label prefix for labeled instructions. 137 */ 138 const char *be_gas_insn_label_prefix(void); 139 140 typedef ir_node* (*get_cfop_target_func)(const ir_node *cfop); 141 142 /** 143 * Emits a jump table for switch operations 144 */ 145 void be_emit_jump_table(const ir_node *node, const ir_switch_table *table, 146 ir_entity *entity, 147 get_cfop_target_func get_cfop_target); 148 149 #endif 150