Skip to content

Commit e9e1d6b

Browse files
committed
Android: Switch to native ELF TLS & latest LTS NDK
1 parent 0586674 commit e9e1d6b

File tree

8 files changed

+26
-48
lines changed

8 files changed

+26
-48
lines changed

.github/actions/3-build-cross/action.yml

+6-10
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ inputs:
1414
default: false
1515
android_ndk_version:
1616
required: false
17-
default: r21e
17+
default: r26c
1818
android_api_level:
1919
required: false
20-
default: 21
20+
default: 29
2121
runs:
2222
using: composite
2323
steps:
@@ -92,16 +92,11 @@ runs:
9292
cd ..
9393
version='${{ inputs.android_ndk_version }}'
9494
curl -fL --retry 3 --max-time 300 -o android-ndk.zip \
95-
https://dl.google.com/android/repository/android-ndk-$version-linux-x86_64.zip
95+
https://dl.google.com/android/repository/android-ndk-$version-linux.zip
9696
unzip android-ndk.zip >/dev/null
9797
mv "android-ndk-$version" android-ndk
9898
rm android-ndk.zip
9999
100-
# The NDK toolchain file enforces `-g` as base C[XX] flag - remove it to
101-
# *significantly* reduce executable sizes
102-
toolchainFile="$PWD/android-ndk/build/cmake/android.toolchain.cmake"
103-
sed -i 's|^ -g$||' "$toolchainFile"
104-
105100
arch='${{ inputs.arch }}'
106101
apiLevel='${{ inputs.android_api_level }}'
107102
cmakeFlags="-DTARGET_SYSTEM='Android;Linux;UNIX'"
@@ -114,8 +109,9 @@ runs:
114109
fi
115110
cmakeFlags+=" -DANDROID_NATIVE_API_LEVEL=$apiLevel"
116111
cmakeFlags+=" -DANDROID_STL=c++_static"
117-
cmakeFlags+=" -DCMAKE_TOOLCHAIN_FILE=$toolchainFile"
118-
cmakeFlags+=" -DLDC_LINK_MANUALLY=ON -DD_LINKER_ARGS='-fuse-ld=bfd;-L$PWD/build-cross-libs/lib;-lphobos2-ldc;-ldruntime-ldc'"
112+
cmakeFlags+=" -DCMAKE_TOOLCHAIN_FILE=$PWD/android-ndk/build/cmake/android.toolchain.cmake"
113+
cmakeFlags+=" -DANDROID_USE_LEGACY_TOOLCHAIN_FILE=OFF"
114+
cmakeFlags+=" -DLDC_LINK_MANUALLY=ON -DD_LINKER_ARGS='-L$PWD/build-cross-libs/lib;-lphobos2-ldc;-ldruntime-ldc'"
119115
120116
echo "DFLAGS=-mtriple=$triple -fvisibility=hidden -L-L$PWD/build-cross-libs/lib -gcc=$PWD/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/$triple-clang" >> $GITHUB_ENV
121117
echo "CROSS_TRIPLE=$triple" >> $GITHUB_ENV

.github/actions/3-build-cross/android-llvm-config.in

