From owner-p4-projects Sat Mar 1 2:27: 6 2003 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 403E037B405; Sat, 1 Mar 2003 02:26:58 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id CBDF437B401 for ; Sat, 1 Mar 2003 02:26:57 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 4F50943F93 for ; Sat, 1 Mar 2003 02:26:57 -0800 (PST) (envelope-from tzukanov@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.6/8.12.6) with ESMTP id h21AQv0U086825 for ; Sat, 1 Mar 2003 02:26:57 -0800 (PST) (envelope-from tzukanov@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id h21AQuwc086822 for perforce@freebsd.org; Sat, 1 Mar 2003 02:26:56 -0800 (PST) Date: Sat, 1 Mar 2003 02:26:56 -0800 (PST) Message-Id: <200303011026.h21AQuwc086822@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to tzukanov@freebsd.org using -f From: Serguei Tzukanov Subject: PERFORCE change 26123 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG http://perforce.freebsd.org/chv.cgi?CH=26123 Change 26123 by tzukanov@tzukanov_antares on 2003/03/01 02:26:49 GCC & rtld update. Affected files ... .. //depot/projects/s390/contrib/gcc/config/s390/s390.md#2 edit .. //depot/projects/s390/libexec/rtld-elf/s390/reloc.c#3 edit Differences ... ==== //depot/projects/s390/contrib/gcc/config/s390/s390.md#2 (text+ko) ==== @@ -957,7 +957,7 @@ ldr\\t%0,%1 ld\\t%0,%1 std\\t%1,%0" - [(set_attr "op_type" "RR,RXE,RXE,RR,RX,RX") + [(set_attr "op_type" "RRE,RXE,RXE,RR,RX,RX") (set_attr "atype" "reg,mem,mem,reg,mem,mem")]) (define_insn "*movdi_31" @@ -1240,7 +1240,7 @@ lgr\\t%0,%1 lg\\t%0,%1 stg\\t%1,%0" - [(set_attr "op_type" "RR,RX,RX,RR,RXE,RXE") + [(set_attr "op_type" "RR,RX,RX,RRE,RXE,RXE") (set_attr "atype" "reg,mem,mem,reg,mem,mem")]) (define_insn "*movdf_31" @@ -2111,15 +2111,12 @@ reg1 = gen_reg_rtx (DImode); } - if (! CONSTANT_P (len)) - len = force_reg (Pmode, len); - /* Load up the address+length pairs. */ emit_move_insn (gen_highpart (Pmode, reg0), addr0); - emit_move_insn (gen_lowpart (Pmode, reg0), len); + convert_move (gen_lowpart (Pmode, reg0), len, 1); emit_move_insn (gen_highpart (Pmode, reg1), addr1); - emit_move_insn (gen_lowpart (Pmode, reg1), len); + convert_move (gen_lowpart (Pmode, reg1), len, 1); /* Compare! */ if (TARGET_64BIT) @@ -3226,6 +3223,19 @@ [(set_attr "op_type" "RR,RI,RX") (set_attr "atype" "reg,reg,mem")]) +(define_insn "*addsi3_inv" + [(set (match_operand:SI 0 "register_operand" "=d,d,d") + (plus:SI (match_operand:SI 1 "general_operand" "%d,K,m") + (match_operand:SI 2 "register_operand" "0,0,0"))) + (clobber (reg:CC 33))] + "" + "@ + ar\\t%0,%1 + ahi\\t%0,%h1 + a\\t%0,%1" + [(set_attr "op_type" "RR,RI,RX") + (set_attr "atype" "reg,reg,mem")]) + (define_insn "*la_31" [(set (match_operand:SI 0 "register_operand" "=d") (match_operand:QI 1 "address_operand" "p"))] @@ -5462,7 +5472,7 @@ "@ srlg\\t%0,%1,%c2 srlg\\t%0,%1,0(%2)" - [(set_attr "op_type" "RS,RS")]) + [(set_attr "op_type" "RSE,RSE")]) ; ; lshrsi3 instruction pattern(s). ==== //depot/projects/s390/libexec/rtld-elf/s390/reloc.c#3 (text+ko) ==== @@ -43,17 +43,17 @@ #include "debug.h" #include "rtld.h" -#define _SHIFT1 (1 << 7) - +#define _ILL 0 #define _B8 1 #define _L12 2 #define _H16 3 -#define _PC16 (_H16 | _SHIFT1) -#define _W32 4 -#define _PC32 (_W32 | _SHIFT1) -#define _Q64 5 +#define _PC16 5 +#define _W32 6 #ifdef __s390x__ +#define _PC32 7 +#define _Q64 8 + #define _AD _Q64 #else #define _AD _W32 @@ -61,44 +61,43 @@ #define _B 1 #define _G 2 -#define _L 3 -#define _O 4 -#define _P 5 -#define _S 6 - -#define _ILL 0 +#define _L 4 +#define _O 8 +#define _P 16 +#define _S 32 static struct _reldesc { - uint8_t op[4]; + uint8_t field; + uint8_t action; } reldesc[] = { - {{ _ILL }}, /* R_390_NONE */ - {{ _B8, _S, }}, /* R_390_8 */ - {{ _L12, _S, }}, /* R_390_12 */ - {{ _H16, _S, }}, /* R_390_16 */ - {{ _W32, _S, }}, /* R_390_32 */ - {{ _W32, _S, _P }}, /* R_390_PC32 */ - {{ _L12, _O, }}, /* R_390_GOT12 */ - {{ _W32, _O, }}, /* R_390_GOT32 */ - {{ _W32, _L, }}, /* R_390_PLT32 */ - {{ _ILL }}, /* R_390_COPY */ - {{ _AD, _S }}, /* R_390_GLOB_DAT */ - {{ _ILL }}, /* R_390_JMP_SLOT */ - {{ _AD, _B }}, /* R_390_RELATIVE */ - {{ _AD, _S, _G }}, /* R_390_GOTOFF */ - {{ _AD, _G, _P }}, /* R_390_GOTPC */ - {{ _H16, _O }}, /* R_390_GOT16 */ - {{ _H16, _S, _P }}, /* R_390_PC16 */ - {{ _PC16, _S, _P }}, /* R_390_PC16DBL */ - {{ _PC16, _L, _P }}, /* R_390_PLT16DBL */ + { _ILL }, /* R_390_NONE */ + { _B8, _S, }, /* R_390_8 */ + { _L12, _S, }, /* R_390_12 */ + { _H16, _S, }, /* R_390_16 */ + { _W32, _S, }, /* R_390_32 */ + { _W32, _S | _P }, /* R_390_PC32 */ + { _L12, _O }, /* R_390_GOT12 */ + { _W32, _O, }, /* R_390_GOT32 */ + { _W32, _L, }, /* R_390_PLT32 */ + { _ILL }, /* R_390_COPY */ + { _AD, _S }, /* R_390_GLOB_DAT */ + { _ILL }, /* R_390_JMP_SLOT */ + { _AD, _B }, /* R_390_RELATIVE */ + { _AD, _S | _G }, /* R_390_GOTOFF */ + { _AD, _G | _P }, /* R_390_GOTPC */ + { _H16, _O }, /* R_390_GOT16 */ + { _H16, _S | _P }, /* R_390_PC16 */ + { _PC16, _S | _P }, /* R_390_PC16DBL */ + { _PC16, _L | _P }, /* R_390_PLT16DBL */ #ifdef __s390x__ - {{ _PC32, _S, _P }}, /* R_390_PC32DBL */ - {{ _PC32, _L, _P }}, /* R_390_PLT32DBL */ - {{ _PC32, _G, _P }}, /* R_390_GOTPCDBL */ - {{ _Q64, _S }}, /* R_390_64 */ - {{ _Q64, _S, _P }}, /* R_390_PC64 */ - {{ _Q64, _O }}, /* R_390_GOT64 */ - {{ _Q64, _L }}, /* R_390_PLT64 */ - {{ _PC32, _G, _O, _P }}, /* R_390_GOTENT */ + { _PC32, _S | _P }, /* R_390_PC32DBL */ + { _PC32, _L | _P }, /* R_390_PLT32DBL */ + { _PC32, _G | _P }, /* R_390_GOTPCDBL */ + { _Q64, _S }, /* R_390_64 */ + { _Q64, _S | _P }, /* R_390_PC64 */ + { _Q64, _O }, /* R_390_GOT64 */ + { _Q64, _L }, /* R_390_PLT64 */ + { _PC32, _G | _O | _P }, /* R_390_GOTENT */ #endif }; @@ -173,59 +172,46 @@ Elf_Addr *where, value; struct _reldesc desc; const Elf_Sym *def; - int type, field, i; + int type; type = ELF_R_TYPE(rela->r_info); desc = reldesc[type]; - field = desc.op[0]; - if (field == _ILL) { + if (desc.field == _ILL) return 0; - } where = (Elf_Addr *)(obj->relocbase + rela->r_offset); - value = rela->r_addend; - for (i = 1; desc.op[i] && (i < 4); i++) { - switch (desc.op[i]) { - case _B: - value += (Elf_Addr)obj->relocbase; - break; - case _G: - dbg("_G\n"); - break; - case _L: - dbg("_L\n"); - break; - case _O: - dbg("_O\n"); - break; - case _P: - value -= (Elf_Addr)where; - break; - case _S: - defobj = NULL; - def = find_symdef(ELF_R_SYM(rela->r_info), - obj, &defobj, false, cache); - if (def == NULL) - return -1; - value += (Elf_Addr)(defobj->relocbase + def->st_value); - break; - } + if (type == R_390_RELATIVE) { + *where = (Elf_Addr)(obj->relocbase + value); + return 0; } - if (field & _SHIFT1) { - /* We need shifting with sign copying. */ - value = ((long)value) >> 1; - field &= ~_SHIFT1; + if (desc.action & _B) + value += (Elf_Addr)obj->relocbase; + + if (desc.action & _S) { + defobj = NULL; + def = find_symdef(ELF_R_SYM(rela->r_info), + obj, &defobj, false, cache); + if (def == NULL) + return -1; + + value += (Elf_Addr)(defobj->relocbase + def->st_value); } - switch (field) { + if (desc.action & _P) + value -= (Elf_Addr)where; + + switch (desc.field) { case _B8: *(uint8_t *)where = (uint8_t)value; break; case _L12: - *(uint16_t *)where += value << 4; + *(uint16_t *)where |= value << 4; + break; + case _PC16: + *(int16_t *)where = ((int16_t)value) >> 1; break; case _H16: *(int16_t *)where = (int16_t)value; @@ -234,8 +220,12 @@ *(int32_t *)where = (int32_t)value; break; #ifdef __s390x__ + case _PC32: + *(int32_t *)where = ((int32_t)value) >> 1; + break; case _Q64: *where = value; + break; #endif } @@ -279,8 +269,7 @@ int reloc_plt(Obj_Entry *obj) { - const Elf_Rela *relalim; - const Elf_Rela *rela; + const Elf_Rela *rela, *relalim; Elf_Addr *where; relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize); To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message