]> granicus.if.org Git - postgresql/commitdiff
From: Dan McGuirk <mcguirk@indirect.com>
authorMarc G. Fournier <scrappy@hub.org>
Wed, 12 Mar 1997 21:13:19 +0000 (21:13 +0000)
committerMarc G. Fournier <scrappy@hub.org>
Wed, 12 Mar 1997 21:13:19 +0000 (21:13 +0000)
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.

13 files changed:
src/backend/optimizer/plan/createplan.c
src/backend/optimizer/plan/initsplan.c
src/backend/optimizer/util/plancat.c
src/backend/storage/ipc/s_lock.c
src/backend/storage/page/bufpage.c
src/backend/tcop/fastpath.c
src/backend/utils/adt/float.c
src/backend/utils/adt/oid.c
src/backend/utils/error/elog.c
src/backend/utils/error/exc.c
src/include/nodes/pg_list.h
src/include/storage/ipc.h
src/include/utils/memutils.h

index 7d131d7371bbec39b84a963da5e240bc308e7a11..463cc2448e3ae1311cdb3c559d7ceca85f537be3 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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)
     if(temp == NULL)
        elog(WARN,"scanrelid is empty");
     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_clauses,
                             scan_relid,
@@ -640,10 +640,10 @@ fix_indxqual_references(Node *clause, Path *index_path)
              is_funcclause((Node*)get_leftop((Expr*)clause)) && 
              ((Func*)((Expr*)get_leftop((Expr*)clause))->oper)->funcisindex){
        Var *newvar =
-           makeVar((Index)lfirst(index_path->parent->relids),
+           makeVar((Index)lfirsti(index_path->parent->relids),
                    1, /* func indices have one key */
                    ((Func*)((Expr*)clause)->oper)->functype,
-                   (Index)lfirst(index_path->parent->relids),
+                   (Index)lfirsti(index_path->parent->relids),
                    0);
 
        return
index f7ec544eee2d4260c381dd11edc412273bd8e200..cec015bb01c0decf63917c172f32f894cf9b585a 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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)
        
        foreach (rel, join_relids)
        {
-           if ( (int)lfirst(rel) != (int)lfirst(join_relid) )
-               other_rels = lappendi (other_rels, lfirst(rel));
+           if ( lfirsti(rel) != lfirsti(join_relid) )
+               other_rels = lappendi (other_rels, lfirsti(rel));
        }
        
        joininfo = 
index 371b121a0f12306d988764544e67b15019f1e377..7a108578ed1953d0b0c8661f709f4b61644cb9f0 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * 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,
     
     i = 0;
     foreach(xopno, opnos) {
-       opno_array[i++] = (int)lfirst(xopno);
+       opno_array[i++] = lfirsti(xopno);
     }
 
     i = 0;
     foreach(xattno,attnos) {
-       attno_array[i++] = (int)lfirst(xattno);
+       attno_array[i++] = lfirsti(xattno);
     }
 
     i = 0;
@@ -282,7 +282,7 @@ index_selectivity(Oid indid,
 
     i = 0;
     foreach(flag,flags) {
-       flag_array[i++] = (int)lfirst(flag);
+       flag_array[i++] = lfirsti(flag);
     }
     
     IndexSelectivity(indid,
index 079aaaf39f863e549eb69a640ac21d1c243db119..539a7f9af44a4c49f44881b9d58a0118ed93bc10 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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)
  * (see storage/ipc.h).
  */
 
-#if defined(alpha)
+#if defined(alpha) && !defined(linuxalpha)
 
 void
 S_LOCK(slock_t *lock)
@@ -409,4 +409,48 @@ S_INIT_LOCK(slock_t *lock)
 #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 */
index 703d960662564c0c26c2baed704a307962a35a59..bf150a27b908d9c8918892c14a6b80d733ce3907 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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,
                                       Size size)
 {
     int i;
+    unsigned offset;
     
     /* location is an index into the page... */
-    location -= (int) phdr;
+    offset = (unsigned)(location - (char *)phdr);
     
     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;
        }
     }
index 611adb3a19f1cb14b371bed4fd388e831acd2d49..20951fa4cb057208e574693824bbc4f2fd026bfb 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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
  *    This cruft is the server side of PQfn.