+11-11
Original file line numberDiff line numberDiff line change
@@ -53,27 +53,27 @@ LIBFILE="${prefix}/lib/libLLVM-$version.so"
5353
components="aarch64 aarch64asmparser aarch64codegen aarch64desc aarch64disassembler aarch64info aarch64utils \
5454
aggressiveinstcombine all all-targets analysis arm armasmparser armcodegen armdesc armdisassembler arminfo armutils \
5555
asmparser asmprinter binaryformat bitreader bitstreamreader bitwriter cfguard codegen codegentypes core coroutines coverage \
56-
debuginfobtf debuginfocodeview debuginfodwarf debuginfogsym debuginfologicalview debuginfomsf debuginfopdb demangle dlltooldriver dwarflinker dwarflinkerparallel dwp \
57-
engine executionengine extensions filecheck frontendhlsl frontendopenacc frontendopenmp fuzzercli fuzzmutate globalisel instcombine \
56+
debuginfobtf debuginfocodeview debuginfodwarf debuginfogsym debuginfologicalview debuginfomsf debuginfopdb demangle dlltooldriver dwarflinker dwarflinkerclassic dwarflinkerparallel dwp \
57+
engine executionengine extensions filecheck frontenddriver frontendhlsl frontendoffloading frontendopenacc frontendopenmp fuzzercli fuzzmutate globalisel hipstdpar instcombine \
5858
instrumentation interfacestub interpreter ipo irprinter irreader jitlink libdriver lineeditor linker lto mc mca mcdisassembler \
59-
mcjit mcparser mirparser native nativecodegen objcarcopts objcopy object objectyaml option orcjit orcshared orctargetprocess \
59+
mcjit mcparser mirparser native nativecodegen objcarcopts objcopy object objectyaml option orcdebugging orcjit orcshared orctargetprocess \
6060
passes profiledata remarks runtimedyld scalaropts selectiondag spirv spirvcodegen spirvdesc spirvinfo support symbolize tablegen target targetparser textapi \
61-
transformutils vectorize webassembly webassemblyasmparser webassemblycodegen webassemblydesc webassemblydisassembler \
61+
textapibinaryreader transformutils vectorize webassembly webassemblyasmparser webassemblycodegen webassemblydesc webassemblydisassembler \
6262
webassemblyinfo webassemblyutils windowsdriver windowsmanifest x86 x86asmparser x86codegen x86desc x86disassembler x86info \
6363
x86targetmca xray"
64-
static_libs="-lLLVMWindowsManifest -lLLVMXRay -lLLVMLibDriver -lLLVMDlltoolDriver -lLLVMCoverage -lLLVMLineEditor \
64+
static_libs="-lLLVMWindowsManifest -lLLVMXRay -lLLVMLibDriver -lLLVMDlltoolDriver -lLLVMTextAPIBinaryReader -lLLVMCoverage -lLLVMLineEditor \
6565
-lLLVMSPIRVCodeGen -lLLVMSPIRVDesc -lLLVMSPIRVInfo \
6666
-lLLVMX86TargetMCA -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Info -lLLVMWebAssemblyDisassembler \
6767
-lLLVMWebAssemblyAsmParser -lLLVMWebAssemblyCodeGen -lLLVMWebAssemblyUtils -lLLVMWebAssemblyDesc -lLLVMWebAssemblyInfo -lLLVMARMDisassembler \
6868
-lLLVMARMAsmParser -lLLVMARMCodeGen -lLLVMARMDesc -lLLVMARMUtils -lLLVMARMInfo -lLLVMAArch64Disassembler \
69-
-lLLVMAArch64AsmParser -lLLVMAArch64CodeGen -lLLVMAArch64Desc -lLLVMAArch64Utils -lLLVMAArch64Info -lLLVMOrcJIT \
69+
-lLLVMAArch64AsmParser -lLLVMAArch64CodeGen -lLLVMAArch64Desc -lLLVMAArch64Utils -lLLVMAArch64Info -lLLVMOrcDebugging -lLLVMOrcJIT \
7070
-lLLVMWindowsDriver -lLLVMMCJIT -lLLVMJITLink -lLLVMInterpreter -lLLVMExecutionEngine -lLLVMRuntimeDyld -lLLVMOrcTargetProcess -lLLVMOrcShared \
7171
-lLLVMDWP -lLLVMDebugInfoLogicalView -lLLVMDebugInfoGSYM -lLLVMOption -lLLVMObjectYAML -lLLVMObjCopy -lLLVMMCA \
72-
-lLLVMMCDisassembler -lLLVMLTO -lLLVMPasses -lLLVMCFGuard -lLLVMCoroutines -lLLVMipo \
73-
-lLLVMVectorize -lLLVMLinker -lLLVMInstrumentation -lLLVMFrontendOpenMP -lLLVMFrontendOpenACC -lLLVMFrontendHLSL -lLLVMExtensions \
74-
-lLLVMDWARFLinkerParallel -lLLVMDWARFLinker -lLLVMGlobalISel -lLLVMMIRParser -lLLVMAsmPrinter -lLLVMSelectionDAG \
75-
-lLLVMCodeGen -lLLVMTarget -lLLVMObjCARCOpts -lLLVMCodeGenTypes -lLLVMIRPrinter -lLLVMInterfaceStub -lLLVMFileCheck -lLLVMFuzzMutate \
76-
-lLLVMScalarOpts -lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMTransformUtils -lLLVMBitWriter -lLLVMAnalysis \
72+
-lLLVMMCDisassembler -lLLVMLTO -lLLVMPasses -lLLVMHipStdPar -lLLVMCFGuard -lLLVMCoroutines -lLLVMipo \
73+
-lLLVMVectorize -lLLVMLinker -lLLVMInstrumentation -lLLVMFrontendOpenMP -lLLVMFrontendOffloading -lLLVMFrontendOpenACC -lLLVMFrontendHLSL -lLLVMFrontendDriver -lLLVMExtensions \
74+
-lLLVMDWARFLinkerParallel -lLLVMDWARFLinkerClassic -lLLVMDWARFLinker -lLLVMGlobalISel -lLLVMMIRParser -lLLVMAsmPrinter -lLLVMSelectionDAG \
75+
-lLLVMCodeGen -lLLVMTarget -lLLVMObjCARCOpts -lLLVMCodeGenTypes -lLLVMIRPrinter -lLLVMInterfaceStub -lLLVMFileCheck \
76+
-lLLVMFuzzMutate -lLLVMScalarOpts -lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMTransformUtils -lLLVMBitWriter -lLLVMAnalysis \
7777
-lLLVMProfileData -lLLVMSymbolize -lLLVMDebugInfoBTF -lLLVMDebugInfoPDB -lLLVMDebugInfoMSF -lLLVMDebugInfoDWARF -lLLVMObject -lLLVMTextAPI -lLLVMMCParser -lLLVMIRReader -lLLVMAsmParser -lLLVMMC -lLLVMDebugInfoCodeView \
7878
-lLLVMBitReader -lLLVMFuzzerCLI -lLLVMCore -lLLVMRemarks -lLLVMBitstreamReader -lLLVMBinaryFormat -lLLVMTargetParser -lLLVMTableGen -lLLVMSupport \
7979
-lLLVMDemangle"

