Skip to content

Commit e150cca

Browse files
Ast-x64dlang-bot
authored andcommitted
RISCV: Fix vararg implementation
Fixing previous wrong implementation according to RISCV Calling Convention. Arguments larger than 2*XLEN bits are replaced by the address, and others with 2*XLEN-bit alignment should be aligned in register or stack.
1 parent 49a3da0 commit e150cca

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

src/core/stdc/stdarg.d

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,14 @@ T va_arg(T)(ref va_list ap)
269269
}
270270
else version (RISCV_Any)
271271
{
272-
auto p = cast(T*) ap;
272+
static if (T.sizeof > (size_t.sizeof << 1))
273+
auto p = *cast(T**) ap;
274+
else
275+
{
276+
static if (T.alignof == (size_t.sizeof << 1))
277+
ap = ap.alignUp!(size_t.sizeof << 1);
278+
auto p = cast(T*) ap;
279+
}
273280
ap += T.sizeof.alignUp;
274281
return *p;
275282
}

src/core/vararg.d

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,15 @@ void va_arg()(ref va_list ap, TypeInfo ti, void* parmn)
141141
else version (RISCV_Any)
142142
{
143143
const tsize = ti.tsize;
144-
auto p = cast(void*) ap;
144+
void* p;
145+
if (tsize > (size_t.sizeof << 1))
146+
p = *cast(void**) ap;
147+
else
148+
{
149+
if (tsize == (size_t.sizeof << 1))
150+
ap = ap.alignUp!(size_t.sizeof << 1);
151+
p = cast(void*) ap;
152+
}
145153
ap += tsize.alignUp;
146154
parmn[0..tsize] = p[0..tsize];
147155
}

0 commit comments

Comments
 (0)