Skip to content

Commit 3f5de27

Browse files
bryanpkcpsoni2628
andcommitted
[Driver] Enable Classic Flang cross-compilation, e.g. from X86 to AArch64
Co-authored-by: Prabhdeep Singh Soni <[email protected]>
1 parent cb3d351 commit 3f5de27

File tree

4 files changed

+32
-4
lines changed

4 files changed

+32
-4
lines changed

clang/lib/Driver/ToolChains/ClassicFlang.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,11 @@ void ClassicFlang::ConstructJob(Compilation &C, const JobAction &JA,
667667
/***** Upper part of the Fortran frontend *****/
668668

669669
// TODO do we need to invoke this under GDB sometimes?
670-
const char *UpperExec = Args.MakeArgString(getToolChain().GetProgramPath("flang1"));
670+
std::string flang1 = "flang1";
671+
if (getToolChain().isCrossCompiling())
672+
flang1 = getToolChain().getEffectiveTriple().getTriple() + "-" + flang1;
673+
const char *UpperExec =
674+
Args.MakeArgString(getToolChain().GetProgramPath(flang1.c_str()));
671675

672676
UpperCmdArgs.push_back("-opt"); UpperCmdArgs.push_back(Args.MakeArgString(OptOStr));
673677
UpperCmdArgs.push_back("-terse"); UpperCmdArgs.push_back("1");
@@ -997,8 +1001,11 @@ void ClassicFlang::ConstructJob(Compilation &C, const JobAction &JA,
9971001
Args.hasArg(options::OPT_E)) return;
9981002

9991003
/***** Lower part of Fortran frontend *****/
1000-
1001-
const char *LowerExec = Args.MakeArgString(getToolChain().GetProgramPath("flang2"));
1004+
std::string flang2 = "flang2";
1005+
if (getToolChain().isCrossCompiling())
1006+
flang2 = getToolChain().getEffectiveTriple().getTriple() + "-" + flang2;
1007+
const char *LowerExec =
1008+
Args.MakeArgString(getToolChain().GetProgramPath(flang2.c_str()));
10021009

10031010
// TODO FLANG arg handling
10041011
LowerCmdArgs.push_back("-fn"); LowerCmdArgs.push_back(Input.getBaseInput());

clang/lib/Driver/ToolChains/Linux.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,11 @@ void Linux::AddFlangSystemIncludeArgs(const ArgList &DriverArgs,
653653

654654
{
655655
SmallString<128> P(D.Dir);
656-
llvm::sys::path::append(P, "../include");
656+
if (isCrossCompiling())
657+
llvm::sys::path::append(P, "../include",
658+
getEffectiveTriple().getTriple());
659+
else
660+
llvm::sys::path::append(P, "../include");
657661
IncludePathList.push_back(P.c_str());
658662
}
659663

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
! REQUIRES: classic_flang
2+
! REQUIRES: host-x86_64
3+
4+
! Check if the cross-compiling flang1/flang2 binaries and include paths
5+
! are used by Clang when cross-compiling.
6+
7+
! RUN: %clang --driver-mode=flang -target aarch64-unknown-linux-gnu %s -### 2>&1 \
8+
! RUN: | FileCheck %s
9+
10+
! RUN: %clang --driver-mode=flang -target aarch64-linux-gnu %s -### 2>&1 \
11+
! RUN: | FileCheck %s
12+
13+
! CHECK: aarch64-unknown-linux-gnu-flang1
14+
! CHECK-SAME: include/aarch64-unknown-linux-gnu
15+
! CHECK: aarch64-unknown-linux-gnu-flang2

clang/test/lit.cfg.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,3 +365,5 @@ def calculate_arch_features(arch_string):
365365

366366
if config.use_classic_flang:
367367
config.available_features.add("classic_flang")
368+
369+
config.available_features.add("host-" + config.host_arch)

0 commit comments

Comments
 (0)