Skip to content

Commit bf9ad08

Browse files
committed
[RISCV][Driver] Add riscv emulation mode to linker job of BareMetal toolchain
Change-Id: I5f3e958fe2e6032c2f8bf2206f3c7b381f799ef9
1 parent 51c9308 commit bf9ad08

File tree

2 files changed

+30
-27
lines changed

2 files changed

+30
-27
lines changed

clang/lib/Driver/ToolChains/BareMetal.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -534,8 +534,14 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
534534

535535
CmdArgs.push_back("-Bstatic");
536536

537-
if (TC.getTriple().isRISCV() && Args.hasArg(options::OPT_mno_relax))
538-
CmdArgs.push_back("--no-relax");
537+
if (Triple.isRISCV()) {
538+
if (Args.hasArg(options::OPT_mno_relax))
539+
CmdArgs.push_back("--no-relax");
540+
CmdArgs.push_back("-m");
541+
CmdArgs.push_back(Arch == llvm::Triple::riscv64 ? "elf64lriscv"
542+
: "elf32lriscv");
543+
CmdArgs.push_back("-X");
544+
}
539545

540546
if (Triple.isARM() || Triple.isThumb()) {
541547
bool IsBigEndian = arm::isARMBigEndian(Triple, Args);
@@ -622,9 +628,6 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
622628
NeedCRTs)
623629
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(CRTEnd)));
624630

625-
if (TC.getTriple().isRISCV())
626-
CmdArgs.push_back("-X");
627-
628631
// The R_ARM_TARGET2 relocation must be treated as R_ARM_REL32 on arm*-*-elf
629632
// and arm*-*-eabi (the default is R_ARM_GOT_PREL, used on arm*-*-linux and
630633
// arm*-*-*bsd).

clang/test/Driver/baremetal.cpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -250,27 +250,27 @@
250250
// CHECK-RV64-SAME: "-x" "c++" "{{.*}}baremetal.cpp"
251251
// CHECK-RV64-NEXT: ld{{(.exe)?}}"
252252
// CHECK-RV64-SAME: "--sysroot={{.*}}/Inputs/basic_riscv64_tree/riscv64-unknown-elf"
253-
// CHECK-RV64-SAME: "-Bstatic"
253+
// CHECK-RV64-SAME: "-Bstatic" "-m" "elf64lriscv" "-X"
254254
// CHECK-RV64-SAME: "-Lsome{{[/\\]+}}directory{{[/\\]+}}user{{[/\\]+}}asked{{[/\\]+}}for"
255255
// CHECK-RV64-SAME: "-L[[SYSROOT:[^"]+]]{{[/\\]+}}lib"
256256
// CHECK-RV64-SAME:"{{.*}}.o"
257257
// CHECK-RV64-SAME: "{{[^"]*}}libclang_rt.builtins.a"
258258
// CHECK-RV64-SAME: "-lc"
259-
// CHECK-RV64-SAME: "-X" "-o" "{{.*}}.tmp.out"
259+
// CHECK-RV64-SAME: "-o" "{{.*}}.tmp.out"
260260

261261
// RUN: %clangxx %s -### --target=riscv64-unknown-elf 2>&1 \
262262
// RUN: --sysroot=%S/Inputs/basic_riscv64_tree/riscv64-unknown-elf \
263263
// RUN: | FileCheck --check-prefix=CHECK-RV64-DEFAULTCXX %s
264264
// CHECK-RV64-DEFAULTCXX: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
265265
// CHECK-RV64-DEFAULTCXX: ld{{(.exe)?}}"
266266
// CHECK-RV64-DEFAULTCXX-SAME: "--sysroot={{.*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv64_tree{{[/\\]+}}riscv64-unknown-elf"
267-
// CHECK-RV64-DEFAULTCXX-SAME: -Bstatic"
267+
// CHECK-RV64-DEFAULTCXX-SAME: -Bstatic" "-m" "elf64lriscv" "-X"
268268
// CHECK-RV64-DEFAULTCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv64_tree{{[/\\]+}}riscv64-unknown-elf{{[/\\]+}}lib"
269269
// CHECK-RV64-DEFAULTCXX-SAME:"{{.*}}.o"
270270
// CHECK-RV64-DEFAULTCXX-SAME: "-lc++" "-lm"
271271
// CHECK-RV64-DEFAULTCXX-SAME: "{{[^"]*}}libclang_rt.builtins.a"
272272
// CHECK-RV64-DEFAULTCXX-SAME: "-lc"
273-
// CHECK-RV64-DEFAULTCXX-SAME: "-X" "-o" "a.out"
273+
// CHECK-RV64-DEFAULTCXX-SAME: "-o" "a.out"
274274

