本文整理汇总了C++中el_var函数的典型用法代码示例。如果您正苦于以下问题:C++ el_var函数的具体用法?C++ el_var怎么用?C++ el_var使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了el_var函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: switch
void Module::genhelpers(bool iscomdat)
{
// If module assert
for (int i = 0; i < 3; i++)
{
Symbol *ma;
unsigned rt;
unsigned bc;
switch (i)
{
case 0: ma = marray; rt = RTLSYM_DARRAY; bc = BCexit; break;
case 1: ma = massert; rt = RTLSYM_DASSERT; bc = BCexit; break;
case 2: ma = munittest; rt = RTLSYM_DUNITTEST; bc = BCret; break;
default: assert(0);
}
if (ma)
{
elem *elinnum;
localgot = NULL;
// Call dassert(filename, line)
// Get sole parameter, linnum
{
Symbol *sp = symbol_calloc("linnum");
sp->Stype = type_fake(TYint);
sp->Stype->Tcount++;
sp->Sclass = (config.exe == EX_WIN64) ? SCshadowreg : SCfastpar;
FuncParamRegs fpr(TYjfunc);
fpr.alloc(sp->Stype, sp->Stype->Tty, &sp->Spreg, &sp->Spreg2);
sp->Sflags &= ~SFLspill;
sp->Sfl = (sp->Sclass == SCshadowreg) ? FLpara : FLfast;
cstate.CSpsymtab = &ma->Sfunc->Flocsym;
symbol_add(sp);
elinnum = el_var(sp);
}
elem *efilename = toEfilename(this);
elem *e = el_var(rtlsym[rt]);
e = el_bin(OPcall, TYvoid, e, el_param(elinnum, efilename));
block *b = block_calloc();
b->BC = bc;
b->Belem = e;
ma->Sfunc->Fstartline.Sfilename = arg;
ma->Sfunc->Fstartblock = b;
ma->Sclass = iscomdat ? SCcomdat : SCglobal;
ma->Sfl = 0;
ma->Sflags |= rtlsym[rt]->Sflags & SFLexit;
writefunc(ma);
}
}
}
示例2: el_var
elem *setEthis(Loc loc, IRState *irs, elem *ey, AggregateDeclaration *ad)
{
elem *ethis;
FuncDeclaration *thisfd = irs->getFunc();
int offset = 0;
Dsymbol *cdp = ad->toParent2(); // class/func we're nested in
//printf("setEthis(ad = %s, cdp = %s, thisfd = %s)\n", ad->toChars(), cdp->toChars(), thisfd->toChars());
if (cdp == thisfd)
{ /* Class we're new'ing is a local class in this function:
* void thisfd() { class ad { } }
*/
if (irs->sclosure)
ethis = el_var(irs->sclosure);
else if (irs->sthis)
{
if (thisfd->hasNestedFrameRefs())
{
ethis = el_ptr(irs->sthis);
}
else
ethis = el_var(irs->sthis);
}
else
{
ethis = el_long(TYnptr, 0);
if (thisfd->hasNestedFrameRefs())
{
ethis->Eoper = OPframeptr;
}
}
}
else if (thisfd->vthis &&
(cdp == thisfd->toParent2() ||
(cdp->isClassDeclaration() &&
cdp->isClassDeclaration()->isBaseOf(thisfd->toParent2()->isClassDeclaration(), &offset)
)
)
)
{ /* Class we're new'ing is at the same level as thisfd
*/
assert(offset == 0); // BUG: should handle this case
ethis = el_var(irs->sthis);
}
else
{
ethis = getEthis(loc, irs, ad->toParent2());
ethis = el_una(OPaddr, TYnptr, ethis);
}
ey = el_bin(OPadd, TYnptr, ey, el_long(TYsize_t, ad->vthis->offset));
ey = el_una(OPind, TYnptr, ey);
ey = el_bin(OPeq, TYnptr, ey, ethis);
return ey;
}
示例3: type_alloc
symbol *callFuncsAndGates(Module *m, symbols *sctors, StaticDtorDeclarations *ectorgates,
const char *id)
{
symbol *sctor = NULL;
if ((sctors && sctors->dim) ||
(ectorgates && ectorgates->dim))
{
static type *t;
if (!t)
{
/* t will be the type of the functions generated:
* extern (C) void func();
*/
t = type_alloc(TYnfunc);
t->Tflags |= TFprototype | TFfixed;
t->Tmangle = mTYman_c;
t->Tnext = tsvoid;
tsvoid->Tcount++;
}
localgot = NULL;
sctor = m->toSymbolX(id, SCglobal, t, "FZv");
cstate.CSpsymtab = &sctor->Sfunc->Flocsym;
elem *ector = NULL;
if (ectorgates)
{
for (size_t i = 0; i < ectorgates->dim; i++)
{ StaticDtorDeclaration *f = (*ectorgates)[i];
Symbol *s = f->vgate->toSymbol();
elem *e = el_var(s);
e = el_bin(OPaddass, TYint, e, el_long(TYint, 1));
ector = el_combine(ector, e);
}
}
if (sctors)
{
for (size_t i = 0; i < sctors->dim; i++)
{ symbol *s = (*sctors)[i];
elem *e = el_una(OPucall, TYvoid, el_var(s));
ector = el_combine(ector, e);
}
}
block *b = block_calloc();
b->BC = BCret;
b->Belem = ector;
sctor->Sfunc->Fstartline.Sfilename = m->arg;
sctor->Sfunc->Fstartblock = b;
writefunc(sctor);
}
return sctor;
}
示例4: objc_callfunc_setupMethodSelector
void objc_callfunc_setupMethodSelector(Type *tret, FuncDeclaration *fd, Type *t, elem *ehidden, elem **esel)
{
if (fd && fd->objc.selector && !*esel)
{
*esel = el_var(objc_getMethVarRef(fd->objc.selector->stringvalue, fd->objc.selector->stringlen));
}
}
示例5: strlen
elem *Module::toEfilename()
{ elem *efilename;
if (!sfilename)
{
dt_t *dt = NULL;
char *id;
int len;
id = srcfile->toChars();
len = strlen(id);
dtdword(&dt, len);
dtabytes(&dt,TYnptr, 0, len + 1, id);
sfilename = symbol_generate(SCstatic,type_fake(TYdarray));
sfilename->Sdt = dt;
sfilename->Sfl = FLdata;
#if ELFOBJ
sfilename->Sseg = CDATA;
#endif
#if MACHOBJ
// Because of PIC and CDATA being in the _TEXT segment, cannot
// have pointers in CDATA
sfilename->Sseg = DATA;
#endif
outdata(sfilename);
}
efilename = el_var(sfilename);
return efilename;
}
示例6: visit
void visit(WithStatement *s)
{
Symbol *sp;
elem *e;
elem *ei;
ExpInitializer *ie;
Blockx *blx = irs->blx;
//printf("WithStatement::toIR()\n");
if (s->exp->op == TOKimport || s->exp->op == TOKtype)
{
}
else
{
// Declare with handle
sp = toSymbol(s->wthis);
symbol_add(sp);
// Perform initialization of with handle
ie = s->wthis->_init->isExpInitializer();
assert(ie);
ei = toElemDtor(ie->exp, irs);
e = el_var(sp);
e = el_bin(OPeq,e->Ety, e, ei);
elem_setLoc(e, s->loc);
incUsage(irs, s->loc);
block_appendexp(blx->curblock,e);
}
// Execute with block
if (s->_body)
Statement_toIR(s->_body, irs);
}
示例7: toSymbol
elem *Module::toEmodulename()
{
elem *efilename;
// Get filename
if (needModuleInfo())
{ Symbol *si;
/* Class ModuleInfo is defined in std.moduleinfo.
* The first member is the name of it, char name[],
* which will be at offset 8.
*/
si = toSymbol();
#if 1
// Use this instead so -fPIC will work
efilename = el_ptr(si);
efilename = el_bin(OPadd, TYnptr, efilename, el_long(TYuint, 8));
efilename = el_una(OPind, TYdarray, efilename);
#else
efilename = el_var(si);
efilename->Ety = TYdarray;
efilename->EV.sp.Voffset += 8;
#endif
}
else // generate our own filename
{
efilename = toEfilename();
}
return efilename;
}
示例8: objc_callfunc_setupMethodCall
void objc_callfunc_setupMethodCall(elem **ec, elem *ehidden, elem *ethis, TypeFunction *tf)
{
// make objc-style "virtual" call using dispatch function
assert(ethis);
Type *tret = tf->next;
*ec = el_var(objc_getMsgSend(tret, ehidden != 0));
}
示例9: el_long
/**************************************
* Given an expression e that is an array,
* determine and set the 'length' variable.
* Input:
* lengthVar Symbol of 'length' variable
* &e expression that is the array
* t1 Type of the array
* Output:
* e is rewritten to avoid side effects
* Returns:
* expression that initializes 'length'
*/
elem *resolveLengthVar(VarDeclaration *lengthVar, elem **pe, Type *t1)
{
//printf("resolveLengthVar()\n");
elem *einit = NULL;
if (lengthVar && !(lengthVar->storage_class & STCconst))
{
elem *elength;
Symbol *slength;
if (t1->ty == Tsarray)
{
TypeSArray *tsa = (TypeSArray *)t1;
dinteger_t length = tsa->dim->toInteger();
elength = el_long(TYsize_t, length);
goto L3;
}
else if (t1->ty == Tarray)
{
elength = *pe;
*pe = el_same(&elength);
elength = el_una(I64 ? OP128_64 : OP64_32, TYsize_t, elength);
L3:
slength = toSymbol(lengthVar);
//symbol_add(slength);
einit = el_bin(OPeq, TYsize_t, el_var(slength), elength);
}
}
return einit;
}
示例10: elem_debug
elem *exp2_copytotemp(elem *e)
{
//printf("exp2_copytotemp()\n");
elem_debug(e);
Symbol *stmp = symbol_genauto(e);
elem *eeq = el_bin(OPeq,e->Ety,el_var(stmp),e);
elem *er = el_bin(OPcomma,e->Ety,eeq,el_var(stmp));
if (tybasic(e->Ety) == TYstruct || tybasic(e->Ety) == TYarray)
{
eeq->Eoper = OPstreq;
eeq->ET = e->ET;
eeq->E1->ET = e->ET;
er->ET = e->ET;
er->E2->ET = e->ET;
}
return er;
}
示例11: symbol_debug
elem *nteh_setScopeTableIndex(Blockx *blx, int scope_index)
{
elem *e;
Symbol *s;
s = blx->context;
symbol_debug(s);
e = el_var(s);
e->EV.sp.Voffset = nteh_offset_sindex();
return el_bin(OPeq, TYint, e, el_long(TYint, scope_index));
}
示例12: incUsage
void ThrowStatement::toIR(IRState *irs)
{
// throw(exp)
Blockx *blx = irs->blx;
incUsage(irs, loc);
elem *e = exp->toElemDtor(irs);
e = el_bin(OPcall, TYvoid, el_var(rtlsym[RTLSYM_THROWC]),e);
block_appendexp(blx->curblock, e);
}
示例13: el_ptr
void SwitchErrorStatement::toIR(IRState *irs)
{
Blockx *blx = irs->blx;
//printf("SwitchErrorStatement::toIR()\n");
elem *efilename = el_ptr(blx->module->toSymbol());
elem *elinnum = el_long(TYint, loc.linnum);
elem *e = el_bin(OPcall, TYvoid, el_var(rtlsym[RTLSYM_DSWITCHERR]), el_param(elinnum, efilename));
block_appendexp(blx->curblock, e);
}
示例14: type_debug
elem *type_vla_fix(type **pt)
{
type *t;
elem *e = NULL;
for (t = *pt; t; t = t->Tnext)
{
type_debug(t);
if (tybasic(t->Tty) == TYarray && t->Tflags & TFvla && t->Tel)
{ symbol *s;
elem *ec;
s = symbol_genauto(tsuns);
ec = el_var(s);
ec = el_bint(OPeq, tsuns, ec, t->Tel);
e = el_combine(e, ec);
t->Tel = el_var(s);
}
}
return e;
}
示例15: mystate
void IfStatement::toIR(IRState *irs)
{
elem *e;
Blockx *blx = irs->blx;
//printf("IfStatement::toIR('%s')\n", condition->toChars());
IRState mystate(irs, this);
// bexit is the block that gets control after this IfStatement is done
block *bexit = mystate.breakBlock ? mystate.breakBlock : block_calloc();
incUsage(irs, loc);
#if 0
if (match)
{ /* Generate:
* if (match = RTLSYM_IFMATCH(string, pattern)) ...
*/
assert(condition->op == TOKmatch);
e = matchexp_toelem((MatchExp *)condition, &mystate, RTLSYM_IFMATCH);
Symbol *s = match->toSymbol();
symbol_add(s);
e = el_bin(OPeq, TYnptr, el_var(s), e);
}
else
#endif
e = condition->toElemDtor(&mystate);
block_appendexp(blx->curblock, e);
block *bcond = blx->curblock;
block_next(blx, BCiftrue, NULL);
list_append(&bcond->Bsucc, blx->curblock);
if (ifbody)
ifbody->toIR(&mystate);
list_append(&blx->curblock->Bsucc, bexit);
if (elsebody)
{
block_next(blx, BCgoto, NULL);
list_append(&bcond->Bsucc, blx->curblock);
elsebody->toIR(&mystate);
list_append(&blx->curblock->Bsucc, bexit);
}
else
list_append(&bcond->Bsucc, bexit);
block_next(blx, BCgoto, bexit);
}