@@ -252,9 +252,18 @@ static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
252
252
case llvm::Triple::ppc64le:
253
253
return " elf64lppc" ;
254
254
case llvm::Triple::riscv32:
255
- return " elf32lriscv" ;
256
255
case llvm::Triple::riscv64:
257
- return " elf64lriscv" ;
256
+ {
257
+ bool IsBigEndian = false ;
258
+ if (Arg *A = Args.getLastArg (options::OPT_mlittle_endian,
259
+ options::OPT_mbig_endian))
260
+ IsBigEndian = A->getOption ().matches (options::OPT_mbig_endian);
261
+
262
+ if (T.getArch () == llvm::Triple::riscv32)
263
+ return IsBigEndian ? " elf32briscv" : " elf32lriscv" ;
264
+ else
265
+ return IsBigEndian ? " elf64briscv" : " elf64lriscv" ;
266
+ }
258
267
case llvm::Triple::sparc:
259
268
case llvm::Triple::sparcel:
260
269
return " elf32_sparc" ;
@@ -402,6 +411,14 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
402
411
CmdArgs.push_back (Arch == llvm::Triple::aarch64_be ? " -EB" : " -EL" );
403
412
}
404
413
414
+ if (Triple.isRISCV () &&
415
+ Triple.getVendor () == llvm::Triple::MipsTechnologies) {
416
+ bool IsBigEndian = false ;
417
+ if (Arg *A = Args.getLastArg (options::OPT_mlittle_endian,
418
+ options::OPT_mbig_endian))
419
+ IsBigEndian = A->getOption ().matches (options::OPT_mbig_endian);
420
+ CmdArgs.push_back (IsBigEndian ? " -EB" : " -EL" );
421
+ }
405
422
// Most Android ARM64 targets should enable the linker fix for erratum
406
423
// 843419. Only non-Cortex-A53 devices are allowed to skip this flag.
407
424
if (Arch == llvm::Triple::aarch64 && (isAndroid || isOHOSFamily)) {
@@ -765,7 +782,8 @@ void tools::gnutools::Assembler::ConstructJob(Compilation &C,
765
782
}
766
783
case llvm::Triple::riscv32:
767
784
case llvm::Triple::riscv64: {
768
- StringRef ABIName = riscv::getRISCVABI (Args, getToolChain ().getTriple ());
785
+ const llvm::Triple &Triple = getToolChain ().getTriple ();
786
+ StringRef ABIName = riscv::getRISCVABI (Args, Triple);
769
787
CmdArgs.push_back (" -mabi" );
770
788
CmdArgs.push_back (ABIName.data ());
771
789
std::string MArchName =
@@ -774,6 +792,14 @@ void tools::gnutools::Assembler::ConstructJob(Compilation &C,
774
792
CmdArgs.push_back (Args.MakeArgString (MArchName));
775
793
if (!Args.hasFlag (options::OPT_mrelax, options::OPT_mno_relax, true ))
776
794
Args.addOptOutFlag (CmdArgs, options::OPT_mrelax, options::OPT_mno_relax);
795
+
796
+ if (Triple.getVendor () == llvm::Triple::MipsTechnologies) {
797
+ bool IsBigEndian = false ;
798
+ if (Arg *A = Args.getLastArg (options::OPT_mlittle_endian,
799
+ options::OPT_mbig_endian))
800
+ IsBigEndian = A->getOption ().matches (options::OPT_mbig_endian);
801
+ CmdArgs.push_back (IsBigEndian ? " -EB" : " -EL" );
802
+ }
777
803
break ;
778
804
}
779
805
case llvm::Triple::sparc:
@@ -1873,9 +1899,18 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
1873
1899
.flag (Twine (" -march=" , Element.march ).str ())
1874
1900
.flag (Twine (" -mabi=" , Element.mabi ).str ()));
1875
1901
}
1902
+ SmallVector<MultilibBuilder, 2 > Endian;
1903
+ if (TargetTriple.getVendor () == llvm::Triple::MipsTechnologies) {
1904
+ Endian.push_back (
1905
+ MultilibBuilder (" /riscv" ).flag (" -EL" ).flag (" -EB" , /* Disallow=*/ true ));
1906
+ Endian.push_back (
1907
+ MultilibBuilder (" /riscveb" ).flag (" -EB" ).flag (" -EL" , /* Disallow=*/ true ));
1908
+ }
1876
1909
MultilibSet RISCVMultilibs =
1877
1910
MultilibSetBuilder ()
1878
1911
.Either (Ms)
1912
+ .Either (Endian)
1913
+ .Either (ArrayRef<MultilibBuilder>(Ms))
1879
1914
.makeMultilibSet ()
1880
1915
.FilterOut (NonExistent)
1881
1916
.setFilePathsCallback ([](const Multilib &M) {
@@ -1899,6 +1934,19 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
1899
1934
}
1900
1935
}
1901
1936
1937
+ bool IsBigEndian = false ;
1938
+ if (Arg *A = Args.getLastArg (options::OPT_mlittle_endian,
1939
+ options::OPT_mbig_endian))
1940
+ IsBigEndian = A->getOption ().matches (options::OPT_mbig_endian);
1941
+
1942
+ if (IsBigEndian) {
1943
+ D.Diag (diag::err_drv_unsupported_opt_for_target)
1944
+ << " -EB" << TargetTriple.str ();
1945
+ }
1946
+
1947
+ addMultilibFlag (IsBigEndian, " -EB" , Flags);
1948
+ addMultilibFlag (!IsBigEndian, " -EL" , Flags);
1949
+
1902
1950
if (selectRISCVMultilib (D, RISCVMultilibs, MArch, Flags,
1903
1951
Result.SelectedMultilibs ))
1904
1952
Result.Multilibs = RISCVMultilibs;
@@ -1923,15 +1971,34 @@ static void findRISCVMultilibs(const Driver &D,
1923
1971
MultilibBuilder (" lib64/lp64f" ).flag (" -m64" ).flag (" -mabi=lp64f" );
1924
1972
MultilibBuilder Lp64d =
1925
1973
MultilibBuilder (" lib64/lp64d" ).flag (" -m64" ).flag (" -mabi=lp64d" );
1974
+
1975
+ SmallVector<MultilibBuilder, 2 > Endian;
1976
+ if (TargetTriple.getVendor () == llvm::Triple::MipsTechnologies) {
1977
+ Endian.push_back (
1978
+ MultilibBuilder (" /riscv" ).flag (" -EL" ).flag (" -EB" , /* Disallow=*/ true ));
1979
+ Endian.push_back (
1980
+ MultilibBuilder (" /riscveb" ).flag (" -EB" ).flag (" -EL" , /* Disallow=*/ true ));
1981
+ }
1982
+
1926
1983
MultilibSet RISCVMultilibs =
1927
1984
MultilibSetBuilder ()
1985
+ .Either (Endian)
1928
1986
.Either ({Ilp32, Ilp32f, Ilp32d, Lp64, Lp64f, Lp64d})
1929
1987
.makeMultilibSet ()
1930
1988
.FilterOut (NonExistent);
1931
1989
1932
1990
Multilib::flags_list Flags;
1933
1991
bool IsRV64 = TargetTriple.getArch () == llvm::Triple::riscv64;
1934
1992
StringRef ABIName = tools::riscv::getRISCVABI (Args, TargetTriple);
1993
+ bool IsBigEndian = false ;
1994
+ if (Arg *A = Args.getLastArg (options::OPT_mlittle_endian,
1995
+ options::OPT_mbig_endian))
1996
+ IsBigEndian = A->getOption ().matches (options::OPT_mbig_endian);
1997
+
1998
+ if (IsBigEndian) {
1999
+ D.Diag (diag::err_drv_unsupported_opt_for_target)
2000
+ << " -EB" << TargetTriple.str ();
2001
+ }
1935
2002
1936
2003
addMultilibFlag (!IsRV64, " -m32" , Flags);
1937
2004
addMultilibFlag (IsRV64, " -m64" , Flags);
@@ -1941,6 +2008,8 @@ static void findRISCVMultilibs(const Driver &D,
1941
2008
addMultilibFlag (ABIName == " lp64" , " -mabi=lp64" , Flags);
1942
2009
addMultilibFlag (ABIName == " lp64f" , " -mabi=lp64f" , Flags);
1943
2010
addMultilibFlag (ABIName == " lp64d" , " -mabi=lp64d" , Flags);
2011
+ addMultilibFlag (IsBigEndian, " -EB" , Flags);
2012
+ addMultilibFlag (!IsBigEndian, " -EL" , Flags);
1944
2013
1945
2014
if (RISCVMultilibs.select (D, Flags, Result.SelectedMultilibs ))
1946
2015
Result.Multilibs = RISCVMultilibs;
@@ -2566,7 +2635,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
2566
2635
" riscv32-unknown-elf" };
2567
2636
static const char *const RISCV64LibDirs[] = {" /lib64" , " /lib" };
2568
2637
static const char *const RISCV64Triples[] = {" riscv64-unknown-linux-gnu" ,
2569
- " riscv64-unknown-elf" };
2638
+ " riscv64-unknown-elf" ,
2639
+ " riscv64-mti-elf" };
2570
2640
2571
2641
static const char *const SPARCv8LibDirs[] = {" /lib32" , " /lib" };
2572
2642
static const char *const SPARCv8Triples[] = {" sparc-linux-gnu" ,
@@ -3137,6 +3207,45 @@ bool Generic_GCC::IsIntegratedAssemblerDefault() const {
3137
3207
case llvm::Triple::nvptx64:
3138
3208
case llvm::Triple::xcore:
3139
3209
return false ;
3210
+ case llvm::Triple::aarch64:
3211
+ case llvm::Triple::aarch64_be:
3212
+ case llvm::Triple::amdgcn:
3213
+ case llvm::Triple::arm:
3214
+ case llvm::Triple::armeb:
3215
+ case llvm::Triple::avr:
3216
+ case llvm::Triple::bpfel:
3217
+ case llvm::Triple::bpfeb:
3218
+ case llvm::Triple::csky:
3219
+ case llvm::Triple::hexagon:
3220
+ case llvm::Triple::lanai:
3221
+ case llvm::Triple::loongarch32:
3222
+ case llvm::Triple::loongarch64:
3223
+ case llvm::Triple::m68k:
3224
+ case llvm::Triple::mips:
3225
+ case llvm::Triple::mipsel:
3226
+ case llvm::Triple::mips64:
3227
+ case llvm::Triple::mips64el:
3228
+ case llvm::Triple::msp430:
3229
+ case llvm::Triple::ppc:
3230
+ case llvm::Triple::ppcle:
3231
+ case llvm::Triple::ppc64:
3232
+ case llvm::Triple::ppc64le:
3233
+ case llvm::Triple::r600:
3234
+ case llvm::Triple::sparc:
3235
+ case llvm::Triple::sparcel:
3236
+ case llvm::Triple::sparcv9:
3237
+ case llvm::Triple::systemz:
3238
+ case llvm::Triple::thumb:
3239
+ case llvm::Triple::thumbeb:
3240
+ case llvm::Triple::ve:
3241
+ case llvm::Triple::x86:
3242
+ case llvm::Triple::x86_64:
3243
+ return true ;
3244
+ case llvm::Triple::riscv32:
3245
+ case llvm::Triple::riscv64:
3246
+ if (getTriple ().getVendor () != llvm::Triple::MipsTechnologies)
3247
+ return true ;
3248
+ return false ;
3140
3249
default :
3141
3250
return true ;
3142
3251
}
0 commit comments