275275
// RUN: %clangxx %s -### --target=riscv64-unknown-elf 2>&1 \
276276
// RUN: --sysroot=%S/Inputs/basic_riscv64_tree/riscv64-unknown-elf \
@@ -281,13 +281,13 @@
281281
// CHECK-RV64-LIBCXX-SAME: "-internal-isystem" "{{[^"]+}}{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
282282
// CHECK-RV64-LIBCXX: ld{{(.exe)?}}"
283283
// CHECK-RV64-LIBCXX-SAME: "--sysroot={{.*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv64_tree{{[/\\]+}}riscv64-unknown-elf"
284-
// CHECK-RV64-LIBCXX-SAME: "-Bstatic"
284+
// CHECK-RV64-LIBCXX-SAME: "-Bstatic" "-m" "elf64lriscv" "-X"
285285
// CHECK-RV64-LIBCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv64_tree{{[/\\]+}}riscv64-unknown-elf{{[/\\]+}}lib"
286286
// CHECK-RV64-LIBCXX-SAME:"{{.*}}.o"
287287
// CHECK-RV64-LIBCXX-SAME: "-lc++" "-lm"
288288
// CHECK-RV64-LIBCXX-SAME: "{{[^"]*}}libclang_rt.builtins.a"
289289
// CHECK-RV64-LIBCXX-SAME: "-lc"
290-
// CHECK-RV64-LIBCXX-SAME: "-X" "-o" "a.out"
290+
// CHECK-RV64-LIBCXX-SAME: "-o" "a.out"
291291

292292
// RUN: %clangxx %s -### 2>&1 --target=riscv64-unknown-elf \
293293
// RUN: --sysroot=%S/Inputs/basic_riscv64_tree/riscv64-unknown-elf \
@@ -298,13 +298,13 @@
298298
// CHECK-RV64-LIBSTDCXX-SAME: "-internal-isystem" "{{[^"]+}}{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}8.0.1"
299299
// CHECK-RV64-LIBSTDCXX: ld{{(.exe)?}}"
300300
// CHECK-RV64-LIBSTDCXX-SAME: "--sysroot={{.*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv64_tree{{[/\\]+}}riscv64-unknown-elf"
301-
// CHECK-RV64-LIBSTDCXX-SAME: "-Bstatic"
301+
// CHECK-RV64-LIBSTDCXX-SAME: "-Bstatic" "-m" "elf64lriscv" "-X"
302302
// CHECK-RV64-LIBSTDCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv64_tree{{[/\\]+}}riscv64-unknown-elf{{[/\\]+}}lib"
303303
// CHECK-RV64-LIBSTDCXX-SAME: "{{.*}}.o"
304304
// CHECK-RV64-LIBSTDCXX-SAME: "-lstdc++" "-lm"
305305
// CHECK-RV64-LIBSTDCXX-SAME: "{{[^"]*}}libclang_rt.builtins.a"
306306
// CHECK-RV64-LIBSTDCXX-SAME: "-lc"
307-
// CHECK-RV64-LIBSTDCXX-SAME: "-X" "-o" "a.out"
307+
// CHECK-RV64-LIBSTDCXX-SAME: "-o" "a.out"
308308

