Add PIC support.

This commit is contained in:
scw 2003-03-24 14:26:16 +00:00
parent 2e5c2cd2ae
commit 955a468334
1 changed files with 74 additions and 8 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: asm.h,v 1.7 2003/01/21 11:27:18 scw Exp $ */
/* $NetBSD: asm.h,v 1.8 2003/03/24 14:26:16 scw Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@ -75,12 +75,6 @@
#ifndef _SH5_ASM_H
#define _SH5_ASM_H
#define PIC_PROLOGUE
#define PIC_EPILOGUE
#define PIC_PLT(x) x
#define PIC_GOT(x) x
#define PIC_GOTOFF(x) x
#ifdef __NO_LEADING_UNDERSCORES__
# define _C_LABEL(x) x
#else
@ -122,6 +116,7 @@
_TEXT_SECTION ;\
_ALIGN_TEXT ;\
.globl x ;\
.type x,@function ;\
x:
/*
@ -129,7 +124,11 @@
* the function prologue...
*/
#ifdef GPROF
#define _PROF_PROLOGUE pta/l _mcount, tr0; blink tr0, r0
#ifdef PIC
#define _PROF_PROLOGUE pta/l __mcount@PLT, tr0; blink tr0, r0
#else
#define _PROF_PROLOGUE pta/l __mcount, tr0; blink tr0, r0
#endif
#else
#define _PROF_PROLOGUE
#endif
@ -240,26 +239,43 @@
shori (((v) >> 16) & 65535), reg ;\
shori ((v) & 65535), reg
#ifndef _LP64
/*
* Load the effective address of a data object into a register
*/
#define LEA(sym, reg) LDC32(datalabel (sym), reg)
/*
* Ditto, but used for loading a relative address
*/
#define LEAR(sym, label, reg) \
movi (((datalabel sym - (label - .)) >> 16) & 65535), reg; \
shori ((datalabel sym - (label - .)) & 65535), reg
/*
* Load the effective address of a function into a register.
*/
#define LEAF(sym, reg) LDC32(sym, reg)
/*
* Ditto, but used for loading a relative address
*/
#define LEARF(fn, label, reg) \
movi (((fn - (label - .)) >> 16) & 65535), reg; \
shori ((fn - (label - .)) & 65535), reg
/*
* Instruction to load a pointer
*/
#define LDPTR ld.l
#define LDXPTR ldx.l
/*
* Instruction to store a pointer
*/
#define STPTR st.l
#define STXPTR stx.l
/*
* Set up/Clear down a C-like stack frame on entry/exit to an assembly function
@ -301,9 +317,21 @@
*/
#define LEA(sym, reg) LDC64(datalabel (sym), reg)
#define LEAR(sym, label, reg) \
movi (((datalabel sym - (label - .)) >> 48) & 65535), reg; \
movi (((datalabel sym - (label - .)) >> 32) & 65535), reg; \
movi (((datalabel sym - (label - .)) >> 16) & 65535), reg; \
shori ((datalabel sym - (label - .)) & 65535), reg
#define LEAF(sym, reg) LDC64(sym, reg)
#define LEARF(fn, label, reg) \
movi (((fn - (label - .)) >> 48) & 65535), reg; \
movi (((fn - (label - .)) >> 32) & 65535), reg; \
movi (((fn - (label - .)) >> 16) & 65535), reg; \
shori ((fn - (label - .)) & 65535), reg
#define LDPTR ld.q
#define LDXPTR ldx.q
#define STPTR st.q
#define STXPTR stx.q
#define LINK_FRAME(sz) \
addi r15, -(16 + (sz)), r15 ;\
st.q r15, (sz), r14 ;\
@ -332,6 +360,44 @@
addi r15, 16, r15
#endif
#ifndef PIC
#define PIC_PROLOGUE
#define PIC_EPILOGUE
#define PIC_GET_GOT(tr)
#define PIC_LEAF(x, r) \
LEAF(x, r)
#define PIC_LEA(x, r) \
LEA(x, r)
#define PIC_PTAL(x, tmp, tr) \
pta/l x, tr
#define PIC_PTAU(x, tmp, tr) \
pta/u x, tr
#else
#define PIC_GET_GOT(tr) \
LEAR(_GLOBAL_OFFSET_TABLE_, 1f, r12) ;\
1: ptrel/u r12, tr ;\
gettr tr, r12
#define PIC_PROLOGUE \
addi r15, -8, r15 ;\
st.q r15, 0, r12 ;\
PIC_GET_GOT(tr0)
#define PIC_EPILOGUE \
ld.q r15, 0, r12 ;\
addi r15, 8, r15
#define PIC_LEAF(x, r) \
LEAF(x@GOTPLT, r) ;\
LDXPTR r12, r, r
#define PIC_LEA(x, r) \
LEA(x@GOT, r) ;\
LDXPTR r12, r, r
#define PIC_PTAL(x, tmp, tr) \
PIC_LEAF(x, tmp) ;\
ptabs/l tmp, tr
#define PIC_PTAU(x, tmp, tr) \
PIC_LEAF(x, tmp) ;\
ptabs/u tmp, tr
#endif
/*
* Used in assembly code to convert a pteg hash into the offset from