Skip to content

Commit 46b1136

Browse files
author
Garvit Gupta
committed
[RISCV][Driver] Add riscv emulation mode to linker job of BareMetal toolchain
Change-Id: Ifce8a3a7f1df9c12561d35ca3c923595e3619428
1 parent 86c8145 commit 46b1136

File tree

5 files changed

+99
-86
lines changed

5 files changed

+99
-86
lines changed

clang/lib/Driver/ToolChains/BareMetal.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -550,8 +550,19 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
550550

551551
CmdArgs.push_back("-Bstatic");
552552

553-
if (TC.getTriple().isRISCV() && Args.hasArg(options::OPT_mno_relax))
554-
CmdArgs.push_back("--no-relax");
553+
if (Triple.isRISCV()) {
554+
if (const char *LDMOption = getLDMOption(TC.getTriple(), Args)) {
555+
CmdArgs.push_back("-m");
556+
CmdArgs.push_back(LDMOption);
557+
} else {
558+
D.Diag(diag::err_target_unknown_triple) << Triple.str();
559+
return;
560+
}
561+
562+
CmdArgs.push_back("-X");
563+
if (Args.hasArg(options::OPT_mno_relax))
564+
CmdArgs.push_back("--no-relax");
565+
}
555566

556567
if (Triple.isARM() || Triple.isThumb()) {
557568
bool IsBigEndian = arm::isARMBigEndian(Triple, Args);

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,76 @@ void tools::AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
535535
}
536536
}
537537

538+
const char *tools::getLDMOption(const llvm::Triple &T, const ArgList &Args) {
539+
switch (T.getArch()) {
540+
case llvm::Triple::x86:
541+
if (T.isOSIAMCU())
542+
return "elf_iamcu";
543+
return "elf_i386";
544+
case llvm::Triple::aarch64:
545+
return "aarch64linux";
546+
case llvm::Triple::aarch64_be:
547+
return "aarch64linuxb";
548+
case llvm::Triple::arm:
549+
case llvm::Triple::thumb:
550+
case llvm::Triple::armeb:
551+
case llvm::Triple::thumbeb:
552+
return tools::arm::isARMBigEndian(T, Args) ? "armelfb_linux_eabi"
553+
: "armelf_linux_eabi";
554+
case llvm::Triple::m68k:
555+
return "m68kelf";
556+
case llvm::Triple::ppc:
557+
if (T.isOSLinux())
558+
return "elf32ppclinux";
559+
return "elf32ppc";
560+
case llvm::Triple::ppcle:
561+
if (T.isOSLinux())
562+
return "elf32lppclinux";
563+
return "elf32lppc";
564+
case llvm::Triple::ppc64:
565+
return "elf64ppc";
566+
case llvm::Triple::ppc64le:
567+
return "elf64lppc";
568+
case llvm::Triple::riscv32:
569+
return "elf32lriscv";
570+
case llvm::Triple::riscv64:
571+
return "elf64lriscv";
572+
case llvm::Triple::sparc:
573+
case llvm::Triple::sparcel:
574+
return "elf32_sparc";
575+
case llvm::Triple::sparcv9:
576+
return "elf64_sparc";
577+
case llvm::Triple::loongarch32:
578+
return "elf32loongarch";
579+
case llvm::Triple::loongarch64:
580+
return "elf64loongarch";
581+
case llvm::Triple::mips:
582+
return "elf32btsmip";
583+
case llvm::Triple::mipsel:
584+
return "elf32ltsmip";
585+
case llvm::Triple::mips64:
586+
if (tools::mips::hasMipsAbiArg(Args, "n32") || T.isABIN32())
587+
return "elf32btsmipn32";
588+
return "elf64btsmip";
589+
case llvm::Triple::mips64el:
590+
if (tools::mips::hasMipsAbiArg(Args, "n32") || T.isABIN32())
591+
return "elf32ltsmipn32";
592+
return "elf64ltsmip";
593+
case llvm::Triple::systemz:
594+
return "elf64_s390";
595+
case llvm::Triple::x86_64:
596+
if (T.isX32())
597+
return "elf32_x86_64";
598+
return "elf_x86_64";
599+
case llvm::Triple::ve:
600+
return "elf64ve";
601+
case llvm::Triple::csky:
602+
return "cskyelf_linux";
603+
default:
604+
return nullptr;
605+
}
606+
}
607+
538608
void tools::addLinkerCompressDebugSectionsOption(
539609
const ToolChain &TC, const llvm::opt::ArgList &Args,
540610
llvm::opt::ArgStringList &CmdArgs) {

clang/lib/Driver/ToolChains/CommonArgs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
3131
const llvm::opt::ArgList &Args,
3232
llvm::opt::ArgStringList &CmdArgs, const JobAction &JA);
3333

