Skip to content

Commit eb95406

Browse files
authored
Merge pull request dlang#3846 from Ast-x64/riscv64
RISCV: Add some definitions and vararg supports Signed-off-by: Luís Ferreira <[email protected]> Signed-off-by: Nicholas Wilson <[email protected]> Merged-on-behalf-of: Nicholas Wilson <[email protected]>
2 parents 87031a5 + 4b9f519 commit eb95406

File tree

5 files changed

+102
-0
lines changed

5 files changed

+102
-0
lines changed

src/core/stdc/stdarg.d

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ version (MIPS32) version = MIPS_Any;
4747
version (MIPS64) version = MIPS_Any;
4848
version (PPC) version = PPC_Any;
4949
version (PPC64) version = PPC_Any;
50+
version (RISCV32) version = RISCV_Any;
51+
version (RISCV64) version = RISCV_Any;
5052

5153
version (GNU)
5254
{
@@ -130,6 +132,12 @@ else version (AAPCS64)
130132
{
131133
alias va_list = core.internal.vararg.aarch64.va_list;
132134
}
135+
else version (RISCV_Any)
136+
{
137+
// The va_list type is void*, according to RISCV Calling Convention
138+
// https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc
139+
alias va_list = void*;
140+
}
133141
else
134142
{
135143
alias va_list = char*; // incl. unknown platforms
@@ -259,6 +267,12 @@ T va_arg(T)(ref va_list ap)
259267
ap += T.sizeof.alignUp;
260268
return *p;
261269
}
270+
else version (RISCV_Any)
271+
{
272+
auto p = cast(T*) ap;
273+
ap += T.sizeof.alignUp;
274+
return *p;
275+
}
262276
else
263277
static assert(0, "Unsupported platform");
264278
}

src/core/sys/elf/package.d

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2510,3 +2510,66 @@ enum R_TILEGX_GNU_VTINHERIT = 128;
25102510
enum R_TILEGX_GNU_VTENTRY = 129;
25112511