@@ -93,7 +93,7 @@ SendFunctionResult(Oid fid,   /* function id */
        pq_putnchar("G", 1);
        if (retbyval) {         /* by-value */
            pq_putint(retlen, 4);
-           pq_putint((int)retval, retlen); 
+           pq_putint((int)(Datum)retval, retlen); 
        } else {                /* by-reference ... */
            if (retlen < 0) {           /* ... varlena */
                pq_putint(VARSIZE(retval) - VARHDRSZ, 4);
index 52fc5f98e3a2985e2649ddd31b2d136a8b7fe28a..509ce6ce6d48d884d0d6fc7a74dbb70cf50f2e58 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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);
 #define FLOAT8_MAX       DBL_MAX
 #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
    the FLOAT4_MIN, FLOAT4_MAX bounds.
index 7f5a05e5bea2799c182c4537c8ec6e5c1d96e7cc..2ee6cb654538ed063d7790385dbca4de656c8d7f 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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)
        return(NULL);
     result = (Oid (*)[]) palloc(sizeof(Oid [8]));
     if ((nums = sscanf(oidString, "%d%d%d%d%d%d%d%d",
-                      *result,
-                      *result + 1,
-                      *result + 2,
-                      *result + 3,
-                      *result + 4,
-                      *result + 5,
-                      *result + 6,
-                      *result + 7)) != 8) {
+                      &(*result)[0],
+                      &(*result)[1],
+                      &(*result)[2],
+                      &(*result)[3],
+                      &(*result)[4],
+                      &(*result)[5],
+                      &(*result)[6],
+                      &(*result)[7])) != 8) {
        do
            (*result)[nums++] = 0;
        while (nums < 8);
index 992fd7cb0ff6918cd869c425ee55087d9929bcb7..77477ab222f73d09ff0fd6759fafd5c17a1b93de 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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, ... )
     extern     int     errno, sys_nerr;
 #if !defined(BSD44_derived) && \
     !defined(bsdi) && \
-    !defined(bsdi_2_1)
+    !defined(bsdi_2_1) && \
+    !defined(linuxalpha)
     extern     char    *sys_errlist[];
 #endif /* bsd derived */
 #ifndef PG_STANDALONE
index 1caa5bca93f3fbeeedefb5bef79ddfe77690c006..9eae4ad109c866ec6f182495f3353e85106a47a6 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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
  *    XXX this code needs improvement--check for state violations and
@@ -95,7 +95,8 @@ ExcPrint(Exception *excP,
     extern     int     sys_nerr;
 #if !defined(BSD44_derived) && \
     !defined(bsdi) && \
-    !defined(bsdi_2_1)
+    !defined(bsdi_2_1) && \
+    !defined(linuxalpha)
     extern     char    *sys_errlist[];
 #endif /* ! bsd_derived */
     
index d3bf7c0de96a058735f613a710085d5966fa48a1..b67b31bb1942b18546ba34f90660b475ba5b8467 100644 (file)
@@ -6,7 +6,7 @@
  *
  * 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 {
  */
 typedef        struct List {
     NodeTag            type;
-    void               *elem;
+    union {
+      void *ptr_value;
+      int   int_value;
+    } elem;
     struct List                *next;
 } List;
 
@@ -54,10 +57,15 @@ typedef     struct List {
  *     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 lsecond(l)                             (lfirst(lnext(l)))
 
+#define lfirsti(l)                              ((l)->elem.int_value)
+
 /*
  * foreach -
  *    a convenience macro which loops through the list
@@ -85,13 +93,13 @@ extern void freeList(List *list);
 extern void *nth(int n, List *l);
 extern void set_nth(List *l, int n, void *elem);
                    
-/* hack for now */
-#define        lconsi(i,l)     lcons((void*)(int)i,l)
-#define lfirsti(l)     ((int)lfirst(l))
-#define        lappendi(l,i)   lappend(l,(void*)i)
+List *lconsi(int datum, List *list);
+List *lappendi(List *list, int datum);
 extern bool intMember(int, List *);
 extern List *intAppend(List *list1, List *list2);
 
+extern int nthi(int n, List *l);
+
 extern List *nreverse(List *);
 extern List *set_difference(List *, List *);
 extern List *set_differencei(List *, List *);
index 7cc11e0bafab58f65aaa0458da6c3d203511c24c..d0f17b922763fc5f1bf54e9c2b8032d00acc50b2 100644 (file)
@@ -6,7 +6,7 @@
  *
  * 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
  *    This file is very architecture-specific.  This stuff should actually
@@ -32,7 +32,7 @@ extern void S_LOCK(slock_t *lock);
 extern void S_UNLOCK(slock_t *lock);
 extern void S_INIT_LOCK(slock_t *lock);
 
-#if defined(alpha) || \
+#if (defined(alpha) && !defined(linuxalpha)) || \
     defined(hpux) || \
     defined(irix5) || \
     defined(nextstep)
index a6dad68b222283ccf69756fd14d4aa19cb6e1629..b6f013cdbe147791865b154cb95e4aa6233290b1 100644 (file)
@@ -15,7 +15,7 @@
  *
  * 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
  *    some of the information in this file will be moved to
@@ -67,7 +67,12 @@ s...)
  */
 #if defined(sun) && ! defined(sparc)
 #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)\
        (((long)(LEN) + (sizeof (int) - 1)) & ~(sizeof (int) -1))
 #else