[clang] [Driver] Add -fandroid-pad-segment/-fno-android-pad-segment (PR #75652)
Fangrui Song via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 15 15:26:24 PST 2023
https://github.com/MaskRay updated https://github.com/llvm/llvm-project/pull/75652
>From 964f9b98b389060e554e52e3c286255b4a25a7bb Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Fri, 15 Dec 2023 11:16:37 -0800
Subject: [PATCH] [Driver] Add -fandroid-pad-segment/-fno-android-pad-segment
-fandroid-pad-segment is an Android-specific opt-in option that
links in crt_pad_segment.o.
crt_pad_segment.o contains a note section, which will be included in the
linker-created PT_NOTE segment. This PT_NOTE tell Bionic that: when
create a map for a PT_LOAD segment, extend the end to cover the gap so
that we will have fewer kernel 'struct vm_area_struct' objects when
page_size < MAXPAGESIZE.
See also https://sourceware.org/bugzilla/show_bug.cgi?id=31076
---
clang/include/clang/Driver/Options.td | 5 +++++
clang/lib/Driver/ToolChains/Gnu.cpp | 5 +++++
.../sysroot/usr/lib/crt_pad_segment.o | 0
clang/test/Driver/linux-ld.c | 19 ++++++++++++++++++-
4 files changed, 28 insertions(+), 1 deletion(-)
create mode 100644 clang/test/Driver/Inputs/basic_android_tree/sysroot/usr/lib/crt_pad_segment.o
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 1b02087425b751..1d193dacc544b4 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6286,6 +6286,11 @@ def fno_sycl : Flag<["-"], "fno-sycl">,
Visibility<[ClangOption, CLOption]>,
Group<sycl_Group>, HelpText<"Disables SYCL kernels compilation for device">;
+// OS-specific options
+let Flags = [TargetSpecific] in {
+defm android_pad_segment : BooleanFFlag<"android-pad-segment">, Group<f_Group>;
+} // let Flags = [TargetSpecific]
+
//===----------------------------------------------------------------------===//
// FLangOption + NoXarchOption
//===----------------------------------------------------------------------===//
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
index 835215a83c4037..063f093fe432fd 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -507,6 +507,11 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
// Add crtfastmath.o if available and fast math is enabled.
ToolChain.addFastMathRuntimeIfAvailable(Args, CmdArgs);
+
+ if (isAndroid && Args.hasFlag(options::OPT_fandroid_pad_segment,
+ options::OPT_fno_android_pad_segment, false))
+ CmdArgs.push_back(
+ Args.MakeArgString(ToolChain.GetFilePath("crt_pad_segment.o")));
}
Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});
diff --git a/clang/test/Driver/Inputs/basic_android_tree/sysroot/usr/lib/crt_pad_segment.o b/clang/test/Driver/Inputs/basic_android_tree/sysroot/usr/lib/crt_pad_segment.o
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/linux-ld.c b/clang/test/Driver/linux-ld.c
index 15643d6491ae52..49693b6a2d87e2 100644
--- a/clang/test/Driver/linux-ld.c
+++ b/clang/test/Driver/linux-ld.c
@@ -1338,7 +1338,24 @@
// RUN: --sysroot=%S/Inputs/basic_android_tree/sysroot \
// RUN: | FileCheck --check-prefix=CHECK-ANDROID-PTHREAD-LINK %s
// CHECK-ANDROID-PTHREAD-LINK-NOT: argument unused during compilation: '-pthread'
-//
+
+/// Check -fandroid-pad-segment.
+// RUN: %clang -### %s --target=aarch64-linux-android -rtlib=platform --unwindlib=platform \
+// RUN: --gcc-toolchain="" --sysroot=%S/Inputs/basic_android_tree/sysroot \
+// RUN: -fandroid-pad-segment 2>&1 | FileCheck --check-prefix=CHECK-ANDROID-PAD-PHDR %s
+// CHECK-ANDROID-PAD-PHDR: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-ANDROID-PAD-PHDR: "[[SYSROOT]]/usr/lib/crtbegin_dynamic.o" "[[SYSROOT]]/usr/lib/crt_pad_phdr.o"
+
+// RUN: %clang -### %s --target=aarch64-linux-android -rtlib=platform --unwindlib=platform \
+// RUN: --gcc-toolchain="" --sysroot=%S/Inputs/basic_android_tree/sysroot \
+// RUN: -fandroid-pad-segment -fno-android-pad-segment 2>&1 | FileCheck --check-prefix=CHECK-NO-ANDROID-PAD-PHDR %s
+// CHECK-NO-ANDROID-PAD-PHDR: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-NO-ANDROID-PAD-PHDR: "[[SYSROOT]]/usr/lib/crtbegin_dynamic.o"
+// CHECK-NO-ANDROID-PAD-PHDR-NOT: crt_pad_phdr.o"
+
+// RUN: not %clang -### %s --target=aarch64-linux -fandroid-pad-segment 2>&1 | FileCheck --check-prefix=ERR-ANDROID-PAD-EHDR %s
+// ERR-ANDROID-PAD-EHDR: error: unsupported option '-fandroid-pad-segment' for target 'aarch64-linux'
+
// Check linker invocation on a Debian LoongArch sysroot.
// RUN: %clang -### %s -no-pie 2>&1 \
// RUN: --target=loongarch64-linux-gnu -rtlib=platform --unwindlib=platform \
More information about the cfe-commits
mailing list