Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 14 additions & 16 deletions src/ddmd/backend/cod1.c
Original file line number Diff line number Diff line change
Expand Up @@ -2531,19 +2531,6 @@ void callclib(CodeBuilder& cdb,elem *e,unsigned clib,regm_t *pretregs,regm_t kee
}
else
{
code *cgot = NULL;
if (config.exe & (EX_LINUX | EX_FREEBSD | EX_OPENBSD | EX_SOLARIS))
{
// Note: not for OSX
/* Pass EBX on the stack instead, this is because EBX is used
* for shared library function calls
*/
if (config.flags3 & CFG3pic)
{
cgot = load_localgot(); // EBX gets set to this value
}
}

makeitextern(s);
int nalign = 0;
int pushebx = (cinfo->flags & INFpushebx) != 0;
Expand Down Expand Up @@ -2571,7 +2558,18 @@ void callclib(CodeBuilder& cdb,elem *e,unsigned clib,regm_t *pretregs,regm_t kee
nalign += REGSIZE;
}
}
cdb.append(cgot); // EBX = localgot
if (config.exe & (EX_LINUX | EX_FREEBSD | EX_OPENBSD | EX_SOLARIS))
{
// Note: not for OSX
/* Pass EBX on the stack instead, this is because EBX is used
* for shared library function calls
*/
if (config.flags3 & CFG3pic)
{
load_localgot(cdb); // EBX gets set to this value
}
}

cdb.append(gencs(CNIL,LARGECODE ? 0x9A : 0xE8,0,FLfunc,s)); // CALL s
if (nalign)
cod3_stackadj(cdb, -nalign);
Expand Down Expand Up @@ -3380,7 +3378,7 @@ static void funccall(CodeBuilder& cdb,elem *e,unsigned numpara,unsigned numalign
if (s != tls_get_addr_sym)
{
//printf("call %s\n", s->Sident);
cdbe.append(load_localgot());
load_localgot(cdb);
cdbe.gencs(0xE8,0,fl,s); // CALL extern
}
else if (I64)
Expand Down Expand Up @@ -3413,7 +3411,7 @@ static void funccall(CodeBuilder& cdb,elem *e,unsigned numpara,unsigned numalign
elem *e11 = e1->E1;
tym_t e11ty = tybasic(e11->Ety);
assert(!I16 || (e11ty == (farfunc ? TYfptr : TYnptr)));
cdb.append(load_localgot());
load_localgot(cdb);
#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
if (config.flags3 & CFG3pic && I32)
keepmsk |= mBX;
Expand Down
2 changes: 1 addition & 1 deletion src/ddmd/backend/cod2.c
Original file line number Diff line number Diff line change
Expand Up @@ -4171,7 +4171,7 @@ void getoffset(CodeBuilder& cdb,elem *e,unsigned reg)
* LEA EAX,s@TLSGD[1*EBX+0]
*/
assert(reg == AX);
cdb.append(load_localgot());
load_localgot(cdb);
code css;
css.Iop = LEA; // LEA
css.Irm = modregrm(0,AX,4);
Expand Down
9 changes: 2 additions & 7 deletions src/ddmd/backend/cod3.c
Original file line number Diff line number Diff line change
Expand Up @@ -1579,7 +1579,7 @@ void doswitch(CodeBuilder& cdb, block *b)
*/

// Load GOT in EBX
cdb.append(load_localgot());
load_localgot(cdb);

// Allocate scratch register r1
regm_t scratchm = ALLREGS & ~(mask[reg] | mBX);
Expand Down Expand Up @@ -2365,7 +2365,7 @@ void cdgot(CodeBuilder& cdb, elem *e, regm_t *pretregs)
* Load contents of localgot into EBX.
*/

code *load_localgot()
void load_localgot(CodeBuilder& cdb)
{
#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
if (config.flags3 & CFG3pic && I32)
Expand All @@ -2375,24 +2375,19 @@ code *load_localgot()
localgot->Sflags &= ~GTregcand; // because this hack doesn't work with reg allocator
elem *e = el_var(localgot);
regm_t retregs = mBX;
CodeBuilder cdb;
codelem(cdb,e,&retregs,FALSE);
el_free(e);
return cdb.finish();
}
else
{
elem *e = el_long(TYnptr, 0);
e->Eoper = OPgot;
regm_t retregs = mBX;
CodeBuilder cdb;
codelem(cdb,e,&retregs,FALSE);
el_free(e);
return cdb.finish();
}
}
#endif
return NULL;
}

#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
Expand Down
2 changes: 1 addition & 1 deletion src/ddmd/backend/code.h
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,7 @@ void genjmp(CodeBuilder& cdb, unsigned op, unsigned fltarg, block *targ);
void prolog(CodeBuilder& cdb);
void epilog (block *b);
void gen_spill_reg(CodeBuilder& cdb, Symbol *s, bool toreg);
code *load_localgot();
void load_localgot(CodeBuilder& cdb);
targ_size_t cod3_spoff();
code *cod3_load_got();
void makeitextern (symbol *s );
Expand Down