From 2c190da52dbfe58d46c8e4d4dcc924fb444e0334 Mon Sep 17 00:00:00 2001 From: midipix Date: Sat, 4 Feb 2017 11:50:08 -0500 Subject: logic: replaced interface: prefix mdso_generate --> mdso_asmgen. --- src/logic/mdso_asmgen_dsometa.c | 84 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/logic/mdso_asmgen_dsometa.c (limited to 'src/logic/mdso_asmgen_dsometa.c') diff --git a/src/logic/mdso_asmgen_dsometa.c b/src/logic/mdso_asmgen_dsometa.c new file mode 100644 index 0000000..6cf9186 --- /dev/null +++ b/src/logic/mdso_asmgen_dsometa.c @@ -0,0 +1,84 @@ +/****************************************************************/ +/* mdso: midipix dso scavenger */ +/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ +/****************************************************************/ + +#include +#include + +#include +#include +#include "mdso_errinfo_impl.h" + +static const char * const asm_hdr_lines[] = { + "\t.file \"__%s_dso_meta.s\"\n", + + "\t.section " MDSO_META_SECTION ",\"r\"\n", + "\t.globl .__dsometa_%s\n", + 0 +}; + +static const char * const asm_meta_lines[] = { + "\t.long\t0 # priority\n", + "\t.long\t0 # nsyms\n", + "\t.long\t0 # padding\n", + "\t%s\t0 # hashtbl\n", + "\t%s\t0 # symtbl\n", + "\t%s\t0 # fncarg\n", + "\t%s\t0 # fncargarr\n", + "\t%s\t0 # fnr1\n", + "\t%s\t0 # fnr2\n", + 0 +}; + +static const char * const asm_libname_fmt = + "\n\n" + "\t.section " MDSO_STRS_SECTION ",\"r0\"\n\n" + "._name:\n" + "\t.ascii\t\"%s\\0\"\n\n"; + +int mdso_asmgen_dsometa( + const struct mdso_driver_ctx * dctx, + FILE * fout) +{ + const char * const * line; + const char * alignstr; + const char * ptrsize; + + if (dctx->cctx->drvflags & MDSO_DRIVER_QUAD_PTR) { + alignstr = "\t.balign 16\n\n"; + ptrsize = ".quad"; + } else { + alignstr = "\t.balign 8\n\n"; + ptrsize = ".long"; + } + + for (line=asm_hdr_lines; *line; line++) + if ((fprintf(fout,*line,dctx->cctx->libname)) < 0) + return MDSO_FILE_ERROR(dctx); + + if ((fputs(alignstr,fout)) < 0) + return MDSO_FILE_ERROR(dctx); + + if ((fprintf(fout,".__dsometa_%s:\n",dctx->cctx->libname)) < 0) + return MDSO_FILE_ERROR(dctx); + + if ((fprintf(fout,"\t%s\t%d\t# base\n",ptrsize,0)) < 0) + return MDSO_FILE_ERROR(dctx); + + if ((fprintf(fout,"\t%s\t%s\t# name\n",ptrsize,"._name")) < 0) + return MDSO_FILE_ERROR(dctx); + + if ((fprintf(fout,"\t%s\t%u\t# flags\n",".long",dctx->cctx->dsoflags)) < 0) + return MDSO_FILE_ERROR(dctx); + + for (line=asm_meta_lines; *line; line++) + if ((fprintf(fout,*line,ptrsize)) < 0) + return MDSO_FILE_ERROR(dctx); + + if (fprintf(fout,asm_libname_fmt,dctx->cctx->libname) < 0) + return MDSO_FILE_ERROR(dctx); + + return 0; +} -- cgit v1.2.3