309309
// RUN: %clang %s -### 2>&1 --target=riscv32-unknown-elf \
310310
// RUN: -L some/directory/user/asked/for \
@@ -318,27 +318,27 @@
318318
// CHECK-RV32-SAME: "-x" "c++" "{{.*}}baremetal.cpp"
319319
// CHECK-RV32-NEXT: ld{{(.exe)?}}"
320320
// CHECK-RV32-SAME: "--sysroot={{.*}}/Inputs/basic_riscv32_tree/riscv32-unknown-elf"
321-
// CHECK-RV32-SAME: "-Bstatic"
321+
// CHECK-RV32-SAME: "-Bstatic" "-m" "elf32lriscv" "-X"
322322
// CHECK-RV32-SAME: "-Lsome{{[/\\]+}}directory{{[/\\]+}}user{{[/\\]+}}asked{{[/\\]+}}for"
323323
// CHECK-RV32-SAME: "-L[[SYSROOT:[^"]+]]{{[/\\]+}}lib"
324324
// CHECK-RV32-SAME: "{{.*}}.o"
325325
// CHECK-RV32-SAME: "{{[^"]*}}libclang_rt.builtins.a"
326326
// CHECK-RV32-SAME: "-lc"
327-
// CHECK-RV32-SAME: "-X" "-o" "a.out"
327+
// CHECK-RV32-SAME: "-o" "a.out"
328328

329329
// RUN: %clangxx %s -### 2>&1 --target=riscv32-unknown-elf \
330330
// RUN: --sysroot=%S/Inputs/basic_riscv32_tree/riscv32-unknown-elf \
331331
// RUN: | FileCheck --check-prefix=CHECK-RV32-DEFAULTCXX %s
332332
// CHECK-RV32-DEFAULTCXX: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
333333
// CHECK-RV32-DEFAULTCXX: ld{{(.exe)?}}"
334334
// CHECK-RV32-DEFAULTCXX-SAME: "--sysroot={{.*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv32_tree{{[/\\]+}}riscv32-unknown-elf"
335-
// CHECK-RV32-DEFAULTCXX-SAME: "-Bstatic"
335+
// CHECK-RV32-DEFAULTCXX-SAME: "-Bstatic" "-m" "elf32lriscv" "-X"
336336
// CHECK-RV32-DEFAULTCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv32_tree{{[/\\]+}}riscv32-unknown-elf{{[/\\]+}}lib"
337337
// CHECK-RV32-DEFAULTCXX-SAME: "{{.*}}.o"
338338
// CHECK-RV32-DEFAULTCXX-SAME: "-lc++" "-lm"
339339
// CHECK-RV32-DEFAULTCXX-SAME: "{{[^"]*}}libclang_rt.builtins.a"
340340
// CHECK-RV32-DEFAULTCXX-SAME: "-lc"
341-
// CHECK-RV32-DEFAULTCXX-SAME: "-X" "-o" "a.out"
341+
// CHECK-RV32-DEFAULTCXX-SAME: "-o" "a.out"
342342

343343
// RUN: %clangxx %s -### 2>&1 --target=riscv32-unknown-elf \
344344
// RUN: --sysroot=%S/Inputs/basic_riscv32_tree/riscv32-unknown-elf \
@@ -349,12 +349,12 @@
349349
// CHECK-RV32-LIBCXX-SAME: "-internal-isystem" "{{[^"]+}}{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
350350
// CHECK-RV32-LIBCXX: ld{{(.exe)?}}"
351351
// CHECK-RV32-LIBCXX-SAME: "--sysroot={{.*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv32_tree{{[/\\]+}}riscv32-unknown-elf"
352-
// CHECK-RV32-LIBCXX-SAME: "-Bstatic"
352+
// CHECK-RV32-LIBCXX-SAME: "-Bstatic" "-m" "elf32lriscv" "-X"
353353
// CHECK-RV32-LIBCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv32_tree{{[/\\]+}}riscv32-unknown-elf{{[/\\]+}}lib"
354354
// CHECK-RV32-LIBCXX-SAME: "{{.*}}.o"
355355
// CHECK-RV32-LIBCXX-SAME: "-lc++" "-lm"
356356
// CHECK-RV32-LIBCXX-SAME: "{{[^"]*}}libclang_rt.builtins.a"
357-
// CHECK-RV32-LIBCXX-SAME: "-X" "-o" "a.out"
357+
// CHECK-RV32-LIBCXX-SAME: "-o" "a.out"
358358

