Skip to content

Commit 3e6da89

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 b7b6eb7 commit 3e6da89

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
@@ -668,7 +668,11 @@ void ClassicFlang::ConstructJob(Compilation &C, const JobAction &JA,
668668
/***** Upper part of the Fortran frontend *****/
669669

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

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

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

10041011
// TODO FLANG arg handling
10051012
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)