explicit pointer → u64 conversion

work towards gcc 32-bit x86 builds. (gcc sign-extended pointers without this changeset)
gcc miscompiles `union B` usage though (https://godbolt.org/z/hEWKdc5PK), which I can do nothing about, so clang is still the only option for 32-bit x86 builds
This commit is contained in:
dzaima 2022-08-10 10:20:48 +03:00
parent 9c1cbdc998
commit 3ab92ecd66
5 changed files with 15 additions and 13 deletions

View File

@ -188,7 +188,9 @@ static const u16 OBJ_TAG = 0b1111111111110110; // FFF6 1111111111110110ppppppppp
static const u16 ARR_TAG = 0b1111111111110111; // FFF7 1111111111110111ppppppppppppppppppppppppppppppppppppppppppppp000 array (everything else here is an atom)
static const u16 VAL_TAG = 0b1111111111110 ; // FFF. 1111111111110................................................... pointer to Value, needs refcounting
#define ftag(X) ((u64)(X) << 48)
#define tag(V, T) b(((u64)(V)) | ftag(T))
#define ptr2u64(X) ((u64)(uintptr_t)(X))
#define tagu64(V, T) b((u64)(V) | ftag(T))
#define tag(V, T) b(ptr2u64(V) | ftag(T))
#define taga(V) tag(V,ARR_TAG)
void cbqn_init(void);
@ -408,7 +410,7 @@ FORCE_INLINE bool isPrim(B x) { return isCallable(x) && v(x)->flags; }
// make objects
static B m_f64(f64 n) { assert(isF64(b(n))); return b(n); } // assert just to make sure we're actually creating a float
static B m_c32(u32 n) { return tag(n,C32_TAG); } // TODO check validity?
static B m_c32(u32 n) { return tagu64(n,C32_TAG); } // TODO check validity?
static B m_i32(i32 n) { return m_f64(n); }
static B m_usz(usz n) { return n<I32_MAX? m_i32((i32)n) : m_f64(n); }

View File

@ -298,7 +298,7 @@ static OptRes opt(u32* bc0) {
break;
}
case VARM: { u32 d = *bc++; u32 p = *bc++;
TSADD(stk,SREF(tag((u64)d<<32 | (u32)p, VAR_TAG), pos));
TSADD(stk,SREF(tagu64((u64)d<<32 | (u32)p, VAR_TAG), pos));
break;
}
case FN1C: case FN1O: { S(f,0)
@ -638,8 +638,8 @@ Nvm_res m_nvm(Body* body) {
case TR2D: TOPp; GET(R_A1,1,1); CCALL(i_TR2D); break; // (B g, B h)
case TR3D: TOPp; GET(R_A1,1,0); GET(R_A2,2,1); CCALL(i_TR3D); break; // (B f,B g, B h)
case TR3O: TOPp; GET(R_A1,1,0); GET(R_A2,2,1); CCALL(i_TR3O); break; // (B f,B g, B h)
case VARM: TOPs; { u64 d=*bc++; u64 p=*bc++; IMM(R_RES, tag((u64)d<<32 | (u32)p, VAR_TAG).u); } break;
case EXTM: TOPs; { u64 d=*bc++; u64 p=*bc++; IMM(R_RES, tag((u64)d<<32 | (u32)p, EXT_TAG).u); } break;
case VARM: TOPs; { u64 d=*bc++; u64 p=*bc++; IMM(R_RES, tagu64((u64)d<<32 | (u32)p, VAR_TAG).u); } break;
case EXTM: TOPs; { u64 d=*bc++; u64 p=*bc++; IMM(R_RES, tagu64((u64)d<<32 | (u32)p, EXT_TAG).u); } break;
case VARO: TOPs; { u64 d=*bc++; u64 p=*bc++; LSC(R_A1,d);
MOV8rmo(R_RES,R_A1,p*8+offsetof(Scope,vars)); // read variable
INCB(R_RES,R_A2,R_A3); // increment refcount if one's needed

View File

@ -106,7 +106,7 @@ void writeNum(FILE* f, u64 v, i32 len);
void BN(dumpHeap)(FILE* f) {
for (u64 i = 0; i < alSize; i++) {
AllocInfo ci = al[i];
u64 addrI = (u64) ci.p;
u64 addrI = ptr2u64(ci.p);
writeNum(f, ci.sz, 8);
writeNum(f, addrI, 8);
char* prefix = str1(BN());

View File

@ -321,7 +321,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl
bDone[id] = true;
Block* bl = compileBlock(IGetU(allBlocks,id), comp, bDone, bc, bcIA, allBlocks, allBodies, nameList, sc, depth+1, c-bc);
TSADD(newBC, bl->ty==0? DFND0 : bl->ty==1? DFND1 : DFND2);
A64((u64)bl);
A64(ptr2u64(bl));
TSADD(usedBlocks, bl);
break;
}
@ -386,8 +386,8 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl
u64 bodyReqAm = TSSIZE(bodyReqs);
for (u64 i = 0; i < bodyReqAm; i++) {
NextRequest r = bodyReqs[i];
/*ugly, but whatever*/ u64 v1 = (u64)bodyMap[r.pos1]; newBC[r.off+0] = (u32)v1; newBC[r.off+1] = v1>>32;
if (r.pos2!=U32_MAX) { u64 v2 = (u64)bodyMap[r.pos2]; newBC[r.off+2] = (u32)v2; newBC[r.off+3] = v2>>32; }
/*ugly, but whatever*/ u64 v1 = ptr2u64(bodyMap[r.pos1]); newBC[r.off+0] = (u32)v1; newBC[r.off+1] = v1>>32;
if (r.pos2!=U32_MAX) { u64 v2 = ptr2u64(bodyMap[r.pos2]); newBC[r.off+2] = (u32)v2; newBC[r.off+3] = v2>>32; }
}
TSFREE(bodyReqs);
TFREE(bodyMap);
@ -716,7 +716,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume
#endif
#define L64 ({ u64 r = bc[0] | ((u64)bc[1])<<32; bc+= 2; r; })
#if VM_POS
#define POS_UPD envCurr->pos = (u64)(bc-1);
#define POS_UPD envCurr->pos = ptr2u64(bc-1);
#else
#define POS_UPD
#endif
@ -799,7 +799,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume
}
case VARM: { u32 d = *bc++; u32 p = *bc++;
ADD(tag((u64)d<<32 | (u32)p, VAR_TAG));
ADD(tagu64((u64)d<<32 | (u32)p, VAR_TAG));
break;
}
case VARO: { u32 d = *bc++; u32 p = *bc++;
@ -816,7 +816,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume
}
case EXTM: { u32 d = *bc++; u32 p = *bc++;
ADD(tag((u64)d<<32 | (u32)p, EXT_TAG));
ADD(tagu64((u64)d<<32 | (u32)p, EXT_TAG));
break;
}
case EXTO: { u32 d = *bc++; u32 p = *bc++;

View File

@ -224,7 +224,7 @@ static inline void pushEnv(Scope* sc, u32* bc) {
if (envCurr+1==envEnd) thrM("Stack overflow");
Env* e = envCurr+1;
e->sc = sc;
e->pos = (u64)bc;
e->pos = ptr2u64(bc);
envCurr = e;
}
static inline void popEnv() {