359359
// RUN: %clangxx %s -### 2>&1 --target=riscv32-unknown-elf \
360360
// RUN: --sysroot=%S/Inputs/basic_riscv32_tree/riscv32-unknown-elf \
@@ -365,13 +365,13 @@
365365
// CHECK-RV32-LIBSTDCXX-SAME: "-internal-isystem" "{{[^"]+}}{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}8.0.1"
366366
// CHECK-RV32-LIBSTDCXX: ld{{(.exe)?}}"
367367
// CHECK-RV32-LIBSTDCXX-SAME: "--sysroot={{.*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv32_tree{{[/\\]+}}riscv32-unknown-elf"
368-
// CHECK-RV32-LIBSTDCXX-SAME: "-Bstatic"
368+
// CHECK-RV32-LIBSTDCXX-SAME: "-Bstatic" "-m" "elf32lriscv" "-X"
369369
// CHECK-RV32-LIBSTDCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv32_tree{{[/\\]+}}riscv32-unknown-elf{{[/\\]+}}lib"
370370
// CHECK-RV32-LIBSTDCXX-SAME: "{{.*}}.o"
371371
// CHECK-RV32-LIBSTDCXX-SAME: "-lstdc++" "-lm"
372372
// CHECK-RV32-LIBSTDCXX-SAME: "{{[^"]*}}libclang_rt.builtins.a"
373373
// CHECK-RV32-LIBSTDCXX-SAME: "-lc"
374-
// CHECK-RV32-LIBSTDCXX-SAME: "-X" "-o" "a.out"
374+
// CHECK-RV32-LIBSTDCXX-SAME: "-o" "a.out"
375375

376376
// RUN: %clang %s -### 2>&1 --target=riscv64-unknown-elf \
377377
// RUN: -nostdlibinc -nobuiltininc \
@@ -390,7 +390,7 @@
390390
// CHECK-RV64-NDL: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
391391
// CHECK-RV64-NDL: ld{{(.exe)?}}"
392392
// CHECK-RV64-NDL-SAME: "--sysroot={{.*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv64_tree{{[/\\]+}}riscv64-unknown-elf"
393-
// CHECK-RV64-NDL-SAME: "-Bstatic"
393+
// CHECK-RV64-NDL-SAME: "-Bstatic" "-m" "elf64lriscv" "-X"
394394
// CHECK-RV64-NDL-SAME: "-L{{[^"]*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv64_tree{{[/\\]+}}riscv64-unknown-elf{{[/\\]+}}lib"
395395

396396
// RUN: %clang %s -### 2>&1 --target=riscv64-unknown-elf \
@@ -411,7 +411,7 @@
411411
// CHECK-RV64FD-SAME: "-x" "c++" "{{.*}}baremetal.cpp"
412412
// CHECK-RV64FD-NEXT: ld{{(.exe)?}}"
413413
// CHECK-RV64FD-SAME: "--sysroot={{.*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv64_tree{{[/\\]+}}riscv64-unknown-elf"
414-
// CHECK-RV64FD-SAME: "-Bstatic"
414+
// CHECK-RV64FD-SAME: "-Bstatic" "-m" "elf64lriscv" "-X"
415415
// CHECK-RV64FD-SAME: "-L[[SYSROOT:[^"]+]]{{[/\\]+}}rv64imafdc{{[/\\]+}}lp64d{{[/\\]+}}lib"
416416

