1da0c48c4Sopenharmony_ci/* Internal definitions for libasm. 2da0c48c4Sopenharmony_ci Copyright (C) 2002, 2004, 2005, 2016 Red Hat, Inc. 3da0c48c4Sopenharmony_ci This file is part of elfutils. 4da0c48c4Sopenharmony_ci 5da0c48c4Sopenharmony_ci This file is free software; you can redistribute it and/or modify 6da0c48c4Sopenharmony_ci it under the terms of either 7da0c48c4Sopenharmony_ci 8da0c48c4Sopenharmony_ci * the GNU Lesser General Public License as published by the Free 9da0c48c4Sopenharmony_ci Software Foundation; either version 3 of the License, or (at 10da0c48c4Sopenharmony_ci your option) any later version 11da0c48c4Sopenharmony_ci 12da0c48c4Sopenharmony_ci or 13da0c48c4Sopenharmony_ci 14da0c48c4Sopenharmony_ci * the GNU General Public License as published by the Free 15da0c48c4Sopenharmony_ci Software Foundation; either version 2 of the License, or (at 16da0c48c4Sopenharmony_ci your option) any later version 17da0c48c4Sopenharmony_ci 18da0c48c4Sopenharmony_ci or both in parallel, as here. 19da0c48c4Sopenharmony_ci 20da0c48c4Sopenharmony_ci elfutils is distributed in the hope that it will be useful, but 21da0c48c4Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 22da0c48c4Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 23da0c48c4Sopenharmony_ci General Public License for more details. 24da0c48c4Sopenharmony_ci 25da0c48c4Sopenharmony_ci You should have received copies of the GNU General Public License and 26da0c48c4Sopenharmony_ci the GNU Lesser General Public License along with this program. If 27da0c48c4Sopenharmony_ci not, see <http://www.gnu.org/licenses/>. */ 28da0c48c4Sopenharmony_ci 29da0c48c4Sopenharmony_ci#ifndef _LIBASMP_H 30da0c48c4Sopenharmony_ci#define _LIBASMP_H 1 31da0c48c4Sopenharmony_ci 32da0c48c4Sopenharmony_ci#include <stdio.h> 33da0c48c4Sopenharmony_ci 34da0c48c4Sopenharmony_ci#include <libasm.h> 35da0c48c4Sopenharmony_ci 36da0c48c4Sopenharmony_ci#include <system.h> 37da0c48c4Sopenharmony_ci 38da0c48c4Sopenharmony_ci#include "libebl.h" 39da0c48c4Sopenharmony_ci 40da0c48c4Sopenharmony_ci#include "libdwelf.h" 41da0c48c4Sopenharmony_ci 42da0c48c4Sopenharmony_ci 43da0c48c4Sopenharmony_ci/* Known error codes. */ 44da0c48c4Sopenharmony_cienum 45da0c48c4Sopenharmony_ci { 46da0c48c4Sopenharmony_ci ASM_E_NOERROR, 47da0c48c4Sopenharmony_ci ASM_E_NOMEM, /* No more memory. */ 48da0c48c4Sopenharmony_ci ASM_E_CANNOT_CREATE, /* Output file cannot be created. */ 49da0c48c4Sopenharmony_ci ASM_E_INVALID, /* Invalid parameters. */ 50da0c48c4Sopenharmony_ci ASM_E_CANNOT_CHMOD, /* Cannot change mode of output file. */ 51da0c48c4Sopenharmony_ci ASM_E_CANNOT_RENAME, /* Cannot rename output file. */ 52da0c48c4Sopenharmony_ci ASM_E_DUPLSYM, /* Duplicate symbol definition. */ 53da0c48c4Sopenharmony_ci ASM_E_LIBELF, /* Refer to error in libelf. */ 54da0c48c4Sopenharmony_ci ASM_E_TYPE, /* Invalid section type for operation. */ 55da0c48c4Sopenharmony_ci ASM_E_IOERROR, /* Error during output of data. */ 56da0c48c4Sopenharmony_ci ASM_E_ENOSUP, /* No backend support. */ 57da0c48c4Sopenharmony_ci ASM_E_NUM /* Keep this entry as the last. */ 58da0c48c4Sopenharmony_ci }; 59da0c48c4Sopenharmony_ci 60da0c48c4Sopenharmony_ci 61da0c48c4Sopenharmony_ci/* Special sections. */ 62da0c48c4Sopenharmony_ci#define ASM_ABS_SCN ((Elf_Scn *) 1) 63da0c48c4Sopenharmony_ci#define ASM_COM_SCN ((Elf_Scn *) 2) 64da0c48c4Sopenharmony_ci 65da0c48c4Sopenharmony_ci 66da0c48c4Sopenharmony_ci/* And the hash table for symbols. */ 67da0c48c4Sopenharmony_ci#include <symbolhash.h> 68da0c48c4Sopenharmony_ci 69da0c48c4Sopenharmony_ci 70da0c48c4Sopenharmony_ci/* Descriptor for a section. */ 71da0c48c4Sopenharmony_cistruct AsmScn 72da0c48c4Sopenharmony_ci{ 73da0c48c4Sopenharmony_ci /* The underlying assembler context. */ 74da0c48c4Sopenharmony_ci AsmCtx_t *ctx; 75da0c48c4Sopenharmony_ci 76da0c48c4Sopenharmony_ci /* Subsection ID. */ 77da0c48c4Sopenharmony_ci unsigned int subsection_id; 78da0c48c4Sopenharmony_ci 79da0c48c4Sopenharmony_ci /* Section type. */ 80da0c48c4Sopenharmony_ci GElf_Word type; 81da0c48c4Sopenharmony_ci 82da0c48c4Sopenharmony_ci union 83da0c48c4Sopenharmony_ci { 84da0c48c4Sopenharmony_ci /* Data only stored in the record for subsection zero. */ 85da0c48c4Sopenharmony_ci struct 86da0c48c4Sopenharmony_ci { 87da0c48c4Sopenharmony_ci /* The ELF section. */ 88da0c48c4Sopenharmony_ci Elf_Scn *scn; 89da0c48c4Sopenharmony_ci 90da0c48c4Sopenharmony_ci /* Entry in the section header string table. */ 91da0c48c4Sopenharmony_ci Dwelf_Strent *strent; 92da0c48c4Sopenharmony_ci 93da0c48c4Sopenharmony_ci /* Next member of group. */ 94da0c48c4Sopenharmony_ci struct AsmScn *next_in_group; 95da0c48c4Sopenharmony_ci } main; 96da0c48c4Sopenharmony_ci 97da0c48c4Sopenharmony_ci /* Pointer to the record for subsection zero. */ 98da0c48c4Sopenharmony_ci AsmScn_t *up; 99da0c48c4Sopenharmony_ci } data; 100da0c48c4Sopenharmony_ci 101da0c48c4Sopenharmony_ci /* Current offset in the (sub)section. */ 102da0c48c4Sopenharmony_ci GElf_Off offset; 103da0c48c4Sopenharmony_ci /* Maximum alignment of the section so far. */ 104da0c48c4Sopenharmony_ci GElf_Word max_align; 105da0c48c4Sopenharmony_ci 106da0c48c4Sopenharmony_ci /* Section content. */ 107da0c48c4Sopenharmony_ci struct AsmData 108da0c48c4Sopenharmony_ci { 109da0c48c4Sopenharmony_ci /* Currently used number of bytes in the block. */ 110da0c48c4Sopenharmony_ci size_t len; 111da0c48c4Sopenharmony_ci 112da0c48c4Sopenharmony_ci /* Number of bytes allocated. */ 113da0c48c4Sopenharmony_ci size_t maxlen; 114da0c48c4Sopenharmony_ci 115da0c48c4Sopenharmony_ci /* Pointer to the next block. */ 116da0c48c4Sopenharmony_ci struct AsmData *next; 117da0c48c4Sopenharmony_ci 118da0c48c4Sopenharmony_ci /* The actual data. */ 119da0c48c4Sopenharmony_ci char data[flexarr_size]; 120da0c48c4Sopenharmony_ci } *content; 121da0c48c4Sopenharmony_ci 122da0c48c4Sopenharmony_ci /* Fill pattern. */ 123da0c48c4Sopenharmony_ci struct FillPattern 124da0c48c4Sopenharmony_ci { 125da0c48c4Sopenharmony_ci size_t len; 126da0c48c4Sopenharmony_ci char bytes[flexarr_size]; 127da0c48c4Sopenharmony_ci } *pattern; 128da0c48c4Sopenharmony_ci 129da0c48c4Sopenharmony_ci /* Next subsection. */ 130da0c48c4Sopenharmony_ci AsmScn_t *subnext; 131da0c48c4Sopenharmony_ci 132da0c48c4Sopenharmony_ci /* List of all allocated sections. */ 133da0c48c4Sopenharmony_ci AsmScn_t *allnext; 134da0c48c4Sopenharmony_ci 135da0c48c4Sopenharmony_ci /* Name of the section. */ 136da0c48c4Sopenharmony_ci char name[flexarr_size]; 137da0c48c4Sopenharmony_ci}; 138da0c48c4Sopenharmony_ci 139da0c48c4Sopenharmony_ci 140da0c48c4Sopenharmony_ci/* Descriptor used for the assembling session. */ 141da0c48c4Sopenharmony_cistruct AsmCtx 142da0c48c4Sopenharmony_ci{ 143da0c48c4Sopenharmony_ci /* File descriptor of the temporary file. */ 144da0c48c4Sopenharmony_ci int fd; 145da0c48c4Sopenharmony_ci 146da0c48c4Sopenharmony_ci /* True if text output is wanted. */ 147da0c48c4Sopenharmony_ci bool textp; 148da0c48c4Sopenharmony_ci 149da0c48c4Sopenharmony_ci /* Output file handle. */ 150da0c48c4Sopenharmony_ci union 151da0c48c4Sopenharmony_ci { 152da0c48c4Sopenharmony_ci /* ELF descriptor of the temporary file. */ 153da0c48c4Sopenharmony_ci Elf *elf; 154da0c48c4Sopenharmony_ci /* I/O stream for text output. */ 155da0c48c4Sopenharmony_ci FILE *file; 156da0c48c4Sopenharmony_ci } out; 157da0c48c4Sopenharmony_ci 158da0c48c4Sopenharmony_ci 159da0c48c4Sopenharmony_ci /* List with defined sections. */ 160da0c48c4Sopenharmony_ci AsmScn_t *section_list; 161da0c48c4Sopenharmony_ci /* Section header string table. */ 162da0c48c4Sopenharmony_ci Dwelf_Strtab *section_strtab; 163da0c48c4Sopenharmony_ci 164da0c48c4Sopenharmony_ci /* Table with defined symbols. */ 165da0c48c4Sopenharmony_ci asm_symbol_tab symbol_tab; 166da0c48c4Sopenharmony_ci /* Number of symbols in the table. */ 167da0c48c4Sopenharmony_ci unsigned int nsymbol_tab; 168da0c48c4Sopenharmony_ci /* Symbol string table. */ 169da0c48c4Sopenharmony_ci Dwelf_Strtab *symbol_strtab; 170da0c48c4Sopenharmony_ci 171da0c48c4Sopenharmony_ci /* List of section groups. */ 172da0c48c4Sopenharmony_ci struct AsmScnGrp *groups; 173da0c48c4Sopenharmony_ci /* Number of section groups. */ 174da0c48c4Sopenharmony_ci size_t ngroups; 175da0c48c4Sopenharmony_ci 176da0c48c4Sopenharmony_ci /* Current required alignment for common symbols. */ 177da0c48c4Sopenharmony_ci GElf_Word common_align; 178da0c48c4Sopenharmony_ci 179da0c48c4Sopenharmony_ci /* Lock to handle multithreaded programs. */ 180da0c48c4Sopenharmony_ci rwlock_define (,lock); 181da0c48c4Sopenharmony_ci 182da0c48c4Sopenharmony_ci /* Counter for temporary symbols. */ 183da0c48c4Sopenharmony_ci unsigned int tempsym_count; 184da0c48c4Sopenharmony_ci 185da0c48c4Sopenharmony_ci /* Name of the output file. */ 186da0c48c4Sopenharmony_ci char *fname; 187da0c48c4Sopenharmony_ci /* The name of the temporary file. */ 188da0c48c4Sopenharmony_ci char tmp_fname[flexarr_size]; 189da0c48c4Sopenharmony_ci}; 190da0c48c4Sopenharmony_ci 191da0c48c4Sopenharmony_ci 192da0c48c4Sopenharmony_ci/* Descriptor for a symbol. */ 193da0c48c4Sopenharmony_cistruct AsmSym 194da0c48c4Sopenharmony_ci{ 195da0c48c4Sopenharmony_ci /* Reference to the section which contains the symbol. */ 196da0c48c4Sopenharmony_ci AsmScn_t *scn; 197da0c48c4Sopenharmony_ci 198da0c48c4Sopenharmony_ci /* Type of the symbol. */ 199da0c48c4Sopenharmony_ci int8_t type; 200da0c48c4Sopenharmony_ci /* Binding of the symbol. */ 201da0c48c4Sopenharmony_ci int8_t binding; 202da0c48c4Sopenharmony_ci 203da0c48c4Sopenharmony_ci /* Size of the symbol. */ 204da0c48c4Sopenharmony_ci GElf_Xword size; 205da0c48c4Sopenharmony_ci 206da0c48c4Sopenharmony_ci /* Offset in the section. */ 207da0c48c4Sopenharmony_ci GElf_Off offset; 208da0c48c4Sopenharmony_ci 209da0c48c4Sopenharmony_ci /* Symbol table index of the symbol in the symbol table. */ 210da0c48c4Sopenharmony_ci size_t symidx; 211da0c48c4Sopenharmony_ci 212da0c48c4Sopenharmony_ci /* Reference to name of the symbol. */ 213da0c48c4Sopenharmony_ci Dwelf_Strent *strent; 214da0c48c4Sopenharmony_ci}; 215da0c48c4Sopenharmony_ci 216da0c48c4Sopenharmony_ci 217da0c48c4Sopenharmony_ci/* Descriptor for section group. */ 218da0c48c4Sopenharmony_cistruct AsmScnGrp 219da0c48c4Sopenharmony_ci{ 220da0c48c4Sopenharmony_ci /* Entry in the section header string table. */ 221da0c48c4Sopenharmony_ci Dwelf_Strent *strent; 222da0c48c4Sopenharmony_ci 223da0c48c4Sopenharmony_ci /* The ELF section. */ 224da0c48c4Sopenharmony_ci Elf_Scn *scn; 225da0c48c4Sopenharmony_ci 226da0c48c4Sopenharmony_ci /* The signature. */ 227da0c48c4Sopenharmony_ci struct AsmSym *signature; 228da0c48c4Sopenharmony_ci 229da0c48c4Sopenharmony_ci /* First member. */ 230da0c48c4Sopenharmony_ci struct AsmScn *members; 231da0c48c4Sopenharmony_ci /* Number of members. */ 232da0c48c4Sopenharmony_ci size_t nmembers; 233da0c48c4Sopenharmony_ci 234da0c48c4Sopenharmony_ci /* Flags. */ 235da0c48c4Sopenharmony_ci Elf32_Word flags; 236da0c48c4Sopenharmony_ci 237da0c48c4Sopenharmony_ci /* Next group. */ 238da0c48c4Sopenharmony_ci struct AsmScnGrp *next; 239da0c48c4Sopenharmony_ci 240da0c48c4Sopenharmony_ci /* Name of the section group. */ 241da0c48c4Sopenharmony_ci char name[flexarr_size]; 242da0c48c4Sopenharmony_ci}; 243da0c48c4Sopenharmony_ci 244da0c48c4Sopenharmony_ci 245da0c48c4Sopenharmony_ci/* Descriptor for disassembler. */ 246da0c48c4Sopenharmony_cistruct DisasmCtx 247da0c48c4Sopenharmony_ci{ 248da0c48c4Sopenharmony_ci /* Handle for the backend library with the disassembler routine. */ 249da0c48c4Sopenharmony_ci Ebl *ebl; 250da0c48c4Sopenharmony_ci 251da0c48c4Sopenharmony_ci /* ELF file containing all the data passed to the function. This 252da0c48c4Sopenharmony_ci allows to look up symbols. */ 253da0c48c4Sopenharmony_ci Elf *elf; 254da0c48c4Sopenharmony_ci 255da0c48c4Sopenharmony_ci /* Callback function to determine symbol names. */ 256da0c48c4Sopenharmony_ci DisasmGetSymCB_t symcb; 257da0c48c4Sopenharmony_ci}; 258da0c48c4Sopenharmony_ci 259da0c48c4Sopenharmony_ci 260da0c48c4Sopenharmony_ci/* The default fill pattern: one zero byte. */ 261da0c48c4Sopenharmony_ciextern const struct FillPattern *__libasm_default_pattern 262da0c48c4Sopenharmony_ci attribute_hidden; 263da0c48c4Sopenharmony_ci 264da0c48c4Sopenharmony_ci 265da0c48c4Sopenharmony_ci/* Ensure there are at least LEN bytes available in the output buffer 266da0c48c4Sopenharmony_ci for ASMSCN. */ 267da0c48c4Sopenharmony_ciextern int __libasm_ensure_section_space (AsmScn_t *asmscn, size_t len) 268da0c48c4Sopenharmony_ci internal_function; 269da0c48c4Sopenharmony_ci 270da0c48c4Sopenharmony_ci/* Free all resources associated with the assembler context. */ 271da0c48c4Sopenharmony_ciextern void __libasm_finictx (AsmCtx_t *ctx) internal_function; 272da0c48c4Sopenharmony_ci 273da0c48c4Sopenharmony_ci/* Set error code. */ 274da0c48c4Sopenharmony_ciextern void __libasm_seterrno (int err) internal_function; 275da0c48c4Sopenharmony_ci 276da0c48c4Sopenharmony_ci/* Return handle for the named section. If it was not used before 277da0c48c4Sopenharmony_ci create it. */ 278da0c48c4Sopenharmony_ciextern AsmScn_t *__asm_newscn_internal (AsmCtx_t *ctx, const char *scnname, 279da0c48c4Sopenharmony_ci GElf_Word type, GElf_Xword flags) 280da0c48c4Sopenharmony_ci attribute_hidden; 281da0c48c4Sopenharmony_ci 282da0c48c4Sopenharmony_ci 283da0c48c4Sopenharmony_ci/* Internal aliases of the asm_addintXX functions. */ 284da0c48c4Sopenharmony_ciextern int __asm_addint8_internal (AsmScn_t *asmscn, int8_t num) 285da0c48c4Sopenharmony_ci attribute_hidden; 286da0c48c4Sopenharmony_ciextern int __asm_addint16_internal (AsmScn_t *asmscn, int16_t num) 287da0c48c4Sopenharmony_ci attribute_hidden; 288da0c48c4Sopenharmony_ciextern int __asm_addint32_internal (AsmScn_t *asmscn, int32_t num) 289da0c48c4Sopenharmony_ci attribute_hidden; 290da0c48c4Sopenharmony_ciextern int __asm_addint64_internal (AsmScn_t *asmscn, int64_t num) 291da0c48c4Sopenharmony_ci attribute_hidden; 292da0c48c4Sopenharmony_ci 293da0c48c4Sopenharmony_ci 294da0c48c4Sopenharmony_ci/* Produce disassembly output for given memory and output it using the 295da0c48c4Sopenharmony_ci given callback functions. */ 296da0c48c4Sopenharmony_ciextern int __disasm_cb_internal (DisasmCtx_t *ctx, const uint8_t **startp, 297da0c48c4Sopenharmony_ci const uint8_t *end, GElf_Addr addr, 298da0c48c4Sopenharmony_ci const char *fmt, DisasmOutputCB_t outcb, 299da0c48c4Sopenharmony_ci void *outcbarp, void *symcbarg) 300da0c48c4Sopenharmony_ci attribute_hidden; 301da0c48c4Sopenharmony_ci 302da0c48c4Sopenharmony_ci 303da0c48c4Sopenharmony_ci/* Test whether given symbol is an internal symbol and if yes, whether 304da0c48c4Sopenharmony_ci we should nevertheless emit it in the symbol table. */ 305da0c48c4Sopenharmony_ci// XXX The second part should probably be controlled by an option which 306da0c48c4Sopenharmony_ci// isn't implemented yet 307da0c48c4Sopenharmony_ci// XXX Also, the format will change with the backend. 308da0c48c4Sopenharmony_ci#define asm_emit_symbol_p(name) (!startswith (name, ".L")) 309da0c48c4Sopenharmony_ci 310da0c48c4Sopenharmony_ci#endif /* libasmP.h */ 311