25122512
enum R_TILEGX_NUM = 130;
2513+
2514+
enum EF_RISCV_RVC = 0x0001;
2515+
enum EF_RISCV_FLOAT_ABI = 0x0006;
2516+
enum EF_RISCV_FLOAT_ABI_SOFT = 0x0000;
2517+
enum EF_RISCV_FLOAT_ABI_SINGLE = 0x0002;
2518+
enum EF_RISCV_FLOAT_ABI_DOUBLE = 0x0004;
2519+
enum EF_RISCV_FLOAT_ABI_QUAD = 0x0006;
2520+
enum R_RISCV_NONE = 0;
2521+
enum R_RISCV_32 = 1;
2522+
enum R_RISCV_64 = 2;
2523+
enum R_RISCV_RELATIVE = 3;
2524+
enum R_RISCV_COPY = 4;
2525+
enum R_RISCV_JUMP_SLOT = 5;
2526+
enum R_RISCV_TLS_DTPMOD32 = 6;
2527+
enum R_RISCV_TLS_DTPMOD64 = 7;
2528+
enum R_RISCV_TLS_DTPREL32 = 8;
2529+
enum R_RISCV_TLS_DTPREL64 = 9;
2530+
enum R_RISCV_TLS_TPREL32 = 10;
2531+
enum R_RISCV_TLS_TPREL64 = 11;
2532+
enum R_RISCV_BRANCH = 16;
2533+
enum R_RISCV_JAL = 17;
2534+
enum R_RISCV_CALL = 18;
2535+
enum R_RISCV_CALL_PLT = 19;
2536+
enum R_RISCV_GOT_HI20 = 20;
2537+
enum R_RISCV_TLS_GOT_HI20 = 21;
2538+
enum R_RISCV_TLS_GD_HI20 = 22;
2539+
enum R_RISCV_PCREL_HI20 = 23;
2540+
enum R_RISCV_PCREL_LO12_I = 24;
2541+
enum R_RISCV_PCREL_LO12_S = 25;
2542+
enum R_RISCV_HI20 = 26;
2543+
enum R_RISCV_LO12_I = 27;
2544+
enum R_RISCV_LO12_S = 28;
2545+
enum R_RISCV_TPREL_HI20 = 29;
2546+
enum R_RISCV_TPREL_LO12_I = 30;
2547+
enum R_RISCV_TPREL_LO12_S = 31;
2548+
enum R_RISCV_TPREL_ADD = 32;
2549+
enum R_RISCV_ADD8 = 33;
2550+
enum R_RISCV_ADD16 = 34;
2551+
enum R_RISCV_ADD32 = 35;
2552+
enum R_RISCV_ADD64 = 36;
2553+
enum R_RISCV_SUB8 = 37;
2554+
enum R_RISCV_SUB16 = 38;
2555+
enum R_RISCV_SUB32 = 39;
2556+
enum R_RISCV_SUB64 = 40;
2557+
enum R_RISCV_GNU_VTINHERIT = 41;
2558+
enum R_RISCV_GNU_VTENTRY = 42;
2559+
enum R_RISCV_ALIGN = 43;
2560+
enum R_RISCV_RVC_BRANCH = 44;
2561+
enum R_RISCV_RVC_JUMP = 45;
2562+
enum R_RISCV_RVC_LUI = 46;
2563+
enum R_RISCV_GPREL_I = 47;
2564+
enum R_RISCV_GPREL_S = 48;
2565+
enum R_RISCV_TPREL_I = 49;
2566+
enum R_RISCV_TPREL_S = 50;
2567+
enum R_RISCV_RELAX = 51;
2568+
enum R_RISCV_SUB6 = 52;
2569+
enum R_RISCV_SET6 = 53;
2570+
enum R_RISCV_SET8 = 54;
2571+
enum R_RISCV_SET16 = 55;
2572+
enum R_RISCV_SET32 = 56;
2573+
enum R_RISCV_32_PCREL = 57;
2574+
enum R_RISCV_IRELATIVE = 58;
2575+
enum R_RISCV_NUM = 59;

src/core/sys/posix/fcntl.d

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ version (linux)
123123
enum F_SETLK = 6;
124124
enum F_SETLKW = 7;
125125
}
126+
else version (RISCV64)
127+
{
128+
enum F_GETLK = 5;
129+
enum F_SETLK = 6;
130+
enum F_SETLKW = 7;
131+
}
126132
else version (SystemZ)
127133
{
128134
static assert(off_t.sizeof == 8);

src/core/vararg.d

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ version (MIPS32) version = MIPS_Any;
2828
version (MIPS64) version = MIPS_Any;
2929
version (PPC) version = PPC_Any;
3030
version (PPC64) version = PPC_Any;
31+
version (RISCV32) version = RISCV_Any;
32+
version (RISCV64) version = RISCV_Any;
3133

3234
version (ARM_Any)
3335
{
@@ -136,6 +138,13 @@ void va_arg()(ref va_list ap, TypeInfo ti, void* parmn)
136138
ap += tsize.alignUp;
137139
parmn[0..tsize] = p[0..tsize];
138140
}
141+
else version (RISCV_Any)
142+
{
143+
const tsize = ti.tsize;
144+
auto p = cast(void*) ap;
145+
ap += tsize.alignUp;
146+
parmn[0..tsize] = p[0..tsize];
147+
}
139148
else
140149
static assert(0, "Unsupported platform");
141150
}

src/rt/dwarfeh.d

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ else version (MIPS32)
7373
enum eh_exception_regno = 4;
7474
enum eh_selector_regno = 5;
7575
}
76+
else version (RISCV64)
77+
{
78+
enum eh_exception_regno = 10;
79+
enum eh_selector_regno = 11;
80+
}
81+
else version (RISCV32)
82+
{
83+
enum eh_exception_regno = 10;
84+
enum eh_selector_regno = 11;
85+
}
7686
else
7787
{
7888
static assert(0, "Unknown EH register numbers for this architecture");

0 commit comments

Comments
 (0)