Skip to content

Commit b0fb598

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 8a44498 commit b0fb598

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
@@ -666,7 +666,11 @@ void Linux::AddFlangSystemIncludeArgs(const ArgList &DriverArgs,
666666

667667
{
668668
SmallString<128> P(D.Dir);
669-
llvm::sys::path::append(P, "../include");
669+
if (isCrossCompiling())
670+
llvm::sys::path::append(P, "../include",
671+
getEffectiveTriple().getTriple());
672+
else
673+
llvm::sys::path::append(P, "../include");
670674
IncludePathList.push_back(P.c_str());
671675
}
672676

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
@@ -370,3 +370,5 @@ def calculate_arch_features(arch_string):
370370

371371
if config.use_classic_flang:
372372
config.available_features.add("classic_flang")
373+
374+
config.available_features.add("host-" + config.host_arch)

0 commit comments

Comments
 (0)