Commit 5dde558c authored by Marc G. Fournier's avatar Marc G. Fournier

From: Dan McGuirk <mcguirk@indirect.com>

Subject: [HACKERS] linux/alpha patches

These patches lay the groundwork for a Linux/Alpha port.  The port doesn't
actually work unless you tweak the linker to put all the pointers in the
first 32 bits of the address space, but it's at least a start.  It
implements the test-and-set instruction in Alpha assembly, and also fixes
a lot of pointer-to-integer conversions, which is probably good anyway.
parent b66569e4
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.7 1997/01/10 20:17:56 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.8 1997/03/12 21:05:56 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -292,7 +292,7 @@ create_seqscan_node(Path *best_path, List *tlist, List *scan_clauses) ...@@ -292,7 +292,7 @@ create_seqscan_node(Path *best_path, List *tlist, List *scan_clauses)
if(temp == NULL) if(temp == NULL)
elog(WARN,"scanrelid is empty"); elog(WARN,"scanrelid is empty");
else else
scan_relid = (Index)lfirst(temp); /* ??? who takes care of lnext? - ay */ scan_relid = (Index)lfirsti(temp); /* ??? who takes care of lnext? - ay */
scan_node = make_seqscan(tlist, scan_node = make_seqscan(tlist,
scan_clauses, scan_clauses,
scan_relid, scan_relid,
...@@ -640,10 +640,10 @@ fix_indxqual_references(Node *clause, Path *index_path) ...@@ -640,10 +640,10 @@ fix_indxqual_references(Node *clause, Path *index_path)
is_funcclause((Node*)get_leftop((Expr*)clause)) && is_funcclause((Node*)get_leftop((Expr*)clause)) &&
((Func*)((Expr*)get_leftop((Expr*)clause))->oper)->funcisindex){ ((Func*)((Expr*)get_leftop((Expr*)clause))->oper)->funcisindex){
Var *newvar = Var *newvar =
makeVar((Index)lfirst(index_path->parent->relids), makeVar((Index)lfirsti(index_path->parent->relids),
1, /* func indices have one key */ 1, /* func indices have one key */
((Func*)((Expr*)clause)->oper)->functype, ((Func*)((Expr*)clause)->oper)->functype,
(Index)lfirst(index_path->parent->relids), (Index)lfirsti(index_path->parent->relids),
0); 0);
return return
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.3 1997/02/20 02:53:26 vadim Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.4 1997/03/12 21:05:59 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -256,8 +256,8 @@ add_join_clause_info_to_rels(Query *root, CInfo *clauseinfo, List *join_relids) ...@@ -256,8 +256,8 @@ add_join_clause_info_to_rels(Query *root, CInfo *clauseinfo, List *join_relids)
foreach (rel, join_relids) foreach (rel, join_relids)
{ {
if ( (int)lfirst(rel) != (int)lfirst(join_relid) ) if ( lfirsti(rel) != lfirsti(join_relid) )
other_rels = lappendi (other_rels, lfirst(rel)); other_rels = lappendi (other_rels, lfirsti(rel));
} }
joininfo = joininfo =
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/plancat.c,v 1.3 1996/11/06 09:29:24 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/plancat.c,v 1.4 1997/03/12 21:06:14 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -267,12 +267,12 @@ index_selectivity(Oid indid, ...@@ -267,12 +267,12 @@ index_selectivity(Oid indid,
i = 0; i = 0;
foreach(xopno, opnos) { foreach(xopno, opnos) {
opno_array[i++] = (int)lfirst(xopno); opno_array[i++] = lfirsti(xopno);
} }
i = 0; i = 0;
foreach(xattno,attnos) { foreach(xattno,attnos) {
attno_array[i++] = (int)lfirst(xattno); attno_array[i++] = lfirsti(xattno);
} }
i = 0; i = 0;
...@@ -282,7 +282,7 @@ index_selectivity(Oid indid, ...@@ -282,7 +282,7 @@ index_selectivity(Oid indid,
i = 0; i = 0;
foreach(flag,flags) { foreach(flag,flags) {
flag_array[i++] = (int)lfirst(flag); flag_array[i++] = lfirsti(flag);
} }
IndexSelectivity(indid, IndexSelectivity(indid,
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/Attic/s_lock.c,v 1.11 1997/02/14 04:16:43 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/ipc/Attic/s_lock.c,v 1.12 1997/03/12 21:06:48 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -126,7 +126,7 @@ S_LOCK_FREE(slock_t *lock) ...@@ -126,7 +126,7 @@ S_LOCK_FREE(slock_t *lock)
* (see storage/ipc.h). * (see storage/ipc.h).
*/ */
#if defined(alpha) #if defined(alpha) && !defined(linuxalpha)
void void
S_LOCK(slock_t *lock) S_LOCK(slock_t *lock)
...@@ -409,4 +409,48 @@ S_INIT_LOCK(slock_t *lock) ...@@ -409,4 +409,48 @@ S_INIT_LOCK(slock_t *lock)
#endif /* NEED_I386_TAS_ASM */ #endif /* NEED_I386_TAS_ASM */
#if defined(linuxalpha)
int
tas(slock_t *m)
{
slock_t res;
__asm__(" ldq $0, %0 \n\
bne $0, already_set \n\
ldq_l $0, %0 \n\
bne $0, already_set \n\
or $31, 1, $0 \n\
stq_c $0, %0 \n\
beq $0, stqc_fail \n\
success: bis $31, $31, %1 \n\
mb \n\
jmp $31, end \n\
stqc_fail: or $31, 1, $0 \n\
already_set: bis $0, $0, %1 \n\
end: nop " : "=m" (*m), "=r" (res) :: "0" );
return(res);
}
void
S_LOCK(slock_t *lock)
{
while (tas(lock))
;
}
void
S_UNLOCK(slock_t *lock)
{
__asm__("mb");
*lock = 0;
}
void
S_INIT_LOCK(slock_t *lock)
{
S_UNLOCK(lock);
}
#endif
#endif /* HAS_TEST_AND_SET */ #endif /* HAS_TEST_AND_SET */
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.5 1996/11/24 04:41:29 bryanh Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.6 1997/03/12 21:07:11 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -512,12 +512,13 @@ PageIndexTupleDeleteAdjustLinePointers(PageHeader phdr, ...@@ -512,12 +512,13 @@ PageIndexTupleDeleteAdjustLinePointers(PageHeader phdr,
Size size) Size size)
{ {
int i; int i;
unsigned offset;
/* location is an index into the page... */ /* location is an index into the page... */
location -= (int) phdr; offset = (unsigned)(location - (char *)phdr);
for (i = PageGetMaxOffsetNumber((Page) phdr) - 1; i >= 0; i--) { for (i = PageGetMaxOffsetNumber((Page) phdr) - 1; i >= 0; i--) {
if (phdr->pd_linp[i].lp_off <= (unsigned) location) { if (phdr->pd_linp[i].lp_off <= offset) {
phdr->pd_linp[i].lp_off += size; phdr->pd_linp[i].lp_off += size;
} }
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/fastpath.c,v 1.3 1996/11/08 05:59:26 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/tcop/fastpath.c,v 1.4 1997/03/12 21:07:50 scrappy Exp $
* *
* NOTES * NOTES
* This cruft is the server side of PQfn. * This cruft is the server side of PQfn.
...@@ -93,7 +93,7 @@ SendFunctionResult(Oid fid, /* function id */ ...@@ -93,7 +93,7 @@ SendFunctionResult(Oid fid, /* function id */
pq_putnchar("G", 1); pq_putnchar("G", 1);
if (retbyval) { /* by-value */ if (retbyval) { /* by-value */
pq_putint(retlen, 4); pq_putint(retlen, 4);
pq_putint((int)retval, retlen); pq_putint((int)(Datum)retval, retlen);
} else { /* by-reference ... */ } else { /* by-reference ... */
if (retlen < 0) { /* ... varlena */ if (retlen < 0) { /* ... varlena */
pq_putint(VARSIZE(retval) - VARHDRSZ, 4); pq_putint(VARSIZE(retval) - VARHDRSZ, 4);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.12 1997/02/19 20:10:49 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.13 1997/03/12 21:09:11 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -100,6 +100,26 @@ extern double atof(const char *p); ...@@ -100,6 +100,26 @@ extern double atof(const char *p);
#define FLOAT8_MAX DBL_MAX #define FLOAT8_MAX DBL_MAX
#define FLOAT8_MIN DBL_MIN #define FLOAT8_MIN DBL_MIN
/*
* if FLOAT8_MIN and FLOAT8_MAX are the limits of the range a
* double can store, then how are we ever going to wind up
* with something stored in a double that is outside those
* limits? (and similarly for FLOAT4_{MIN,MAX}/float.)
* doesn't make sense to me, and it causes a
* floating point exception on linuxalpha, so UNSAFE_FLOATS
* it is.
* (maybe someone wanted to allow for values other than DBL_MIN/
* DBL_MAX for FLOAT8_MIN/FLOAT8_MAX?)
* --djm 12/12/96
* according to Richard Henderson this is a known bug in gcc on
* the Alpha. might as well leave the workaround in
* until the distributions are updated.
* --djm 12/16/96
*/
#if defined(linuxalpha) && !defined(UNSAFE_FLOATS)
#define UNSAFE_FLOATS
#endif
/* /*
check to see if a float4 val is outside of check to see if a float4 val is outside of
the FLOAT4_MIN, FLOAT4_MAX bounds. the FLOAT4_MIN, FLOAT4_MAX bounds.
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/oid.c,v 1.4 1997/01/10 20:19:45 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/oid.c,v 1.5 1997/03/12 21:09:15 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -37,14 +37,14 @@ Oid *oid8in(char *oidString) ...@@ -37,14 +37,14 @@ Oid *oid8in(char *oidString)
return(NULL); return(NULL);
result = (Oid (*)[]) palloc(sizeof(Oid [8])); result = (Oid (*)[]) palloc(sizeof(Oid [8]));
if ((nums = sscanf(oidString, "%d%d%d%d%d%d%d%d", if ((nums = sscanf(oidString, "%d%d%d%d%d%d%d%d",
*result, &(*result)[0],
*result + 1, &(*result)[1],
*result + 2, &(*result)[2],
*result + 3, &(*result)[3],
*result + 4, &(*result)[4],
*result + 5, &(*result)[5],
*result + 6, &(*result)[6],
*result + 7)) != 8) { &(*result)[7])) != 8) {
do do
(*result)[nums++] = 0; (*result)[nums++] = 0;
while (nums < 8); while (nums < 8);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.12 1997/02/14 04:17:57 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.13 1997/03/12 21:10:53 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -49,7 +49,8 @@ elog(int lev, const char *fmt, ... ) ...@@ -49,7 +49,8 @@ elog(int lev, const char *fmt, ... )
extern int errno, sys_nerr; extern int errno, sys_nerr;
#if !defined(BSD44_derived) && \ #if !defined(BSD44_derived) && \
!defined(bsdi) && \ !defined(bsdi) && \
!defined(bsdi_2_1) !defined(bsdi_2_1) && \
!defined(linuxalpha)
extern char *sys_errlist[]; extern char *sys_errlist[];
#endif /* bsd derived */ #endif /* bsd derived */
#ifndef PG_STANDALONE #ifndef PG_STANDALONE
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/error/Attic/exc.c,v 1.9 1996/12/27 13:13:58 vadim Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/error/Attic/exc.c,v 1.10 1997/03/12 21:10:56 scrappy Exp $
* *
* NOTE * NOTE
* XXX this code needs improvement--check for state violations and * XXX this code needs improvement--check for state violations and
...@@ -95,7 +95,8 @@ ExcPrint(Exception *excP, ...@@ -95,7 +95,8 @@ ExcPrint(Exception *excP,
extern int sys_nerr; extern int sys_nerr;
#if !defined(BSD44_derived) && \ #if !defined(BSD44_derived) && \
!defined(bsdi) && \ !defined(bsdi) && \
!defined(bsdi_2_1) !defined(bsdi_2_1) && \
!defined(linuxalpha)
extern char *sys_errlist[]; extern char *sys_errlist[];
#endif /* ! bsd_derived */ #endif /* ! bsd_derived */
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: pg_list.h,v 1.3 1996/11/04 07:18:19 scrappy Exp $ * $Id: pg_list.h,v 1.4 1997/03/12 21:11:23 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -44,7 +44,10 @@ typedef struct Value { ...@@ -44,7 +44,10 @@ typedef struct Value {
*/ */
typedef struct List { typedef struct List {
NodeTag type; NodeTag type;
void *elem; union {
void *ptr_value;
int int_value;
} elem;
struct List *next; struct List *next;
} List; } List;
...@@ -54,10 +57,15 @@ typedef struct List { ...@@ -54,10 +57,15 @@ typedef struct List {
* accessor macros * accessor macros
* ---------------- * ----------------
*/ */
#define lfirst(l) ((l)->elem)
/* anything that doesn't end in 'i' is assumed to be referring to the */
/* pointer version of the list (where it makes a difference) */
#define lfirst(l) ((l)->elem.ptr_value)
#define lnext(l) ((l)->next) #define lnext(l) ((l)->next)
#define lsecond(l) (lfirst(lnext(l))) #define lsecond(l) (lfirst(lnext(l)))
#define lfirsti(l) ((l)->elem.int_value)
/* /*
* foreach - * foreach -
* a convenience macro which loops through the list * a convenience macro which loops through the list
...@@ -85,13 +93,13 @@ extern void freeList(List *list); ...@@ -85,13 +93,13 @@ extern void freeList(List *list);
extern void *nth(int n, List *l); extern void *nth(int n, List *l);
extern void set_nth(List *l, int n, void *elem); extern void set_nth(List *l, int n, void *elem);
/* hack for now */ List *lconsi(int datum, List *list);
#define lconsi(i,l) lcons((void*)(int)i,l) List *lappendi(List *list, int datum);
#define lfirsti(l) ((int)lfirst(l))
#define lappendi(l,i) lappend(l,(void*)i)
extern bool intMember(int, List *); extern bool intMember(int, List *);
extern List *intAppend(List *list1, List *list2); extern List *intAppend(List *list1, List *list2);
extern int nthi(int n, List *l);
extern List *nreverse(List *); extern List *nreverse(List *);
extern List *set_difference(List *, List *); extern List *set_difference(List *, List *);
extern List *set_differencei(List *, List *); extern List *set_differencei(List *, List *);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: ipc.h,v 1.15 1997/03/03 23:34:27 scrappy Exp $ * $Id: ipc.h,v 1.16 1997/03/12 21:12:27 scrappy Exp $
* *
* NOTES * NOTES
* This file is very architecture-specific. This stuff should actually * This file is very architecture-specific. This stuff should actually
...@@ -32,7 +32,7 @@ extern void S_LOCK(slock_t *lock); ...@@ -32,7 +32,7 @@ extern void S_LOCK(slock_t *lock);
extern void S_UNLOCK(slock_t *lock); extern void S_UNLOCK(slock_t *lock);
extern void S_INIT_LOCK(slock_t *lock); extern void S_INIT_LOCK(slock_t *lock);
#if defined(alpha) || \ #if (defined(alpha) && !defined(linuxalpha)) || \
defined(hpux) || \ defined(hpux) || \
defined(irix5) || \ defined(irix5) || \
defined(nextstep) defined(nextstep)
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: memutils.h,v 1.5 1997/03/04 05:32:26 scrappy Exp $ * $Id: memutils.h,v 1.6 1997/03/12 21:13:19 scrappy Exp $
* *
* NOTES * NOTES
* some of the information in this file will be moved to * some of the information in this file will be moved to
...@@ -67,7 +67,12 @@ s...) ...@@ -67,7 +67,12 @@ s...)
*/ */
#if defined(sun) && ! defined(sparc) #if defined(sun) && ! defined(sparc)
#define LONGALIGN(LEN) SHORTALIGN(LEN) #define LONGALIGN(LEN) SHORTALIGN(LEN)
#elif defined (alpha) #elif defined (alpha) || defined(linuxalpha)
/* even though "long alignment" should really be on 8-byte boundaries
* for linuxalpha, we want the strictest alignment to be on 4-byte (int)
* boundaries, because otherwise things break when they try to use the
* FormData_pg_* structures. --djm 12/12/96
*/
#define LONGALIGN(LEN)\ #define LONGALIGN(LEN)\
(((long)(LEN) + (sizeof (int) - 1)) & ~(sizeof (int) -1)) (((long)(LEN) + (sizeof (int) - 1)) & ~(sizeof (int) -1))
#else #else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment