Note: This website is archived. For up-to-date information about D projects and development, please visit wiki.dlang.org.

Changeset 582

Show
Ignore:
Timestamp:
07/23/10 22:58:11 (14 years ago)
Author:
walter
Message:

bring up to date

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/dmd-1.x/src/backend/cod3.c

    r581 r582  
    29312931#endif 
    29322932 
    29332933  if (b) 
    29342934  {     bn = b->Bnext; 
    29352935        usespace = (config.flags4 & CFG4space && b->BC != BCasm); 
    29362936        useopsize = (I16 || (config.flags4 & CFG4space && b->BC != BCasm)); 
    29372937  } 
    29382938  else 
    29392939  {     bn = NULL; 
    29402940        usespace = (config.flags4 & CFG4space); 
    29412941        useopsize = (I16 || config.flags4 & CFG4space); 
    29422942  } 
    29432943  for (; c; c = code_next(c)) 
    29442944  { 
    29452945    L1: 
    29462946        op = c->Iop; 
    29472947        if (op == 0x0F) 
    29482948            ins = inssize2[c->Iop2]; 
    29492949        else 
    29502950            ins = inssize[c->Iop]; 
    2951         if (ins & M)            // if modregrm byte 
     2951        if (I32 && ins & M)            // if modregrm byte 
    29522952        {   int shortop = (c->Iflags & CFopsize) ? !I16 : I16; 
    29532953            int local_BPRM = BPRM; 
    29542954 
    29552955            if (c->Iflags & CFaddrsize) 
    29562956                local_BPRM ^= 5 ^ 6;    // toggle between 5 and 6 
    29572957 
    29582958            unsigned rm = c->Irm; 
    29592959            unsigned reg = rm & modregrm(0,7,0);          // isolate reg field 
    29602960            unsigned ereg = rm & 7; 
    29612961            //printf("c = %p, op = %02x rm = %02x\n", c, op, rm); 
    29622962 
    29632963            /* If immediate second operand      */ 
    29642964            if ((ins & T || op == 0xF6 || op == 0xF7) && 
    29652965                c->IFL2 == FLconst) 
    29662966            { 
    29672967                int flags = c->Iflags & CFpsw;      /* if want result in flags */ 
    29682968                targ_long u = c->IEV2.Vuns; 
    29692969                if (ins & E) 
    29702970                    u = (signed char) u; 
    29712971                else if (shortop) 
  • branches/dmd-1.x/src/backend/elfobj.c

    r581 r582  
    22302230            relsec->sh_link = SHI_SYMTAB; 
    22312231            relsec->sh_info = secidx; 
    22322232            relsec->sh_entsize = sizeof(Elf64_Rela); 
    22332233            relsec->sh_addralign = 8; 
    22342234        } 
    22352235        else 
    22362236        { 
    22372237            Elf32_Shdr *relsec = &SecHdrTab[relidx]; 
    22382238            relsec->sh_link = SHI_SYMTAB; 
    22392239            relsec->sh_info = secidx; 
    22402240            relsec->sh_entsize = sizeof(Elf32_Rel); 
    22412241            relsec->sh_addralign = 4; 
    22422242        } 
    22432243    } 
    22442244 
    22452245    if (I64) 
    22462246    { 
    22472247        Elf64_Rela rel; 
    22482248        rel.r_offset = offset;          // build relocation information 
    22492249        rel.r_info = ELF64_R_INFO(symidx,type); 
    2250         rel.r_addend = 0
     2250        rel.r_addend = val
    22512251        buf = segdata->SDrel; 
    22522252        buf->write(&rel,sizeof(rel)); 
    22532253        segdata->SDrelcnt++; 
    22542254 
    22552255        if (offset >= segdata->SDrelmaxoff) 
    22562256            segdata->SDrelmaxoff = offset; 
    22572257        else 
    22582258        {   // insert numerically 
    22592259            Elf64_Rela *relbuf = (Elf64_Rela *)buf->buf; 
    22602260            int i = relbuf[segdata->SDrelindex].r_offset > offset ? 0 : segdata->SDrelindex; 
    22612261            while (i < segdata->SDrelcnt) 
    22622262            { 
    22632263                if (relbuf[i].r_offset > offset) 
    22642264                    break; 
    22652265                i++; 
    22662266            } 
    22672267            assert(i != segdata->SDrelcnt);     // slide greater offsets down 
    22682268            memmove(relbuf+i+1,relbuf+i,sizeof(Elf64_Rela) * (segdata->SDrelcnt - i - 1)); 
    22692269            *(relbuf+i) = rel;          // copy to correct location 
    22702270            segdata->SDrelindex = i;    // next entry usually greater 
     
    25042504                return retsize; 
    25052505            } 
    25062506            else 
    25072507            { 
    25082508                int save; 
    25092509                buf = SegData[seg]->SDbuf; 
    25102510                save = buf->size(); 
    25112511                buf->setsize(offset); 
    25122512                if (flags & CFselfrel) 
    25132513                {               // only for function references within code segments 
    25142514                    if (!external &&            // local definition found 
    25152515                         s->Sseg == seg &&      // within same code segment 
    25162516                          (!(config.flags3 & CFG3pic) ||        // not position indp code 
    25172517                           s->Sclass == SCstatic)) // or is pic, but declared static 
    25182518                    {                   // Can use PC relative 
    25192519                        //dbg_printf("\tdoing PC relative\n"); 
    25202520                        val = (s->Soffset+val) - (offset+4); 
    25212521                    } 
    25222522                    else 
    25232523                    { 
    2524                         val = (targ_size_t)-4; 
    25252524                        //dbg_printf("\tadding relocation\n"); 
    25262525                        if (I64) 
    2527                             relinfo = config.flags3 & CFG3pic ?  R_X86_64_PLT32 : R_X86_64_PC32; 
     2526                        {   relinfo = config.flags3 & CFG3pic ?  R_X86_64_PLT32 : R_X86_64_PC32; 
     2527                            elf_addrel(seg,offset, relinfo, s->Sxtrnnum, -4); 
     2528                            val = 0; 
     2529                        } 
    25282530                        else 
    2529                            relinfo = config.flags3 & CFG3pic ?  RI_TYPE_PLT32 : RI_TYPE_PC32; 
    2530                         elf_addrel(seg,offset, 
    2531                                 relinfo, 
    2532                                 s->Sxtrnnum,0); 
     2531                        {   relinfo = config.flags3 & CFG3pic ?  RI_TYPE_PLT32 : RI_TYPE_PC32; 
     2532                            elf_addrel(seg,offset, relinfo, s->Sxtrnnum, 0); 
     2533                            val = (targ_size_t)-4; 
     2534                        } 
    25332535                    } 
    2534                     if (I64) 
    2535                         val += 4; 
    25362536                } 
    25372537                else 
    25382538                {       // code to code code to data, data to code, data to data refs 
    25392539                    refseg = s->Sxtrnnum;       // default to name symbol table entry 
    25402540                    if (s->Sclass == SCstatic) 
    25412541                    {                           // offset into .data or .bss seg 
    25422542                        refseg = MAP_SEG2SYMIDX(s->Sseg); 
    25432543                                                // use segment symbol table entry 
    25442544                        val += s->Soffset; 
    25452545                        if (!(config.flags3 & CFG3pic) ||       // all static refs from normal code 
    25462546                             segtyp == DATA)    // or refs from data from posi indp 
    25472547                        { 
    25482548                           relinfo = I64 ? R_X86_64_32 : RI_TYPE_SYM32; 
    25492549                        } 
    25502550                        else 
    25512551                        { 
    25522552                            relinfo = I64 ? R_X86_64_PC32 : RI_TYPE_GOTOFF; 
    25532553                        } 
    25542554                    } 
    25552555                    else if (config.flags3 & CFG3pic && s == GOTsym) 
  • branches/dmd-1.x/src/backend/global.h

    r552 r582  
    534534#if MACHOBJ 
    535535int mach_getsegment(const char *sectname, const char *segname, 
    536536        int align, int flags, int flags2 = 0); 
    537537void mach_addrel(int seg, targ_size_t offset, symbol *targsym, 
    538538        unsigned targseg, int rtype); 
    539539#endif 
    540540void elf_func_start(Symbol *sfunc); 
    541541int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg); 
    542542void elf_func_term(Symbol *sfunc); 
    543543unsigned elf_addstr(Outbuffer *strtab, const char *); 
    544544 
    545545void dwarf_CFA_set_loc(size_t location); 
    546546void dwarf_CFA_set_reg_offset(int reg, int offset); 
    547547void dwarf_CFA_offset(int reg, int offset); 
    548548void dwarf_CFA_args_size(size_t sz); 
    549549#endif 
    550550 
    551551#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 
    552552void elfobj_gotref(symbol *s); 
    553553symbol *elfobj_getGOTsym(); 
     554void elfobj_refGOTsym(); 
    554555elem * exp_isconst(); 
    555556elem *lnx_builtin_next_arg(elem *efunc,list_t arglist); 
    556557char *lnx_redirect_funcname(const char *); 
    557558void  lnx_funcdecl(symbol *,enum SC,enum_SC,int); 
    558559int  lnx_attributes(int hinttype,const void *hint, type **ptyp, tym_t *ptym,int *pattrtype); 
    559560#endif 
    560561 
    561562 
    562563#if TARGET_MAC 
    563564#include "TGglobal.h" 
    564565#endif 
    565566 
    566567#endif /* GLOBAL_H */ 
  • trunk/src/backend/cod3.c

    r581 r582  
    29312931#endif 
    29322932 
    29332933  if (b) 
    29342934  {     bn = b->Bnext; 
    29352935        usespace = (config.flags4 & CFG4space && b->BC != BCasm); 
    29362936        useopsize = (I16 || (config.flags4 & CFG4space && b->BC != BCasm)); 
    29372937  } 
    29382938  else 
    29392939  {     bn = NULL; 
    29402940        usespace = (config.flags4 & CFG4space); 
    29412941        useopsize = (I16 || config.flags4 & CFG4space); 
    29422942  } 
    29432943  for (; c; c = code_next(c)) 
    29442944  { 
    29452945    L1: 
    29462946        op = c->Iop; 
    29472947        if (op == 0x0F) 
    29482948            ins = inssize2[c->Iop2]; 
    29492949        else 
    29502950            ins = inssize[c->Iop]; 
    2951         if (ins & M)            // if modregrm byte 
     2951        if (I32 && ins & M)            // if modregrm byte 
    29522952        {   int shortop = (c->Iflags & CFopsize) ? !I16 : I16; 
    29532953            int local_BPRM = BPRM; 
    29542954 
    29552955            if (c->Iflags & CFaddrsize) 
    29562956                local_BPRM ^= 5 ^ 6;    // toggle between 5 and 6 
    29572957 
    29582958            unsigned rm = c->Irm; 
    29592959            unsigned reg = rm & modregrm(0,7,0);          // isolate reg field 
    29602960            unsigned ereg = rm & 7; 
    29612961            //printf("c = %p, op = %02x rm = %02x\n", c, op, rm); 
    29622962 
    29632963            /* If immediate second operand      */ 
    29642964            if ((ins & T || op == 0xF6 || op == 0xF7) && 
    29652965                c->IFL2 == FLconst) 
    29662966            { 
    29672967                int flags = c->Iflags & CFpsw;      /* if want result in flags */ 
    29682968                targ_long u = c->IEV2.Vuns; 
    29692969                if (ins & E) 
    29702970                    u = (signed char) u; 
    29712971                else if (shortop) 
  • trunk/src/backend/elfobj.c

    r581 r582  
    22302230            relsec->sh_link = SHI_SYMTAB; 
    22312231            relsec->sh_info = secidx; 
    22322232            relsec->sh_entsize = sizeof(Elf64_Rela); 
    22332233            relsec->sh_addralign = 8; 
    22342234        } 
    22352235        else 
    22362236        { 
    22372237            Elf32_Shdr *relsec = &SecHdrTab[relidx]; 
    22382238            relsec->sh_link = SHI_SYMTAB; 
    22392239            relsec->sh_info = secidx; 
    22402240            relsec->sh_entsize = sizeof(Elf32_Rel); 
    22412241            relsec->sh_addralign = 4; 
    22422242        } 
    22432243    } 
    22442244 
    22452245    if (I64) 
    22462246    { 
    22472247        Elf64_Rela rel; 
    22482248        rel.r_offset = offset;          // build relocation information 
    22492249        rel.r_info = ELF64_R_INFO(symidx,type); 
    2250         rel.r_addend = 0
     2250        rel.r_addend = val
    22512251        buf = segdata->SDrel; 
    22522252        buf->write(&rel,sizeof(rel)); 
    22532253        segdata->SDrelcnt++; 
    22542254 
    22552255        if (offset >= segdata->SDrelmaxoff) 
    22562256            segdata->SDrelmaxoff = offset; 
    22572257        else 
    22582258        {   // insert numerically 
    22592259            Elf64_Rela *relbuf = (Elf64_Rela *)buf->buf; 
    22602260            int i = relbuf[segdata->SDrelindex].r_offset > offset ? 0 : segdata->SDrelindex; 
    22612261            while (i < segdata->SDrelcnt) 
    22622262            { 
    22632263                if (relbuf[i].r_offset > offset) 
    22642264                    break; 
    22652265                i++; 
    22662266            } 
    22672267            assert(i != segdata->SDrelcnt);     // slide greater offsets down 
    22682268            memmove(relbuf+i+1,relbuf+i,sizeof(Elf64_Rela) * (segdata->SDrelcnt - i - 1)); 
    22692269            *(relbuf+i) = rel;          // copy to correct location 
    22702270            segdata->SDrelindex = i;    // next entry usually greater 
     
    25042504                return retsize; 
    25052505            } 
    25062506            else 
    25072507            { 
    25082508                int save; 
    25092509                buf = SegData[seg]->SDbuf; 
    25102510                save = buf->size(); 
    25112511                buf->setsize(offset); 
    25122512                if (flags & CFselfrel) 
    25132513                {               // only for function references within code segments 
    25142514                    if (!external &&            // local definition found 
    25152515                         s->Sseg == seg &&      // within same code segment 
    25162516                          (!(config.flags3 & CFG3pic) ||        // not position indp code 
    25172517                           s->Sclass == SCstatic)) // or is pic, but declared static 
    25182518                    {                   // Can use PC relative 
    25192519                        //dbg_printf("\tdoing PC relative\n"); 
    25202520                        val = (s->Soffset+val) - (offset+4); 
    25212521                    } 
    25222522                    else 
    25232523                    { 
    2524                         val = (targ_size_t)-4; 
    25252524                        //dbg_printf("\tadding relocation\n"); 
    25262525                        if (I64) 
    2527                             relinfo = config.flags3 & CFG3pic ?  R_X86_64_PLT32 : R_X86_64_PC32; 
     2526                        {   relinfo = config.flags3 & CFG3pic ?  R_X86_64_PLT32 : R_X86_64_PC32; 
     2527                            elf_addrel(seg,offset, relinfo, s->Sxtrnnum, -4); 
     2528                            val = 0; 
     2529                        } 
    25282530                        else 
    2529                            relinfo = config.flags3 & CFG3pic ?  RI_TYPE_PLT32 : RI_TYPE_PC32; 
    2530                         elf_addrel(seg,offset, 
    2531                                 relinfo, 
    2532                                 s->Sxtrnnum,0); 
     2531                        {   relinfo = config.flags3 & CFG3pic ?  RI_TYPE_PLT32 : RI_TYPE_PC32; 
     2532                            elf_addrel(seg,offset, relinfo, s->Sxtrnnum, 0); 
     2533                            val = (targ_size_t)-4; 
     2534                        } 
    25332535                    } 
    2534                     if (I64) 
    2535                         val += 4; 
    25362536                } 
    25372537                else 
    25382538                {       // code to code code to data, data to code, data to data refs 
    25392539                    refseg = s->Sxtrnnum;       // default to name symbol table entry 
    25402540                    if (s->Sclass == SCstatic) 
    25412541                    {                           // offset into .data or .bss seg 
    25422542                        refseg = MAP_SEG2SYMIDX(s->Sseg); 
    25432543                                                // use segment symbol table entry 
    25442544                        val += s->Soffset; 
    25452545                        if (!(config.flags3 & CFG3pic) ||       // all static refs from normal code 
    25462546                             segtyp == DATA)    // or refs from data from posi indp 
    25472547                        { 
    25482548                           relinfo = I64 ? R_X86_64_32 : RI_TYPE_SYM32; 
    25492549                        } 
    25502550                        else 
    25512551                        { 
    25522552                            relinfo = I64 ? R_X86_64_PC32 : RI_TYPE_GOTOFF; 
    25532553                        } 
    25542554                    } 
    25552555                    else if (config.flags3 & CFG3pic && s == GOTsym) 
  • trunk/src/backend/global.h

    r552 r582  
    534534#if MACHOBJ 
    535535int mach_getsegment(const char *sectname, const char *segname, 
    536536        int align, int flags, int flags2 = 0); 
    537537void mach_addrel(int seg, targ_size_t offset, symbol *targsym, 
    538538        unsigned targseg, int rtype); 
    539539#endif 
    540540void elf_func_start(Symbol *sfunc); 
    541541int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg); 
    542542void elf_func_term(Symbol *sfunc); 
    543543unsigned elf_addstr(Outbuffer *strtab, const char *); 
    544544 
    545545void dwarf_CFA_set_loc(size_t location); 
    546546void dwarf_CFA_set_reg_offset(int reg, int offset); 
    547547void dwarf_CFA_offset(int reg, int offset); 
    548548void dwarf_CFA_args_size(size_t sz); 
    549549#endif 
    550550 
    551551#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 
    552552void elfobj_gotref(symbol *s); 
    553553symbol *elfobj_getGOTsym(); 
     554void elfobj_refGOTsym(); 
    554555elem * exp_isconst(); 
    555556elem *lnx_builtin_next_arg(elem *efunc,list_t arglist); 
    556557char *lnx_redirect_funcname(const char *); 
    557558void  lnx_funcdecl(symbol *,enum SC,enum_SC,int); 
    558559int  lnx_attributes(int hinttype,const void *hint, type **ptyp, tym_t *ptym,int *pattrtype); 
    559560#endif 
    560561 
    561562 
    562563#if TARGET_MAC 
    563564#include "TGglobal.h" 
    564565#endif 
    565566 
    566567#endif /* GLOBAL_H */