417417
// RUN: %clang %s -### 2>&1 --target=riscv32-unknown-elf \
@@ -432,7 +432,7 @@
432432
// CHECK-RV32I-SAME: "-x" "c++" "{{.*}}baremetal.cpp"
433433
// CHECK-RV32I-NEXT: ld{{(.exe)?}}"
434434
// CHECK-RV32I-SAME: "--sysroot={{.*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv32_tree{{[/\\]+}}riscv32-unknown-elf"
435-
// CHECK-RV32I-SAME: "-Bstatic"
435+
// CHECK-RV32I-SAME: "-Bstatic" "-m" "elf32lriscv" "-X"
436436
// CHECK-RV32I-SAME: "-L[[SYSROOT:[^"]+]]{{[/\\]+}}rv32i{{[/\\]+}}ilp32{{[/\\]+}}lib"
437437

438438
// RUN: %clang %s -### 2>&1 --target=riscv32-unknown-elf \
@@ -453,7 +453,7 @@
453453
// CHECK-RV32IM-SAME: "-x" "c++" "{{.*}}baremetal.cpp"
454454
// CHECK-RV32IM-NEXT: ld{{(.exe)?}}"
455455
// CHECK-RV32IM-SAME: "--sysroot={{.*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv32_tree{{[/\\]+}}riscv32-unknown-elf"
456-
// CHECK-RV32IM-SAME: "-Bstatic"
456+
// CHECK-RV32IM-SAME: "-Bstatic" "-m" "elf32lriscv" "-X"
457457
// CHECK-RV32IM-SAME: "-L[[SYSROOT:[^"]+]]{{[/\\]+}}rv32im{{[/\\]+}}ilp32{{[/\\]+}}lib"
458458

459459
// RUN: %clang %s -### 2>&1 --target=riscv32-unknown-elf \
@@ -469,7 +469,7 @@
469469
// CHECK-RV32IAC-SAME: "-x" "c++" "{{.*}}baremetal.cpp"
470470
// CHECK-RV32IAC-NEXT: ld{{(.exe)?}}"
471471
// CHECK-RV32IAC-SAME: "--sysroot={{.*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv32_tree{{[/\\]+}}riscv32-unknown-elf"
472-
// CHECK-RV32IAC-SAME: "-Bstatic"
472+
// CHECK-RV32IAC-SAME: "-Bstatic" "-m" "elf32lriscv" "-X"
473473
// CHECK-RV32IAC-SAME: "-L[[SYSROOT:[^"]+]]{{[/\\]+}}rv32iac{{[/\\]+}}ilp32{{[/\\]+}}lib"
474474

475475
// RUN: %clang %s -### 2>&1 --target=riscv32-unknown-elf -march=rv32imafc -mabi=ilp32f \
@@ -492,7 +492,7 @@
492492
// CHECK-RV32IMAFC-SAME: "-x" "c++" "{{.*}}baremetal.cpp"
493493
// CHECK-RV32IMAFC-NEXT: ld{{(.exe)?}}"
494494
// CHECK-RV32IMAFC-SAME: "--sysroot={{.*}}{{[/\\]+}}Inputs{{[/\\]+}}basic_riscv32_tree{{[/\\]+}}riscv32-unknown-elf"
495-
// CHECK-RV32IMAFC-SAME: "-Bstatic"
495+
// CHECK-RV32IMAFC-SAME: "-Bstatic" "-m" "elf32lriscv" "-X"
496496
// CHECK-RV32IMAFC-SAME: "-L[[SYSROOT:[^"]+]]{{[/\\]+}}rv32imafc{{[/\\]+}}ilp32f{{[/\\]+}}lib"
497497

498498
// RUN: %clang -no-canonical-prefixes %s -### --target=powerpc-unknown-eabi 2>&1 \

0 commit comments

Comments
 (0)