driver/linker-gcc.cpp

-8
Original file line numberDiff line numberDiff line change
@@ -621,14 +621,6 @@ void ArgsBuilder::build(llvm::StringRef outputPath,
621621
void ArgsBuilder::addLinker() {
622622
llvm::StringRef linker = opts::linker;
623623

624-
// Default to ld.bfd for Android (placing .tdata and .tbss sections adjacent
625-
// to each other as required by druntime's rt.sections_android, contrary to
626-
// gold and lld as of Android NDK r21d).
627-
if (global.params.targetTriple->getEnvironment() == llvm::Triple::Android &&
628-
opts::linker.getNumOccurrences() == 0) {
629-
linker = "bfd";
630-
}
631-
632624
if (!linker.empty())
633625
args.push_back(("-fuse-ld=" + linker).str());
634626
}

driver/main.d

-15
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,3 @@ version (Windows)
5959
SetConsoleOutputCP(originalOutputCP);
6060
}
6161
}
62-
63-
// TLS bracketing symbols required for our custom TLS emulation on Android
64-
// as we don't have a D main() function for LDC and LDMD.
65-
version (Android)
66-
{
67-
import ldc.attributes;
68-
69-
extern(C) __gshared
70-
{
71-
@section(".tdata")
72-
int _tlsstart = 0;
73-
@section(".tcommon")
74-
int _tlsend = 0;
75-
}
76-
}

driver/targetmachine.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -635,12 +635,14 @@ createTargetMachine(const std::string targetTriple, const std::string arch,
635635
targetOptions.DataSections = true;
636636
}
637637

638-
// On Android, we depend on a custom TLS emulation scheme implemented in our
639-
// LLVM fork. LLVM 7+ enables regular emutls by default; prevent that.
638+
// On Android, enforce native ELF TLS (supported since API level 29 = Android
639+
// v10), as required by druntime. (Some older LLVM versions might default to
640+
// EmuTLS).
640641
if (triple.getEnvironment() == llvm::Triple::Android) {
641642
targetOptions.EmulatedTLS = false;
642643
#if LDC_LLVM_VER < 1700
643-
// Removed in this commit: https://github.com/llvm/llvm-project/commit/0d333bf0e3aa37e2e6ae211e3aa80631c3e01b85
644+
// Removed in this commit:
645+
// https://github.com/llvm/llvm-project/commit/0d333bf0e3aa37e2e6ae211e3aa80631c3e01b85
644646
targetOptions.ExplicitEmulatedTLS = true;
645647
#endif
646648
}

runtime/druntime/src/rt/sections.d

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ else version (CRuntime_Microsoft)
6464
public import rt.sections_win64;
6565
}
6666
else version (CRuntime_Bionic)
67-
public import rt.sections_android;
67+
public import rt.sections_elf_shared;
6868
else version (CRuntime_UClibc)
6969
public import rt.sections_elf_shared;
7070
else

runtime/druntime/src/rt/sections_android.d

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
module rt.sections_android;
1212

13+
version (LDC) { /* implemented in rt.sections_elf_shared */ } else:
14+
1315
version (CRuntime_Bionic):
1416

1517
// debug = PRINTF;

runtime/druntime/src/rt/sections_elf_shared.d

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ else version (CRuntime_Musl) enum SharedELF = true;
2424
else version (FreeBSD) enum SharedELF = true;
2525
else version (NetBSD) enum SharedELF = true;
2626
else version (DragonFlyBSD) enum SharedELF = true;
27+
else version (CRuntime_Bionic) enum SharedELF = true;
2728
else version (CRuntime_UClibc) enum SharedELF = true;
2829
else enum SharedELF = false;
2930

0 commit comments

Comments
 (0)