34+
const char *getLDMOption(const llvm::Triple &T, const llvm::opt::ArgList &Args);
35+
3436
void addLinkerCompressDebugSectionsOption(const ToolChain &TC,
3537
const llvm::opt::ArgList &Args,
3638
llvm::opt::ArgStringList &CmdArgs);

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -221,76 +221,6 @@ void tools::gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
221221
// The types are (hopefully) good enough.
222222
}
223223

224-
static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
225-
switch (T.getArch()) {
226-
case llvm::Triple::x86:
227-
if (T.isOSIAMCU())
228-
return "elf_iamcu";
229-
return "elf_i386";
230-
case llvm::Triple::aarch64:
231-
return "aarch64linux";
232-
case llvm::Triple::aarch64_be:
233-
return "aarch64linuxb";
234-
case llvm::Triple::arm:
235-
case llvm::Triple::thumb:
236-
case llvm::Triple::armeb:
237-
case llvm::Triple::thumbeb:
238-
return tools::arm::isARMBigEndian(T, Args) ? "armelfb_linux_eabi"
239-
: "armelf_linux_eabi";
240-
case llvm::Triple::m68k:
241-
return "m68kelf";
242-
case llvm::Triple::ppc:
243-
if (T.isOSLinux())
244-
return "elf32ppclinux";
245-
return "elf32ppc";
246-
case llvm::Triple::ppcle:
247-
if (T.isOSLinux())
248-
return "elf32lppclinux";
249-
return "elf32lppc";
250-
case llvm::Triple::ppc64:
251-
return "elf64ppc";
252-
case llvm::Triple::ppc64le:
253-
return "elf64lppc";
254-
case llvm::Triple::riscv32:
255-
return "elf32lriscv";
256-
case llvm::Triple::riscv64:
257-
return "elf64lriscv";
258-
case llvm::Triple::sparc:
259-
case llvm::Triple::sparcel:
260-
return "elf32_sparc";
261-
case llvm::Triple::sparcv9:
262-
return "elf64_sparc";
263-
case llvm::Triple::loongarch32:
264-
return "elf32loongarch";
265-
case llvm::Triple::loongarch64:
266-
return "elf64loongarch";
267-
case llvm::Triple::mips:
268-
return "elf32btsmip";
269-
case llvm::Triple::mipsel:
270-
return "elf32ltsmip";
271-
case llvm::Triple::mips64:
272-
if (tools::mips::hasMipsAbiArg(Args, "n32") || T.isABIN32())
273-
return "elf32btsmipn32";
274-
return "elf64btsmip";
275-
case llvm::Triple::mips64el:
276-
if (tools::mips::hasMipsAbiArg(Args, "n32") || T.isABIN32())
277-
return "elf32ltsmipn32";
278-
return "elf64ltsmip";
279-
case llvm::Triple::systemz:
280-
return "elf64_s390";
281-
case llvm::Triple::x86_64:
282-
if (T.isX32())
283-
return "elf32_x86_64";
284-
return "elf_x86_64";
285-
case llvm::Triple::ve:
286-
return "elf64ve";
287-
case llvm::Triple::csky:
288-
return "cskyelf_linux";
289-
default:
290-
return nullptr;
291-
}
292-
}
293-
294224
static bool getStaticPIE(const ArgList &Args, const ToolChain &TC) {
295225
bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
296226
if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {

clang/test/Driver/baremetal.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@
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"
@@ -264,7 +264,7 @@
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"
@@ -281,7 +281,7 @@
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"
@@ -298,7 +298,7 @@
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"
@@ -318,7 +318,7 @@
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"
@@ -332,7 +332,7 @@
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"
@@ -349,7 +349,7 @@
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"
@@ -365,7 +365,7 @@
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"
@@ -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)