You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
8.1 KiB
222 lines
8.1 KiB
/*********************************************************************** |
|
* toolchain/nxflat/thumb2/dyncall_skeleton.def |
|
* |
|
* Copyright (C) 2009 Gregory Nutt. All rights reserved. |
|
* Author: Gregory Nutt <gnutt@nuttx.org> |
|
* |
|
* Redistribution and use in source and binary forms, with or without |
|
* modification, are permitted provided that the following conditions |
|
* are met: |
|
* |
|
* 1. Redistributions of source code must retain the above copyright |
|
* notice, this list of conditions and the following disclaimer. |
|
* 2. Redistributions in binary form must reproduce the above copyright |
|
* notice, this list of conditions and the following disclaimer in |
|
* the documentation and/or other materials provided with the |
|
* distribution. |
|
* 3. Neither the name NuttX nor the names of its contributors may be |
|
* used to endorse or promote products derived from this software |
|
* without specific prior written permission. |
|
* |
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS |
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
* POSSIBILITY OF SUCH DAMAGE. |
|
* |
|
***********************************************************************/ |
|
|
|
/******************************************************************* |
|
* File Prologue |
|
*******************************************************************/ |
|
|
|
static const char file_prologue[] = |
|
"/*******************************************************************\n" |
|
" *\n" |
|
" * This file contains the dynamic call logic that performs the thunk\n" |
|
" * for outound calls from one module to another.\n" |
|
" *\n" |
|
" * ARM register quick reference:\n" |
|
" *\n" |
|
" * Name Number ARM Procedure Calling Standard Role\n" |
|
" *\n" |
|
" * a1 r0 argument 1/integer result/scratch register/argc\n" |
|
" * a2 r1 argument 2/scratch register/argv\n" |
|
" * a3 r2 argument 3/scratch register/envp\n" |
|
" * a4 r3 argument 4/scratch register\n" |
|
" * v1 r4 register variable\n" |
|
" * v2 r5 register variable\n" |
|
" * v3 r6 register variable\n" |
|
" * v4 r7 register variable\n" |
|
" * v5 r8 register variable\n" |
|
" * sb/v6 r9 static base/register variable\n" |
|
" * sl/v7 r10 stack limit/stack chunk handle/reg. variable\n" |
|
" * fp r11 frame pointer\n" |
|
" * ip r12 scratch register/new-sb in inter-link-unit calls\n" |
|
" * sp r13 lower end of current stack frame\n" |
|
" * lr r14 link address/scratch register\n" |
|
" * pc r15 program counter\n" |
|
" *******************************************************************/\n\n" |
|
"\t.syntax\tunified\n" |
|
"\t.thumb\n\n" |
|
"/*******************************************************************\n" |
|
" * Included Files\n" |
|
" *******************************************************************/\n\n" |
|
"/*******************************************************************\n" |
|
" * Definitions\n" |
|
" *******************************************************************/\n"; |
|
|
|
static const char import_prologue[] = ""; |
|
|
|
/******************************************************************* |
|
* Import Function Name String Table |
|
*******************************************************************/ |
|
|
|
static const char import_name_strtab_prologue[] = |
|
"\n/*******************************************************************\n" |
|
" * Import Function Names\n" |
|
" *******************************************************************/\n\n" |
|
"/* These are the names of all of the functions that are imported.\n" |
|
" * Notice that all data associated with the library names is retained\n" |
|
" * in the .text section." |
|
" */\n\n" |
|
"\t.text\n" |
|
"\t.align\t0\n"; |
|
|
|
#define MKIMPSTRTABARG(fn,i) (i), (i), (i), (fn), (i), (i) |
|
|
|
static const char import_name_strtab_format[] = |
|
"\n\t.local\t__dynimport%04d\n" |
|
"\t.type\t__dynimport%04d, object\n\n" |
|
"__dynimport%04d:\n" |
|
"\t.asciz\t\"%s\"\n" |
|
"\t.size\t__dynimport%04d, .-__dynimport%04d\n"; |
|
|
|
/******************************************************************* |
|
* Dyanamic Call Information |
|
*******************************************************************/ |
|
|
|
static const char dynimport_decl_prologue[] = |
|
"\n/*******************************************************************\n" |
|
" * Imported Symbol Table (an array of type struct flat_import)\n" |
|
" *******************************************************************/\n\n" |
|
"/* Notice that, unlike most other arrays in this file, this array\n" |
|
" * is declared to reside in .data. Because of this, there will be\n" |
|
" * per-process instances of this table.\n" |
|
" */\n\n" |
|
"\t.data\n" |
|
"\t.align\t2\n\n" |
|
"\t.global\t__dynimport_begin\n" |
|
"\t.type\t__dynimport_begin, object\n" |
|
"\t.global\t__dynimport_end\n" |
|
"\t.type\t__dynimport_end, object\n\n"; |
|
|
|
#define MKINFODECLARGS(fn, i) (i), (fn), (i) |
|
|
|
static const char dynimport_decl_format[] = |
|
"\t.local\t__dyninfo%04d\t/* Dynamic info for imported symbol %s */\n" |
|
"\t.type\t__dyninfo%04d, object\n"; |
|
|
|
static const char dynimport_array_prologue[] = |
|
"\n__dynimport_begin:\n"; |
|
|
|
#define MKINFOARGS(fn, i) (i), (fn), (i), (i), (i) |
|
|
|
static const char dynimport_array_format[] = |
|
"__dyninfo%04d:\t\t\t/* Dynamic info for imported symbol %s */\n" |
|
"\t.word\t__dynimport%04d\t/* Offset to name of imported function */\n" |
|
"\t.word\t0\t\t/* Resolved address of imported function */\n" |
|
"\t.size\t__dyninfo%04d, .-__dyninfo%04d\n"; |
|
|
|
static const char dynimport_array_epilogue[] = |
|
"__dynimport_end:\n" |
|
"\t.size\t__dynimport_begin, __dynimport_end-__dynimport_begin\n"; |
|
|
|
static const char dyncall_decl_prologue[] = |
|
"\n/*******************************************************************\n" |
|
" * Dynamic Call Logic\n" |
|
" *******************************************************************/\n\n" |
|
"\t.text\n" |
|
"\t.align\t2\n"; |
|
|
|
#define MKCALLARGS(fn, i) (fn), (fn), (fn), (fn), (i), (i), (i), (fn), (fn) |
|
|
|
#ifndef __NO_GOT__ |
|
|
|
static const char dyncall_format[] = |
|
"\n/* Dynamic call logic for imported symbol %s */\n\n" |
|
"\t.global\t%s\n" |
|
"\t.type\t%s, function\n" |
|
"\t.thumb_func\n\n" |
|
"%s:\n" |
|
"\tldr\tip,.Ldyn%04d\n" |
|
"\tadd\tip,ip,sl\n" |
|
"\tldr\tip,[ip,#4]\n" |
|
"\tbx\tip\n" |
|
".Ldyn%04d:\n" |
|
"\t.word\t__dyninfo%04d(GOTOFF)\n" |
|
"\t.size\t%s, .-%s\n"; |
|
|
|
static const char nonreturning_dyncall_format[] = |
|
"\n/* Dynamic call logic for imported, non-returning symbol %s */\n\n" |
|
"\t.global\t%s\n" |
|
"\t.type\t%s, function\n" |
|
"\t.thumb_func\n\n" |
|
"%s:\n" |
|
"\tldr\tip,.Ldyn%04d\n" |
|
"\tadd\tip,ip,sl\n" |
|
"\tldr\tip,[ip,#4]\n" |
|
"\tbx\tip\n" |
|
".Ldyn%04d:\n" |
|
"\t.word\t__dyninfo%04d(GOTOFF)\n" |
|
"\t.size\t%s, .-%s\n"; |
|
|
|
#else |
|
|
|
static const char dyncall_format[] = |
|
"\n/* Dynamic call logic for imported symbol %s */\n\n" |
|
"\t.global\t%s\n" |
|
"\t.type\t%s, function\n" |
|
"\t.thumb_func\n\n" |
|
"%s:\n" |
|
"\tldr\tip,.Ldyn%04d\n" |
|
"\tadd\tip,ip,sl\n" |
|
"\tldr\tip,[ip,#4]\n" |
|
"\tbx\tip\n" |
|
".Ldyn%04d:\n" |
|
"\t.word\t__dyninfo%04d\n" |
|
"\t.size\t%s, .-%s\n"; |
|
|
|
static const char nonreturning_dyncall_format[] = |
|
"\n/* Dynamic call logic for imported, non-returning symbol %s */\n\n" |
|
"\t.global\t%s\n" |
|
"\t.type\t%s, function\n" |
|
"\t.thumb_func\n\n" |
|
"%s:\n" |
|
"\tldr\tip,.Ldyn%04d\n" |
|
"\tadd\tip,ip,sl\n" |
|
"\tldr\tip,[ip,#4]\n" |
|
"\tbx\tip\n" |
|
".Ldyn%04d:\n" |
|
"\t.word\t__dyninfo%04d\n" |
|
"\t.size\t%s, .-%s\n"; |
|
|
|
#endif |
|
|
|
/******************************************************************* |
|
* File Epilogue |
|
*******************************************************************/ |
|
|
|
static const char file_epilogue[] = |
|
"\t.end\n"; |
|
|
|
|
|
|
|
|
|
|