Пример #1
0
/*
 * Create a reference for a TLS variable.
 * This is the "General dynamic" version.
 */
static NODE *
tlspic(NODE *p)
{
	NODE *q, *r, *s;
	char *s1, *s2;

	/*
	 * .byte   0x66
	 * leaq x@TLSGD(%rip),%rdi
	 * .word   0x6666
	 * rex64
	 * call __tls_get_addr@PLT
	 */

	/* Need the .byte stuff around.  Why? */
	/* Use inline assembler */
	q = mkx("%rdx", bcon(0));
	q = cmop(q, mkx("%rcx", bcon(0)));
	q = cmop(q, mkx("%rsi", bcon(0)));
	q = cmop(q, mkx("%rdi", bcon(0)));
	q = cmop(q, mkx("%r8", bcon(0)));
	q = cmop(q, mkx("%r9", bcon(0)));
	q = cmop(q, mkx("%r10", bcon(0)));
	q = cmop(q, mkx("%r11", bcon(0)));

	s = ccopy(r = tempnode(0, INCREF(p->n_type), p->n_df, p->n_ap));
	r = mkx("=a", r);
	r = block(XASM, r, q, INT, 0, 0);

	/* Create the magic string */
	s1 = ".byte 0x66\n\tleaq ";
	s2 = "@TLSGD(%%rip),%%rdi\n"
	    "\t.word 0x6666\n\trex64\n\tcall __tls_get_addr@PLT";
	if (attr_find(p->n_sp->sap, ATTR_SONAME) == NULL) {
		p->n_sp->sap = attr_add(p->n_sp->sap, attr_new(ATTR_SONAME, 1));
		p->n_sp->sap->sarg(0) = p->n_sp->sname;
	}
	r->n_name = addstring(mk3str(s1,
	    attr_find(p->n_sp->sap, ATTR_SONAME)->sarg(0), s2));

	r = block(COMOP, r, s, INCREF(p->n_type), p->n_df, p->n_ap);
	r = buildtree(UMUL, r, NIL);
	tfree(p);
	return r;
}
Пример #2
0
/*
 * Find number of beginning 0's in a word of type t.
 * t should be deunsigned.
 */
static NODE *
builtin_ff(NODE *a, TWORD t)
{
    NODE *t101, *t102;
    NODE *rn, *p;
    int l15, l16, l17;
    int sz;

    t = ctype(t);
    sz = (int)tsize(t, 0, 0)+1;

    t101 = tempnode(0, INT, 0, 0);
    t102 = tempnode(0, t, 0, 0);
    l15 = getlab();
    l16 = getlab();
    l17 = getlab();
    rn = buildtree(ASSIGN, ccopy(t101), bcon(0));
    rn = cmop(rn, buildtree(ASSIGN, ccopy(t102), a));

    p = buildtree(CBRANCH, buildtree(EQ, ccopy(t102), bcon(0)), bcon(l15));
    rn = cmop(rn, p);

    rn = cmop(rn, buildtree(INCR, ccopy(t101), bcon(1)));

    rn = cmop(rn, lblnod(l16));

    p = buildtree(CBRANCH, buildtree(GE, ccopy(t101), bcon(sz)), bcon(l15));
    rn = cmop(rn, p);

    p = buildtree(CBRANCH,
                  buildtree(EQ, buildtree(AND, ccopy(t102), bcon(1)),
                            bcon(0)), bcon(l17));
    rn = cmop(rn, p);

    rn = cmop(rn, block(GOTO, bcon(l15), NIL, INT, 0, 0));

    rn = cmop(rn, lblnod(l17));
    rn = cmop(rn, buildtree(RSEQ, t102, bcon(1)));

    rn = cmop(rn, buildtree(INCR, ccopy(t101), bcon(1)));

    rn = cmop(rn, block(GOTO, bcon(l16), NIL, INT, 0, 0));
    rn = cmop(rn, lblnod(l15));
    return cmop(rn, t101);
}