flake
packages
basic-init
busybox
clang
compiler-rt
initramfs
libcxx
linux
musl
run
sysroot
···
7
7
let
8
8
inherit (lib) filterAttrs pipe;
9
9
inherit (builtins) mapAttrs readDir;
10
10
-
pkgs = {
11
11
-
inherit lib currentSystem;
10
10
+
wasmpkgs = {
11
11
+
inherit
12
12
+
lib
13
13
+
currentSystem
14
14
+
wasmpkgs
15
15
+
hostpkgs
16
16
+
;
12
17
config = {
13
18
debug = false;
14
19
};
15
20
}
16
21
// lib.packagesFromDirectoryRecursive {
17
17
-
callPackage = lib.callPackageWith (pkgs // hostpkgs);
22
22
+
callPackage = lib.callPackageWith (wasmpkgs // hostpkgs);
18
23
directory = ./packages;
19
24
}
20
25
// (
···
30
35
(mapAttrs (
31
36
name: dir:
32
37
let
33
33
-
pkg = (mapAttrs (output: _: /${dir}/${output}) (readDir dir)) // {
34
34
-
type = "derivation";
35
35
-
src = /${overrides}/${name}/src;
36
36
-
outPath = pkg.out;
37
37
-
};
38
38
+
outputs = mapAttrs (output: _: /${dir}/${output}) (readDir dir);
38
39
in
39
39
-
pkg
40
40
+
outputs
41
41
+
// {
42
42
+
type = "derivation";
43
43
+
src = /${overrides}/${name}/src;
44
44
+
outPath = outputs.out;
45
45
+
}
40
46
))
41
47
]
42
48
else
43
49
{ }
44
50
);
45
51
in
46
46
-
pkgs
52
52
+
wasmpkgs
···
64
64
legacyPackages = import ./all-packages.nix {
65
65
inherit (inputs.nixpkgs) lib;
66
66
currentSystem = system;
67
67
-
hostpkgs = import ./host-packages.nix { inherit pkgs; };
67
67
+
hostpkgs = import ./host-packages.nix {
68
68
+
inherit pkgs;
69
69
+
wasmpkgs = config.legacyPackages;
70
70
+
};
68
71
};
69
72
70
73
# and then expose a filtered version of that attribute set with just the actual packages.
···
3
3
imports = [ inputs.make-shell.flakeModules.default ];
4
4
5
5
perSystem =
6
6
-
{ pkgs, ... }:
6
6
+
{ pkgs, config, ... }:
7
7
+
let
8
8
+
inherit (config.legacyPackages) wasmpkgs hostpkgs;
9
9
+
in
7
10
{
8
11
make-shells.default = {
9
12
stdenv = pkgs.stdenvNoCC;
10
10
-
packages = with pkgs; [
11
11
-
just
13
13
+
packages = [
14
14
+
pkgs.just
15
15
+
hostpkgs.clang
16
16
+
hostpkgs.lld
17
17
+
hostpkgs.llvm
18
18
+
hostpkgs.cmake
19
19
+
(pkgs.writeShellScriptBin "hostcc" ''exec ${hostpkgs.clang-host}/bin/clang "$@"'')
12
20
];
21
21
+
env = {
22
22
+
inherit (wasmpkgs) sysroot;
23
23
+
};
13
24
};
14
25
15
26
make-shells.ci = {
16
27
stdenv = pkgs.stdenvNoCC;
17
17
-
packages = with pkgs; [
18
18
-
attic-client
19
19
-
jq
20
20
-
nix-eval-jobs
28
28
+
packages = [
29
29
+
pkgs.jq
30
30
+
pkgs.nix-eval-jobs
21
31
];
22
32
};
23
33
};
···
1
1
# basic build dependencies from nixpkgs for cross compilation
2
2
3
3
-
{ pkgs }:
3
3
+
{ pkgs, wasmpkgs }:
4
4
5
5
let
6
6
llvm = pkgs.llvmPackages_19;
7
7
+
clang = llvm.clang-unwrapped.overrideAttrs (attrs: {
8
8
+
patches = attrs.patches or [ ] ++ [ ./packages/clang/clang-add-wasm-linux-target.patch ];
9
9
+
});
7
10
in
8
11
9
12
{
10
10
-
busybox-host = pkgs.busybox;
11
11
-
clang = llvm.clang-unwrapped;
13
13
+
clang-no-compiler-rt = clang;
14
14
+
clang = pkgs.runCommandNoCCLocal "clang" { } ''
15
15
+
cp -r ${clang} $out
16
16
+
chmod -R +w $out
17
17
+
ln -s $out/bin/clang $out/bin/cc
18
18
+
ln -s $out/bin/clang++ $out/bin/c++
19
19
+
20
20
+
cp -r ${clang.lib}/lib/clang $out/lib/
21
21
+
chmod -R +w $out/lib/clang
22
22
+
23
23
+
mkdir -p $out/lib/clang/19/lib/wasm32 $out/lib/clang/19/lib/wasm32-unknown $out/lib/clang/19/lib/wasm32-unknown-linux-musl
24
24
+
cp ${wasmpkgs.compiler-rt}/libclang_rt.builtins-wasm32.a $out/lib/clang/19/lib/wasm32/libclang_rt.builtins.a
25
25
+
cp ${wasmpkgs.compiler-rt}/libclang_rt.builtins-wasm32.a $out/lib/clang/19/lib/wasm32-unknown/libclang_rt.builtins.a
26
26
+
cp ${wasmpkgs.compiler-rt}/libclang_rt.builtins-wasm32.a $out/lib/clang/19/lib/wasm32-unknown-linux-musl/libclang_rt.builtins.a
27
27
+
'';
12
28
clang-host = llvm.clang;
29
29
+
clang-tblgen = llvm.clang-unwrapped.dev;
13
30
inherit (llvm) lld;
14
31
inherit (pkgs)
15
32
bash
33
33
+
busybox
16
34
bc
17
35
bison
18
36
cmake
···
12
12
return 0;
13
13
}
14
14
15
15
-
int main(int argc, char *argv[], char *envp[]) {
15
15
+
int main(int argc, char *argv[]) {
16
16
printf("Hello, world!\n");
17
17
18
18
printf("pid = %d\n", getpid());
···
28
28
printf("argc = %d\n", argc);
29
29
for (int i = 0; i < argc; i++)
30
30
printf("argv[%d] = %s\n", i, argv[i]);
31
31
-
for (int i = 0; envp[i]; i++)
32
32
-
printf("envp[%d] = %s\n", i, envp[i]);
31
31
+
for (int i = 0; environ[i]; i++)
32
32
+
printf("environ[%d] = %s\n", i, environ[i]);
33
33
34
34
foo = 1;
35
35
void* stack = malloc(4096);
···
5
5
6
6
clang,
7
7
lld,
8
8
-
musl,
9
9
-
compiler-rt,
8
8
+
sysroot,
10
9
}:
11
10
12
11
run
···
19
18
];
20
19
}
21
20
''
22
22
-
clang -c -o init.o init.c --target=wasm32 -nostdinc -isystem ${musl}/include ${lib.optionalString config.debug "-g"} -matomics -mbulk-memory
23
23
-
wasm-ld -o init init.o ${compiler-rt}/libclang_rt.builtins-wasm32.a ${musl}/lib/crt1.o -L${musl}/lib -lc --fatal-warnings --import-memory --max-memory=4294967296 --shared-memory --export-table
21
21
+
clang -c -o init.o init.c --target=wasm32-unknown-linux-musl --sysroot=${sysroot} ${lib.optionalString config.debug "-g"} -matomics -mbulk-memory
22
22
+
clang -o init init.o --target=wasm32-unknown-linux-musl --sysroot=${sysroot} -Wl,--fatal-warnings,--import-memory,--max-memory=4294967296,--shared-memory,--export-table
24
23
25
24
mkdir -p $out/bin
26
25
cp init $out/bin
···
6
6
7
7
clang-host ? clang,
8
8
clang,
9
9
-
compiler-rt,
10
9
gnumake,
11
11
-
linux,
12
10
lld,
13
11
llvm,
14
14
-
musl,
12
12
+
linux,
13
13
+
sysroot,
15
14
}:
16
15
17
16
run
···
36
35
ARCH=wasm32 \
37
36
HOSTCC=${clang-host}/bin/clang \
38
37
CC=${clang}/bin/clang \
39
39
-
CFLAGS_busybox="${musl}/lib/crt1.o -Wl,--import-memory -Wl,--max-memory=4294967296 -Wl,--shared-memory -Wl,--export-table" "$@"
38
38
+
CFLAGS_busybox="-Wl,--import-memory -Wl,--max-memory=4294967296 -Wl,--shared-memory -Wl,--export-table" "$@"
40
39
}
41
40
42
41
config() {
···
54
53
config NOMMU y
55
54
config STATIC_LIBGCC n
56
55
config CROSS_COMPILER_PREFIX llvm-
57
57
-
config SYSROOT ${musl}
58
58
-
config EXTRA_CFLAGS '-nostdlib -isystem ${musl}/include -I${linux.headers}/include ${lib.optionalString config.debug "-g"} -matomics -mbulk-memory'
59
59
-
config EXTRA_LDFLAGS ${compiler-rt}/libclang_rt.builtins-wasm32.a
56
56
+
config SYSROOT ${sysroot}
57
57
+
config EXTRA_CFLAGS '-I${linux.headers}/include ${lib.optionalString config.debug "-g"} -matomics -mbulk-memory'
60
58
config EXTRA_LDLIBS c
61
59
62
60
config BOOTCHARTD n
···
1
1
+
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
2
2
+
index 29133f9ee8..b8f18438c7 100644
3
3
+
--- a/lib/Basic/Targets.cpp
4
4
+
+++ b/lib/Basic/Targets.cpp
5
5
+
@@ -683,7 +683,7 @@
6
6
+
case llvm::Triple::wasm32:
7
7
+
if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
8
8
+
Triple.getVendor() != llvm::Triple::UnknownVendor ||
9
9
+
- !Triple.isOSBinFormatWasm())
10
10
+
+ (!Triple.isOSBinFormatWasm() && os != llvm::Triple::Linux))
11
11
+
return nullptr;
12
12
+
switch (os) {
13
13
+
case llvm::Triple::WASI:
14
14
+
@@ -692,6 +692,9 @@
15
15
+
case llvm::Triple::Emscripten:
16
16
+
return std::make_unique<EmscriptenTargetInfo<WebAssembly32TargetInfo>>(
17
17
+
Triple, Opts);
18
18
+
+ case llvm::Triple::Linux:
19
19
+
+ return std::make_unique<LinuxTargetInfo<WebAssembly32TargetInfo>>(Triple,
20
20
+
+ Opts);
21
21
+
case llvm::Triple::UnknownOS:
22
22
+
return std::make_unique<WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>>(
23
23
+
Triple, Opts);
24
24
+
@@ -701,7 +704,7 @@
25
25
+
case llvm::Triple::wasm64:
26
26
+
if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
27
27
+
Triple.getVendor() != llvm::Triple::UnknownVendor ||
28
28
+
- !Triple.isOSBinFormatWasm())
29
29
+
+ (!Triple.isOSBinFormatWasm() && os != llvm::Triple::Linux))
30
30
+
return nullptr;
31
31
+
switch (os) {
32
32
+
case llvm::Triple::WASI:
33
33
+
@@ -710,6 +713,9 @@
34
34
+
case llvm::Triple::Emscripten:
35
35
+
return std::make_unique<EmscriptenTargetInfo<WebAssembly64TargetInfo>>(
36
36
+
Triple, Opts);
37
37
+
+ case llvm::Triple::Linux:
38
38
+
+ return std::make_unique<LinuxTargetInfo<WebAssembly64TargetInfo>>(Triple,
39
39
+
+ Opts);
40
40
+
case llvm::Triple::UnknownOS:
41
41
+
return std::make_unique<WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>>(
42
42
+
Triple, Opts);
43
43
+
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
44
44
+
index f9dc8ab24f..2a06ff148b 100644
45
45
+
--- a/lib/Driver/Driver.cpp
46
46
+
+++ b/lib/Driver/Driver.cpp
47
47
+
@@ -6383,7 +6383,11 @@
48
48
+
break;
49
49
+
case llvm::Triple::Linux:
50
50
+
case llvm::Triple::ELFIAMCU:
51
51
+
- if (Target.getArch() == llvm::Triple::hexagon)
52
52
+
+ if ((Target.getArch() == llvm::Triple::wasm32 ||
53
53
+
+ Target.getArch() == llvm::Triple::wasm64) &&
54
54
+
+ Target.isOSBinFormatWasm())
55
55
+
+ TC = std::make_unique<toolchains::WebAssembly>(*this, Target, Args);
56
56
+
+ else if (Target.getArch() == llvm::Triple::hexagon)
57
57
+
TC = std::make_unique<toolchains::HexagonToolChain>(*this, Target,
58
58
+
Args);
59
59
+
else if ((Target.getVendor() == llvm::Triple::MipsTechnologies) &&
60
60
+
diff --git a/lib/Driver/ToolChains/WebAssembly.cpp b/lib/Driver/ToolChains/WebAssembly.cpp
61
61
+
index 60bd97e0ee..1eb59d1d3b 100644
62
62
+
--- a/lib/Driver/ToolChains/WebAssembly.cpp
63
63
+
+++ b/lib/Driver/ToolChains/WebAssembly.cpp
64
64
+
@@ -19,6 +19,7 @@
65
65
+
#include "llvm/Support/FileSystem.h"
66
66
+
#include "llvm/Support/Path.h"
67
67
+
#include "llvm/Support/VirtualFileSystem.h"
68
68
+
+#include <utility>
69
69
+
70
70
+
using namespace clang::driver;
71
71
+
using namespace clang::driver::tools;
72
72
+
@@ -98,38 +99,42 @@
73
73
+
const char *Crt1;
74
74
+
const char *Entry = nullptr;
75
75
+
76
76
+
- // When -shared is specified, use the reactor exec model unless
77
77
+
- // specified otherwise.
78
78
+
- if (Args.hasArg(options::OPT_shared))
79
79
+
- IsCommand = false;
80
80
+
-
81
81
+
- if (const Arg *A = Args.getLastArg(options::OPT_mexec_model_EQ)) {
82
82
+
- StringRef CM = A->getValue();
83
83
+
- if (CM == "command") {
84
84
+
- IsCommand = true;
85
85
+
- } else if (CM == "reactor") {
86
86
+
+ if (ToolChain.getTriple().isOSLinux()) {
87
87
+
+ Crt1 = "crt1.o";
88
88
+
+ } else {
89
89
+
+ // When -shared is specified, use the reactor exec model unless
90
90
+
+ // specified otherwise.
91
91
+
+ if (Args.hasArg(options::OPT_shared))
92
92
+
IsCommand = false;
93
93
+
+
94
94
+
+ if (const Arg *A = Args.getLastArg(options::OPT_mexec_model_EQ)) {
95
95
+
+ StringRef CM = A->getValue();
96
96
+
+ if (CM == "command") {
97
97
+
+ IsCommand = true;
98
98
+
+ } else if (CM == "reactor") {
99
99
+
+ IsCommand = false;
100
100
+
+ } else {
101
101
+
+ ToolChain.getDriver().Diag(diag::err_drv_invalid_argument_to_option)
102
102
+
+ << CM << A->getOption().getName();
103
103
+
+ }
104
104
+
+ }
105
105
+
+
106
106
+
+ if (IsCommand) {
107
107
+
+ // If crt1-command.o exists, it supports new-style commands, so use it.
108
108
+
+ // Otherwise, use the old crt1.o. This is a temporary transition measure.
109
109
+
+ // Once WASI libc no longer needs to support LLVM versions which lack
110
110
+
+ // support for new-style command, it can make crt1.o the same as
111
111
+
+ // crt1-command.o. And once LLVM no longer needs to support WASI libc
112
112
+
+ // versions before that, it can switch to using crt1-command.o.
113
113
+
+ Crt1 = "crt1.o";
114
114
+
+ if (ToolChain.GetFilePath("crt1-command.o") != "crt1-command.o")
115
115
+
+ Crt1 = "crt1-command.o";
116
116
+
} else {
117
117
+
- ToolChain.getDriver().Diag(diag::err_drv_invalid_argument_to_option)
118
118
+
- << CM << A->getOption().getName();
119
119
+
+ Crt1 = "crt1-reactor.o";
120
120
+
+ Entry = "_initialize";
121
121
+
}
122
122
+
}
123
123
+
124
124
+
- if (IsCommand) {
125
125
+
- // If crt1-command.o exists, it supports new-style commands, so use it.
126
126
+
- // Otherwise, use the old crt1.o. This is a temporary transition measure.
127
127
+
- // Once WASI libc no longer needs to support LLVM versions which lack
128
128
+
- // support for new-style command, it can make crt1.o the same as
129
129
+
- // crt1-command.o. And once LLVM no longer needs to support WASI libc
130
130
+
- // versions before that, it can switch to using crt1-command.o.
131
131
+
- Crt1 = "crt1.o";
132
132
+
- if (ToolChain.GetFilePath("crt1-command.o") != "crt1-command.o")
133
133
+
- Crt1 = "crt1-command.o";
134
134
+
- } else {
135
135
+
- Crt1 = "crt1-reactor.o";
136
136
+
- Entry = "_initialize";
137
137
+
- }
138
138
+
-
139
139
+
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
140
140
+
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(Crt1)));
141
141
+
if (Entry) {
142
142
+
@@ -235,8 +240,17 @@
143
143
+
// bitcode format is not stable.
144
144
+
auto Dir = AppendLTOLibDir(SysRoot + "/lib/" + MultiarchTriple);
145
145
+
getFilePaths().push_back(Dir);
146
146
+
+ if (getTriple().isOSLinux()) {
147
147
+
+ auto UsrDir = AppendLTOLibDir(SysRoot + "/usr/lib/" + MultiarchTriple);
148
148
+
+ getFilePaths().push_back(UsrDir);
149
149
+
+ }
150
150
+
}
151
151
+
getFilePaths().push_back(SysRoot + "/lib/" + MultiarchTriple);
152
152
+
+ if (getTriple().isOSLinux()) {
153
153
+
+ getFilePaths().push_back(SysRoot + "/usr/lib/" + MultiarchTriple);
154
154
+
+ getFilePaths().push_back(SysRoot + "/usr/lib");
155
155
+
+ }
156
156
+
+ getFilePaths().push_back(SysRoot + "/lib");
157
157
+
}
158
158
+
}
159
159
+
160
160
+
@@ -464,6 +478,8 @@
161
161
+
getDriver().Diag(diag::err_drv_invalid_stdlib_name)
162
162
+
<< A->getAsString(Args);
163
163
+
}
164
164
+
+ if (getTriple().isOSLinux())
165
165
+
+ return ToolChain::CST_Libstdcxx;
166
166
+
return ToolChain::CST_Libcxx;
167
167
+
}
168
168
+
169
169
+
@@ -474,10 +490,15 @@
170
170
+
171
171
+
const Driver &D = getDriver();
172
172
+
173
173
+
- if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
174
174
+
- SmallString<128> P(D.ResourceDir);
175
175
+
- llvm::sys::path::append(P, "include");
176
176
+
- addSystemInclude(DriverArgs, CC1Args, P);
177
177
+
+ const bool UseBuiltinIncludes =
178
178
+
+ !DriverArgs.hasArg(options::OPT_nobuiltininc);
179
179
+
+
180
180
+
+ SmallString<128> ResourceDirInclude(D.ResourceDir);
181
181
+
+ llvm::sys::path::append(ResourceDirInclude, "include");
182
182
+
+
183
183
+
+ if (UseBuiltinIncludes &&
184
184
+
+ (!getTriple().isMusl() || DriverArgs.hasArg(options::OPT_nostdlibinc))) {
185
185
+
+ addSystemInclude(DriverArgs, CC1Args, ResourceDirInclude);
186
186
+
}
187
187
+
188
188
+
if (DriverArgs.hasArg(options::OPT_nostdlibinc))
189
189
+
@@ -496,12 +517,24 @@
190
190
+
return;
191
191
+
}
192
192
+
193
193
+
- if (getTriple().getOS() != llvm::Triple::UnknownOS) {
194
194
+
- const std::string MultiarchTriple =
195
195
+
- getMultiarchTriple(D, getTriple(), D.SysRoot);
196
196
+
- addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include/" + MultiarchTriple);
197
197
+
- }
198
198
+
+ const bool IsKnownOs = getTriple().getOS() != llvm::Triple::UnknownOS;
199
199
+
+ std::string MultiarchTriple;
200
200
+
+ if (IsKnownOs)
201
201
+
+ MultiarchTriple = getMultiarchTriple(D, getTriple(), D.SysRoot);
202
202
+
+
203
203
+
+ if (IsKnownOs)
204
204
+
+ addSystemInclude(DriverArgs, CC1Args,
205
205
+
+ D.SysRoot + "/include/" + MultiarchTriple);
206
206
+
+ if (getTriple().isOSLinux() && IsKnownOs)
207
207
+
+ addSystemInclude(DriverArgs, CC1Args,
208
208
+
+ D.SysRoot + "/usr/include/" + MultiarchTriple);
209
209
+
+
210
210
+
addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include");
211
211
+
+ if (getTriple().isOSLinux())
212
212
+
+ addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include");
213
213
+
+
214
214
+
+ if (UseBuiltinIncludes && getTriple().isMusl())
215
215
+
+ addSystemInclude(DriverArgs, CC1Args, ResourceDirInclude);
216
216
+
}
217
217
+
218
218
+
void WebAssembly::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
219
219
+
@@ -557,12 +590,23 @@
220
220
+
llvm::opt::ArgStringList &CC1Args) const {
221
221
+
const Driver &D = getDriver();
222
222
+
std::string SysRoot = computeSysRoot();
223
223
+
- std::string LibPath = SysRoot + "/include";
224
224
+
+ auto MakeIncludeRoot = [&]() -> std::pair<std::string, std::string> {
225
225
+
+ std::string Primary = SysRoot + "/include";
226
226
+
+ if (getTriple().isOSLinux())
227
227
+
+ return {SysRoot + "/usr/include", Primary};
228
228
+
+ return {Primary, Primary};
229
229
+
+ };
230
230
+
+ auto [PrimaryInclude, SecondaryInclude] = MakeIncludeRoot();
231
231
+
+ std::string LibPath = PrimaryInclude;
232
232
+
const std::string MultiarchTriple =
233
233
+
getMultiarchTriple(D, getTriple(), SysRoot);
234
234
+
bool IsKnownOs = (getTriple().getOS() != llvm::Triple::UnknownOS);
235
235
+
236
236
+
std::string Version = detectLibcxxVersion(LibPath);
237
237
+
+ if (Version.empty() && PrimaryInclude != SecondaryInclude) {
238
238
+
+ LibPath = SecondaryInclude;
239
239
+
+ Version = detectLibcxxVersion(LibPath);
240
240
+
+ }
241
241
+
if (Version.empty())
242
242
+
return;
243
243
+
244
244
+
@@ -574,6 +618,11 @@
245
245
+
246
246
+
// Second add the generic one.
247
247
+
addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version);
248
248
+
+ if (PrimaryInclude != SecondaryInclude && LibPath != PrimaryInclude) {
249
249
+
+ addSystemInclude(DriverArgs, CC1Args,
250
250
+
+ PrimaryInclude + "/" + MultiarchTriple + "/c++/" + Version);
251
251
+
+ addSystemInclude(DriverArgs, CC1Args, PrimaryInclude + "/c++/" + Version);
252
252
+
+ }
253
253
+
}
254
254
+
255
255
+
void WebAssembly::addLibStdCXXIncludePaths(
256
256
+
@@ -585,7 +634,14 @@
257
257
+
// to how we do it for libc++.
258
258
+
const Driver &D = getDriver();
259
259
+
std::string SysRoot = computeSysRoot();
260
260
+
- std::string LibPath = SysRoot + "/include";
261
261
+
+ auto MakeIncludeRoot = [&]() -> std::pair<std::string, std::string> {
262
262
+
+ std::string Primary = SysRoot + "/include";
263
263
+
+ if (getTriple().isOSLinux())
264
264
+
+ return {SysRoot + "/usr/include", Primary};
265
265
+
+ return {Primary, Primary};
266
266
+
+ };
267
267
+
+ auto [PrimaryInclude, SecondaryInclude] = MakeIncludeRoot();
268
268
+
+ std::string LibPath = PrimaryInclude;
269
269
+
const std::string MultiarchTriple =
270
270
+
getMultiarchTriple(D, getTriple(), SysRoot);
271
271
+
bool IsKnownOs = (getTriple().getOS() != llvm::Triple::UnknownOS);
272
272
+
@@ -611,6 +667,29 @@
273
273
+
Version = MaxVersion.Text;
274
274
+
}
275
275
+
276
276
+
+ if (Version.empty() && PrimaryInclude != SecondaryInclude) {
277
277
+
+ LibPath = SecondaryInclude;
278
278
+
+ // repeat the search on the fallback location
279
279
+
+ {
280
280
+
+ std::error_code EC;
281
281
+
+ Generic_GCC::GCCVersion MaxVersion =
282
282
+
+ Generic_GCC::GCCVersion::Parse("0.0.0");
283
283
+
+ SmallString<128> Path(LibPath);
284
284
+
+ llvm::sys::path::append(Path, "c++");
285
285
+
+ for (llvm::vfs::directory_iterator LI = getVFS().dir_begin(Path, EC), LE;
286
286
+
+ !EC && LI != LE; LI = LI.increment(EC)) {
287
287
+
+ StringRef VersionText = llvm::sys::path::filename(LI->path());
288
288
+
+ if (VersionText[0] != 'v') {
289
289
+
+ auto ParsedVersion = Generic_GCC::GCCVersion::Parse(VersionText);
290
290
+
+ if (ParsedVersion > MaxVersion)
291
291
+
+ MaxVersion = ParsedVersion;
292
292
+
+ }
293
293
+
+ }
294
294
+
+ if (MaxVersion.Major > 0)
295
295
+
+ Version = MaxVersion.Text;
296
296
+
+ }
297
297
+
+ }
298
298
+
+
299
299
+
if (Version.empty())
300
300
+
return;
301
301
+
302
302
+
@@ -624,4 +703,15 @@
303
303
+
addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version);
304
304
+
// Third the backward one.
305
305
+
addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version + "/backward");
306
306
+
+
307
307
+
+ if (PrimaryInclude != SecondaryInclude && LibPath != PrimaryInclude) {
308
308
+
+ if (IsKnownOs) {
309
309
+
+ addSystemInclude(DriverArgs, CC1Args,
310
310
+
+ PrimaryInclude + "/c++/" + Version + "/" + MultiarchTriple);
311
311
+
+ }
312
312
+
+ addSystemInclude(DriverArgs, CC1Args,
313
313
+
+ PrimaryInclude + "/c++/" + Version);
314
314
+
+ addSystemInclude(DriverArgs, CC1Args,
315
315
+
+ PrimaryInclude + "/c++/" + Version + "/backward");
316
316
+
+ }
317
317
+
}
···
1
1
+
diff --git a/clang/tools/scan-build-py/tests/functional/exec/CMakeLists.txt b/clang/tools/scan-build-py/tests/functional/exec/CMakeLists.txt
2
2
+
index cb6ebda183..fbbd3a87e6 100644
3
3
+
--- a/clang/tools/scan-build-py/tests/functional/exec/CMakeLists.txt
4
4
+
+++ b/clang/tools/scan-build-py/tests/functional/exec/CMakeLists.txt
5
5
+
@@ -21,6 +21,7 @@
6
6
+
check_function_exists(execle HAVE_EXECLE)
7
7
+
check_function_exists(posix_spawn HAVE_POSIX_SPAWN)
8
8
+
check_function_exists(posix_spawnp HAVE_POSIX_SPAWNP)
9
9
+
+check_function_exists(fork HAVE_FORK)
10
10
+
11
11
+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
12
12
+
include_directories(${CMAKE_CURRENT_BINARY_DIR})
13
13
+
diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake
14
14
+
index 5ca580fbb5..4a299ef90e 100644
15
15
+
--- a/llvm/cmake/modules/HandleLLVMOptions.cmake
16
16
+
+++ b/llvm/cmake/modules/HandleLLVMOptions.cmake
17
17
+
@@ -212,7 +212,7 @@
18
18
+
elseif(FUCHSIA OR UNIX)
19
19
+
set(LLVM_ON_WIN32 0)
20
20
+
set(LLVM_ON_UNIX 1)
21
21
+
- if(APPLE OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
22
22
+
+ if(APPLE OR WASM OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
23
23
+
set(LLVM_HAVE_LINK_VERSION_SCRIPT 0)
24
24
+
else()
25
25
+
set(LLVM_HAVE_LINK_VERSION_SCRIPT 1)
26
26
+
diff --git a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
27
27
+
index bba3329e8c..591cce29cc 100644
28
28
+
--- a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
29
29
+
+++ b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
30
30
+
@@ -9,20 +9,32 @@
31
31
+
#include "llvm/ExecutionEngine/Orc/MemoryMapper.h"
32
32
+
33
33
+
#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
34
34
+
+#include "llvm/Config/config.h"
35
35
+
#include "llvm/Support/WindowsError.h"
36
36
+
37
37
+
#include <algorithm>
38
38
+
39
39
+
#if defined(LLVM_ON_UNIX) && !defined(__ANDROID__)
40
40
+
#include <fcntl.h>
41
41
+
+#if defined(HAVE_SYS_MMAN_H)
42
42
+
#include <sys/mman.h>
43
43
+
+#endif
44
44
+
#if defined(__MVS__)
45
45
+
#include "llvm/Support/BLAKE3.h"
46
46
+
#include <sys/shm.h>
47
47
+
#endif
48
48
+
#include <unistd.h>
49
49
+
+#if defined(HAVE_SYS_MMAN_H) && defined(MAP_SHARED) && defined(PROT_READ) && \
50
50
+
+ defined(PROT_WRITE) && defined(PROT_EXEC)
51
51
+
+#define LLVM_SUPPORTS_POSIX_MMAP 1
52
52
+
+#else
53
53
+
+#define LLVM_SUPPORTS_POSIX_MMAP 0
54
54
+
+#endif
55
55
+
#elif defined(_WIN32)
56
56
+
#include <windows.h>
57
57
+
+#define LLVM_SUPPORTS_POSIX_MMAP 0
58
58
+
+#else
59
59
+
+#define LLVM_SUPPORTS_POSIX_MMAP 0
60
60
+
#endif
61
61
+
62
62
+
namespace llvm {
63
63
+
@@ -195,16 +207,21 @@
64
64
+
// SharedMemoryMapper
65
65
+
66
66
+
SharedMemoryMapper::SharedMemoryMapper(ExecutorProcessControl &EPC,
67
67
+
- SymbolAddrs SAs, size_t PageSize)
68
68
+
+ SymbolAddrs SAs, size_t PageSize)
69
69
+
: EPC(EPC), SAs(SAs), PageSize(PageSize) {
70
70
+
-#if (!defined(LLVM_ON_UNIX) || defined(__ANDROID__)) && !defined(_WIN32)
71
71
+
+#if !defined(_WIN32) && \
72
72
+
+ !(defined(LLVM_ON_UNIX) && !defined(__ANDROID__) && \
73
73
+
+ (defined(__MVS__) || LLVM_SUPPORTS_POSIX_MMAP))
74
74
+
llvm_unreachable("SharedMemoryMapper is not supported on this platform yet");
75
75
+
#endif
76
76
+
}
77
77
+
78
78
+
+
79
79
+
Expected<std::unique_ptr<SharedMemoryMapper>>
80
80
+
SharedMemoryMapper::Create(ExecutorProcessControl &EPC, SymbolAddrs SAs) {
81
81
+
-#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__)) || defined(_WIN32)
82
82
+
+#if defined(_WIN32) || \
83
83
+
+ (defined(LLVM_ON_UNIX) && !defined(__ANDROID__) && \
84
84
+
+ (defined(__MVS__) || LLVM_SUPPORTS_POSIX_MMAP))
85
85
+
auto PageSize = sys::Process::getPageSize();
86
86
+
if (!PageSize)
87
87
+
return PageSize.takeError();
88
88
+
@@ -218,10 +235,13 @@
89
89
+
}
90
90
+
91
91
+
void SharedMemoryMapper::reserve(size_t NumBytes,
92
92
+
- OnReservedFunction OnReserved) {
93
93
+
-#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__)) || defined(_WIN32)
94
94
+
+ OnReservedFunction OnReserved) {
95
95
+
+#if defined(_WIN32) || \
96
96
+
+ (defined(LLVM_ON_UNIX) && !defined(__ANDROID__) && \
97
97
+
+ (defined(__MVS__) || LLVM_SUPPORTS_POSIX_MMAP))
98
98
+
99
99
+
EPC.callSPSWrapperAsync<
100
100
+
+
101
101
+
rt::SPSExecutorSharedMemoryMapperServiceReserveSignature>(
102
102
+
SAs.Reserve,
103
103
+
[this, NumBytes, OnReserved = std::move(OnReserved)](
104
104
+
@@ -260,8 +280,9 @@
105
105
+
return OnReserved(errorCodeToError(
106
106
+
std::error_code(errno, std::generic_category())));
107
107
+
}
108
108
+
-#else
109
109
+
- int SharedMemoryFile = shm_open(SharedMemoryName.c_str(), O_RDWR, 0700);
110
110
+
+#elif LLVM_SUPPORTS_POSIX_MMAP
111
111
+
+ int SharedMemoryFile =
112
112
+
+ shm_open(SharedMemoryName.c_str(), O_RDWR, 0700);
113
113
+
if (SharedMemoryFile < 0) {
114
114
+
return OnReserved(errorCodeToError(errnoAsErrorCode()));
115
115
+
}
116
116
+
@@ -276,8 +297,13 @@
117
117
+
}
118
118
+
119
119
+
close(SharedMemoryFile);
120
120
+
+#else
121
121
+
+ return OnReserved(make_error<StringError>(
122
122
+
+ "SharedMemoryMapper requires POSIX mmap support on this platform",
123
123
+
+ inconvertibleErrorCode()));
124
124
+
#endif
125
125
+
126
126
+
+
127
127
+
#elif defined(_WIN32)
128
128
+
129
129
+
std::wstring WideSharedMemoryName(SharedMemoryName.begin(),
130
130
+
@@ -306,6 +332,10 @@
131
131
+
},
132
132
+
SAs.Instance, static_cast<uint64_t>(NumBytes));
133
133
+
134
134
+
+#elif defined(LLVM_ON_UNIX) && !defined(__ANDROID__)
135
135
+
+ OnReserved(make_error<StringError>(
136
136
+
+ "SharedMemoryMapper requires POSIX mmap support on this platform",
137
137
+
+ inconvertibleErrorCode()));
138
138
+
#else
139
139
+
OnReserved(make_error<StringError>(
140
140
+
"SharedMemoryMapper is not supported on this platform yet",
141
141
+
@@ -385,10 +415,13 @@
142
142
+
}
143
143
+
144
144
+
void SharedMemoryMapper::release(ArrayRef<ExecutorAddr> Bases,
145
145
+
- OnReleasedFunction OnReleased) {
146
146
+
-#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__)) || defined(_WIN32)
147
147
+
+ OnReleasedFunction OnReleased) {
148
148
+
+#if defined(_WIN32) || \
149
149
+
+ (defined(LLVM_ON_UNIX) && !defined(__ANDROID__) && \
150
150
+
+ (defined(__MVS__) || LLVM_SUPPORTS_POSIX_MMAP))
151
151
+
Error Err = Error::success();
152
152
+
153
153
+
+
154
154
+
{
155
155
+
std::lock_guard<std::mutex> Lock(Mutex);
156
156
+
157
157
+
@@ -399,9 +432,15 @@
158
158
+
#if defined(__MVS__)
159
159
+
if (shmdt(Reservations[Base].LocalAddr) < 0)
160
160
+
Err = joinErrors(std::move(Err), errorCodeToError(errnoAsErrorCode()));
161
161
+
-#else
162
162
+
+#elif LLVM_SUPPORTS_POSIX_MMAP
163
163
+
if (munmap(Reservations[Base].LocalAddr, Reservations[Base].Size) != 0)
164
164
+
Err = joinErrors(std::move(Err), errorCodeToError(errnoAsErrorCode()));
165
165
+
+#else
166
166
+
+ Err = joinErrors(
167
167
+
+ std::move(Err),
168
168
+
+ make_error<StringError>(
169
169
+
+ "SharedMemoryMapper requires POSIX mmap support on this platform",
170
170
+
+ inconvertibleErrorCode()));
171
171
+
#endif
172
172
+
173
173
+
#elif defined(_WIN32)
174
174
+
@@ -430,6 +469,10 @@
175
175
+
return OnReleased(joinErrors(std::move(Err), std::move(Result)));
176
176
+
},
177
177
+
SAs.Instance, Bases);
178
178
+
+#elif defined(LLVM_ON_UNIX) && !defined(__ANDROID__)
179
179
+
+ OnReleased(make_error<StringError>(
180
180
+
+ "SharedMemoryMapper requires POSIX mmap support on this platform",
181
181
+
+ inconvertibleErrorCode()));
182
182
+
#else
183
183
+
OnReleased(make_error<StringError>(
184
184
+
"SharedMemoryMapper is not supported on this platform yet",
185
185
+
@@ -445,8 +488,10 @@
186
186
+
187
187
+
#if defined(__MVS__)
188
188
+
shmdt(R.second.LocalAddr);
189
189
+
-#else
190
190
+
+#elif LLVM_SUPPORTS_POSIX_MMAP
191
191
+
munmap(R.second.LocalAddr, R.second.Size);
192
192
+
+#else
193
193
+
+ (void)R;
194
194
+
#endif
195
195
+
196
196
+
#elif defined(_WIN32)
197
197
+
diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp
198
198
+
index f5118c0f2b..2695cfbbd8 100644
199
199
+
--- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp
200
200
+
+++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp
201
201
+
@@ -9,6 +9,7 @@
202
202
+
#include "llvm/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.h"
203
203
+
204
204
+
#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
205
205
+
+#include "llvm/Config/config.h"
206
206
+
#include "llvm/Support/Process.h"
207
207
+
#include "llvm/Support/WindowsError.h"
208
208
+
209
209
+
@@ -17,12 +18,22 @@
210
210
+
#if defined(LLVM_ON_UNIX)
211
211
+
#include <errno.h>
212
212
+
#include <fcntl.h>
213
213
+
+#ifdef HAVE_SYS_MMAN_H
214
214
+
#include <sys/mman.h>
215
215
+
+#endif
216
216
+
#if defined(__MVS__)
217
217
+
#include "llvm/Support/BLAKE3.h"
218
218
+
#include <sys/shm.h>
219
219
+
#endif
220
220
+
#include <unistd.h>
221
221
+
+#if defined(HAVE_SYS_MMAN_H) && defined(MAP_SHARED) && defined(PROT_NONE) && \
222
222
+
+ defined(PROT_READ) && defined(PROT_WRITE) && defined(PROT_EXEC)
223
223
+
+#define LLVM_SUPPORTS_POSIX_MMAP 1
224
224
+
+#else
225
225
+
+#define LLVM_SUPPORTS_POSIX_MMAP 0
226
226
+
+#endif
227
227
+
+#else
228
228
+
+#define LLVM_SUPPORTS_POSIX_MMAP 0
229
229
+
#endif
230
230
+
231
231
+
namespace llvm {
232
232
+
@@ -51,7 +62,8 @@
233
233
+
234
234
+
Expected<std::pair<ExecutorAddr, std::string>>
235
235
+
ExecutorSharedMemoryMapperService::reserve(uint64_t Size) {
236
236
+
-#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__)) || defined(_WIN32)
237
237
+
+#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__) && LLVM_SUPPORTS_POSIX_MMAP) || \
238
238
+
+ defined(_WIN32)
239
239
+
240
240
+
#if defined(LLVM_ON_UNIX)
241
241
+
242
242
+
@@ -131,6 +143,10 @@
243
243
+
244
244
+
return std::make_pair(ExecutorAddr::fromPtr(Addr),
245
245
+
std::move(SharedMemoryName));
246
246
+
+#elif defined(LLVM_ON_UNIX) && !defined(__ANDROID__)
247
247
+
+ return make_error<StringError>(
248
248
+
+ "SharedMemoryMapper requires POSIX mmap support on this platform",
249
249
+
+ inconvertibleErrorCode());
250
250
+
#else
251
251
+
return make_error<StringError>(
252
252
+
"SharedMemoryMapper is not supported on this platform yet",
253
253
+
@@ -140,7 +156,8 @@
254
254
+
255
255
+
Expected<ExecutorAddr> ExecutorSharedMemoryMapperService::initialize(
256
256
+
ExecutorAddr Reservation, tpctypes::SharedMemoryFinalizeRequest &FR) {
257
257
+
-#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__)) || defined(_WIN32)
258
258
+
+#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__) && LLVM_SUPPORTS_POSIX_MMAP) || \
259
259
+
+ defined(_WIN32)
260
260
+
261
261
+
ExecutorAddr MinAddr(~0ULL);
262
262
+
263
263
+
@@ -196,6 +213,10 @@
264
264
+
265
265
+
return MinAddr;
266
266
+
267
267
+
+#elif defined(LLVM_ON_UNIX) && !defined(__ANDROID__)
268
268
+
+ return make_error<StringError>(
269
269
+
+ "SharedMemoryMapper requires POSIX mmap support on this platform",
270
270
+
+ inconvertibleErrorCode());
271
271
+
#else
272
272
+
return make_error<StringError>(
273
273
+
"SharedMemoryMapper is not supported on this platform yet",
274
274
+
@@ -234,7 +255,8 @@
275
275
+
276
276
+
Error ExecutorSharedMemoryMapperService::release(
277
277
+
const std::vector<ExecutorAddr> &Bases) {
278
278
+
-#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__)) || defined(_WIN32)
279
279
+
+#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__) && LLVM_SUPPORTS_POSIX_MMAP) || \
280
280
+
+ defined(_WIN32)
281
281
+
Error Err = Error::success();
282
282
+
283
283
+
for (auto Base : Bases) {
284
284
+
@@ -289,6 +311,10 @@
285
285
+
}
286
286
+
287
287
+
return Err;
288
288
+
+#elif defined(LLVM_ON_UNIX) && !defined(__ANDROID__)
289
289
+
+ return make_error<StringError>(
290
290
+
+ "SharedMemoryMapper requires POSIX mmap support on this platform",
291
291
+
+ inconvertibleErrorCode());
292
292
+
#else
293
293
+
return make_error<StringError>(
294
294
+
"SharedMemoryMapper is not supported on this platform yet",
295
295
+
diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/JITLoaderPerf.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/JITLoaderPerf.cpp
296
296
+
index f7852b0ca6..d6bea8c977 100644
297
297
+
--- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/JITLoaderPerf.cpp
298
298
+
+++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/JITLoaderPerf.cpp
299
299
+
@@ -14,6 +14,7 @@
300
300
+
301
301
+
#include "llvm/ExecutionEngine/Orc/Shared/PerfSharedStructs.h"
302
302
+
303
303
+
+#include "llvm/Config/config.h"
304
304
+
#include "llvm/Support/FileSystem.h"
305
305
+
#include "llvm/Support/MemoryBuffer.h"
306
306
+
#include "llvm/Support/Path.h"
307
307
+
@@ -23,12 +24,25 @@
308
308
+
#include <mutex>
309
309
+
#include <optional>
310
310
+
311
311
+
-#ifdef __linux__
312
312
+
+#if defined(__linux__)
313
313
+
314
314
+
+#ifdef HAVE_SYS_MMAN_H
315
315
+
#include <sys/mman.h> // mmap()
316
316
+
+#endif
317
317
+
#include <time.h> // clock_gettime(), time(), localtime_r() */
318
318
+
#include <unistd.h> // for read(), close()
319
319
+
320
320
+
+#if defined(HAVE_SYS_MMAN_H) && defined(MAP_PRIVATE) && defined(PROT_READ) && \
321
321
+
+ defined(PROT_WRITE) && defined(PROT_EXEC) && defined(PROT_NONE)
322
322
+
+#define LLVM_SUPPORTS_POSIX_MMAP 1
323
323
+
+#else
324
324
+
+#define LLVM_SUPPORTS_POSIX_MMAP 0
325
325
+
+#endif
326
326
+
+
327
327
+
+#endif
328
328
+
+
329
329
+
+#if defined(__linux__) && LLVM_SUPPORTS_POSIX_MMAP
330
330
+
+
331
331
+
#define DEBUG_TYPE "orc"
332
332
+
333
333
+
// language identifier (XXX: should we generate something better from debug
334
334
+
@@ -420,6 +434,42 @@
335
335
+
.release();
336
336
+
}
337
337
+
338
338
+
+#elif defined(__linux__)
339
339
+
+
340
340
+
+using namespace llvm;
341
341
+
+using namespace llvm::orc;
342
342
+
+
343
343
+
+static Error missingMMap() {
344
344
+
+ using namespace llvm;
345
345
+
+ return llvm::make_error<StringError>(
346
346
+
+ "perf JIT support requires POSIX mmap on this platform",
347
347
+
+ inconvertibleErrorCode());
348
348
+
+}
349
349
+
+
350
350
+
+static Error missingMMapBatch(PerfJITRecordBatch &Batch) {
351
351
+
+ return missingMMap();
352
352
+
+}
353
353
+
+
354
354
+
+extern "C" llvm::orc::shared::CWrapperFunctionResult
355
355
+
+llvm_orc_registerJITLoaderPerfImpl(const char *Data, uint64_t Size) {
356
356
+
+ using namespace shared;
357
357
+
+ return WrapperFunction<SPSError(SPSPerfJITRecordBatch)>::handle(
358
358
+
+ Data, Size, missingMMapBatch)
359
359
+
+ .release();
360
360
+
+}
361
361
+
+
362
362
+
+extern "C" llvm::orc::shared::CWrapperFunctionResult
363
363
+
+llvm_orc_registerJITLoaderPerfStart(const char *Data, uint64_t Size) {
364
364
+
+ using namespace shared;
365
365
+
+ return WrapperFunction<SPSError()>::handle(Data, Size, missingMMap).release();
366
366
+
+}
367
367
+
+
368
368
+
+extern "C" llvm::orc::shared::CWrapperFunctionResult
369
369
+
+llvm_orc_registerJITLoaderPerfEnd(const char *Data, uint64_t Size) {
370
370
+
+ using namespace shared;
371
371
+
+ return WrapperFunction<SPSError()>::handle(Data, Size, missingMMap).release();
372
372
+
+}
373
373
+
+
374
374
+
#else
375
375
+
376
376
+
using namespace llvm;
377
377
+
diff --git a/llvm/lib/Support/Unix/Memory.inc b/llvm/lib/Support/Unix/Memory.inc
378
378
+
index bac208a7d5..571e777009 100644
379
379
+
--- a/llvm/lib/Support/Unix/Memory.inc
380
380
+
+++ b/llvm/lib/Support/Unix/Memory.inc
381
381
+
@@ -18,10 +18,19 @@
382
382
+
#include "llvm/Support/Process.h"
383
383
+
#include "llvm/Support/Valgrind.h"
384
384
+
385
385
+
+#include <system_error>
386
386
+
+
387
387
+
#ifdef HAVE_SYS_MMAN_H
388
388
+
#include <sys/mman.h>
389
389
+
#endif
390
390
+
391
391
+
+#if defined(HAVE_SYS_MMAN_H) && defined(MAP_PRIVATE) && defined(PROT_READ) && \
392
392
+
+ defined(PROT_WRITE) && defined(PROT_EXEC) && defined(PROT_NONE)
393
393
+
+#define LLVM_SUPPORTS_POSIX_MMAP 1
394
394
+
+#else
395
395
+
+#define LLVM_SUPPORTS_POSIX_MMAP 0
396
396
+
+#endif
397
397
+
+
398
398
+
#ifdef __APPLE__
399
399
+
#include <mach/mach.h>
400
400
+
#endif
401
401
+
@@ -36,6 +45,7 @@
402
402
+
extern "C" void __clear_cache(void *, void *);
403
403
+
#endif
404
404
+
405
405
+
+#if LLVM_SUPPORTS_POSIX_MMAP
406
406
+
static int getPosixProtectionFlags(unsigned Flags) {
407
407
+
switch (Flags & llvm::sys::Memory::MF_RWE_MASK) {
408
408
+
case llvm::sys::Memory::MF_READ:
409
409
+
@@ -66,6 +76,7 @@
410
410
+
// Provide a default return value as required by some compilers.
411
411
+
return PROT_NONE;
412
412
+
}
413
413
+
+#endif
414
414
+
415
415
+
namespace llvm {
416
416
+
namespace sys {
417
417
+
@@ -77,6 +88,11 @@
418
418
+
if (NumBytes == 0)
419
419
+
return MemoryBlock();
420
420
+
421
421
+
+#if !LLVM_SUPPORTS_POSIX_MMAP
422
422
+
+ (void)NearBlock;
423
423
+
+ EC = std::make_error_code(std::errc::function_not_supported);
424
424
+
+ return MemoryBlock();
425
425
+
+#else
426
426
+
// On platforms that have it, we can use MAP_ANON to get a memory-mapped
427
427
+
// page without file backing, but we need a fallback of opening /dev/zero
428
428
+
// for strictly POSIX platforms instead.
429
429
+
@@ -146,12 +162,16 @@
430
430
+
}
431
431
+
432
432
+
return Result;
433
433
+
+#endif
434
434
+
}
435
435
+
436
436
+
std::error_code Memory::releaseMappedMemory(MemoryBlock &M) {
437
437
+
if (M.Address == nullptr || M.AllocatedSize == 0)
438
438
+
return std::error_code();
439
439
+
440
440
+
+#if !LLVM_SUPPORTS_POSIX_MMAP
441
441
+
+ return std::make_error_code(std::errc::function_not_supported);
442
442
+
+#else
443
443
+
if (0 != ::munmap(M.Address, M.AllocatedSize))
444
444
+
return errnoAsErrorCode();
445
445
+
446
446
+
@@ -159,6 +179,7 @@
447
447
+
M.AllocatedSize = 0;
448
448
+
449
449
+
return std::error_code();
450
450
+
+#endif
451
451
+
}
452
452
+
453
453
+
std::error_code Memory::protectMappedMemory(const MemoryBlock &M,
454
454
+
@@ -167,6 +188,10 @@
455
455
+
if (M.Address == nullptr || M.AllocatedSize == 0)
456
456
+
return std::error_code();
457
457
+
458
458
+
+#if !LLVM_SUPPORTS_POSIX_MMAP
459
459
+
+ (void)Flags;
460
460
+
+ return std::make_error_code(std::errc::function_not_supported);
461
461
+
+#else
462
462
+
if (!Flags)
463
463
+
return std::error_code(EINVAL, std::generic_category());
464
464
+
465
465
+
@@ -202,6 +227,7 @@
466
466
+
Memory::InvalidateInstructionCache(M.Address, M.AllocatedSize);
467
467
+
468
468
+
return std::error_code();
469
469
+
+#endif
470
470
+
}
471
471
+
472
472
+
/// InvalidateInstructionCache - Before the JIT can run a block of code
473
473
+
diff --git a/llvm/lib/Support/Unix/Path.inc b/llvm/lib/Support/Unix/Path.inc
474
474
+
index cf05db546e..4a806086a3 100644
475
475
+
--- a/llvm/lib/Support/Unix/Path.inc
476
476
+
+++ b/llvm/lib/Support/Unix/Path.inc
477
477
+
@@ -831,6 +831,13 @@
478
478
+
mapmode Mode) {
479
479
+
assert(Size != 0);
480
480
+
481
481
+
+#if !defined(MAP_SHARED) || !defined(MAP_PRIVATE) || !defined(PROT_READ) || \
482
482
+
+ !defined(PROT_WRITE)
483
483
+
+ (void)FD;
484
484
+
+ (void)Offset;
485
485
+
+ (void)Mode;
486
486
+
+ return make_error_code(errc::function_not_supported);
487
487
+
+#else
488
488
+
int flags = (Mode == readwrite) ? MAP_SHARED : MAP_PRIVATE;
489
489
+
int prot = (Mode == readonly) ? PROT_READ : (PROT_READ | PROT_WRITE);
490
490
+
#if defined(MAP_NORESERVE)
491
491
+
@@ -860,6 +867,7 @@
492
492
+
if (Mapping == MAP_FAILED)
493
493
+
return errnoAsErrorCode();
494
494
+
return std::error_code();
495
495
+
+#endif
496
496
+
}
497
497
+
498
498
+
mapped_file_region::mapped_file_region(int fd, mapmode mode, size_t length,
499
499
+
@@ -872,14 +880,24 @@
500
500
+
}
501
501
+
502
502
+
void mapped_file_region::unmapImpl() {
503
503
+
+#if !defined(MAP_SHARED) || !defined(MAP_PRIVATE) || !defined(PROT_READ) || \
504
504
+
+ !defined(PROT_WRITE)
505
505
+
+ (void)Mapping;
506
506
+
+ (void)Size;
507
507
+
+#else
508
508
+
if (Mapping)
509
509
+
::munmap(Mapping, Size);
510
510
+
+#endif
511
511
+
}
512
512
+
513
513
+
void mapped_file_region::dontNeedImpl() {
514
514
+
assert(Mode == mapped_file_region::readonly);
515
515
+
if (!Mapping)
516
516
+
return;
517
517
+
+#if !defined(POSIX_MADV_DONTNEED) && !defined(MADV_DONTNEED)
518
518
+
+ (void)Size;
519
519
+
+ return;
520
520
+
+#else
521
521
+
#if defined(__MVS__) || defined(_AIX)
522
522
+
// If we don't have madvise, or it isn't beneficial, treat this as a no-op.
523
523
+
#elif defined(POSIX_MADV_DONTNEED)
524
524
+
@@ -887,6 +905,7 @@
525
525
+
#else
526
526
+
::madvise(Mapping, Size, MADV_DONTNEED);
527
527
+
#endif
528
528
+
+#endif
529
529
+
}
530
530
+
531
531
+
int mapped_file_region::alignment() { return Process::getPageSizeEstimate(); }
532
532
+
diff --git a/llvm/lib/Support/Unix/Program.inc b/llvm/lib/Support/Unix/Program.inc
533
533
+
index 2742734bb1..3ea4758130 100644
534
534
+
--- a/llvm/lib/Support/Unix/Program.inc
535
535
+
+++ b/llvm/lib/Support/Unix/Program.inc
536
536
+
@@ -274,6 +274,17 @@
537
537
+
}
538
538
+
#endif // HAVE_POSIX_SPAWN
539
539
+
540
540
+
+#if !defined(HAVE_FORK)
541
541
+
+ (void)Args;
542
542
+
+ (void)Redirects;
543
543
+
+ (void)MemoryLimit;
544
544
+
+ (void)PI;
545
545
+
+ (void)Env;
546
546
+
+ (void)DetachProcess;
547
547
+
+ if (ErrMsg)
548
548
+
+ *ErrMsg = "fork is not available on this target";
549
549
+
+ return false;
550
550
+
+#else
551
551
+
// Create a child process.
552
552
+
int child = fork();
553
553
+
switch (child) {
554
554
+
@@ -347,6 +358,7 @@
555
555
+
PI.Process = child;
556
556
+
557
557
+
return true;
558
558
+
+#endif
559
559
+
}
560
560
+
561
561
+
namespace llvm {
562
562
+
diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp
563
563
+
index 25f43a4bb6..d6ad7f5229 100644
564
564
+
--- a/llvm/tools/lli/lli.cpp
565
565
+
+++ b/llvm/tools/lli/lli.cpp
566
566
+
@@ -1206,7 +1206,7 @@
567
567
+
}
568
568
+
569
569
+
Expected<std::unique_ptr<orc::ExecutorProcessControl>> launchRemote() {
570
570
+
-#ifndef LLVM_ON_UNIX
571
571
+
+#if !defined(LLVM_ON_UNIX) || defined(__wasm__)
572
572
+
llvm_unreachable("launchRemote not supported on non-Unix platforms");
573
573
+
#else
574
574
+
int PipeFD[2][2];
575
575
+
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
576
576
+
index bff05b9ca4..4bb40e1a8e 100644
577
577
+
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
578
578
+
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
579
579
+
@@ -737,7 +737,7 @@
580
580
+
}
581
581
+
582
582
+
static Expected<std::unique_ptr<ExecutorProcessControl>> launchExecutor() {
583
583
+
-#ifndef LLVM_ON_UNIX
584
584
+
+#if !defined(LLVM_ON_UNIX) || defined(__wasm__)
585
585
+
// FIXME: Add support for Windows.
586
586
+
return make_error<StringError>("-" + OutOfProcessExecutor.ArgStr +
587
587
+
" not supported on non-unix platforms",
···
1
1
+
{
2
2
+
fetch,
3
3
+
run,
4
4
+
5
5
+
clang,
6
6
+
clang-tblgen,
7
7
+
cmake,
8
8
+
lld,
9
9
+
llvm,
10
10
+
sysroot,
11
11
+
ninja,
12
12
+
python3,
13
13
+
}:
14
14
+
15
15
+
run
16
16
+
rec {
17
17
+
name = "clang";
18
18
+
# renovate: datasource=github-releases name=llvm/llvm-project
19
19
+
version = "19.1.7";
20
20
+
src = fetch.tar {
21
21
+
url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-${version}/llvm-project-${version}.src.tar.xz";
22
22
+
hash = "sha256-gkAf6nt50AeAQ/dZi4NShNZlCnW5PmS292Hqe2MJdQE=";
23
23
+
};
24
24
+
path = [
25
25
+
clang
26
26
+
clang-tblgen
27
27
+
cmake
28
28
+
lld
29
29
+
llvm
30
30
+
ninja
31
31
+
python3
32
32
+
];
33
33
+
}
34
34
+
''
35
35
+
(cd clang && patch -p1 <${./clang-add-wasm-linux-target.patch})
36
36
+
patch -p1 <${./llvm-remove-mmap-fork.patch}
37
37
+
38
38
+
cmake -S llvm -B build -G Ninja \
39
39
+
-DWASM=ON \
40
40
+
-DCMAKE_BUILD_TYPE=Release \
41
41
+
-DCMAKE_C_COMPILER_TARGET=wasm32-unknown-linux-musl \
42
42
+
-DCMAKE_C_COMPILER_WORKS=ON \
43
43
+
-DCMAKE_C_FLAGS="--sysroot=${sysroot}" \
44
44
+
-DCMAKE_CXX_COMPILER_TARGET=wasm32-unknown-linux-musl \
45
45
+
-DCMAKE_CXX_COMPILER_WORKS=ON \
46
46
+
-DCMAKE_CXX_FLAGS="--sysroot=${sysroot} -stdlib=libc++" \
47
47
+
-DCMAKE_INSTALL_PREFIX=$out \
48
48
+
-DCMAKE_BUILD_WITH_INSTALL_RPATH=OFF \
49
49
+
-DCMAKE_SKIP_BUILD_RPATH=ON \
50
50
+
-DCMAKE_SKIP_INSTALL_RPATH=ON \
51
51
+
-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \
52
52
+
-DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld --sysroot=${sysroot} -Wl,--allow-undefined" \
53
53
+
-DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld --sysroot=${sysroot} -Wl,--allow-undefined" \
54
54
+
-DCMAKE_SYSROOT=${sysroot} \
55
55
+
-DDEFAULT_SYSROOT=${sysroot} \
56
56
+
-DLLVM_ENABLE_PROJECTS=clang \
57
57
+
-DLLVM_ENABLE_LIBCXX=ON \
58
58
+
-DBUILD_SHARED_LIBS=OFF \
59
59
+
-DLLVM_BUILD_LLVM_DYLIB=OFF \
60
60
+
-DLLVM_LINK_LLVM_DYLIB=OFF \
61
61
+
-DCLANG_LINK_CLANG_DYLIB=OFF \
62
62
+
-DLIBCLANG_BUILD_STATIC=ON \
63
63
+
-DLLVM_ENABLE_PIC=OFF \
64
64
+
-DLLVM_ENABLE_RUNTIMES="" \
65
65
+
-DLLVM_INCLUDE_BENCHMARKS=OFF \
66
66
+
-DLLVM_INCLUDE_TESTS=OFF \
67
67
+
-DLLVM_INCLUDE_DOCS=OFF \
68
68
+
-DLLVM_BUILD_UTILS=OFF \
69
69
+
-DLLVM_TOOL_LLVM_EXEGESIS_BUILD=OFF \
70
70
+
-DCLANG_INCLUDE_TESTS=OFF \
71
71
+
-DCLANG_INCLUDE_DOCS=OFF \
72
72
+
-DCLANG_TABLEGEN=${clang-tblgen}/bin/clang-tblgen \
73
73
+
-DCLANG_TABLEGEN_EXE=${clang-tblgen}/bin/clang-tblgen \
74
74
+
-DLLVM_TABLEGEN=${llvm}/bin/llvm-tblgen \
75
75
+
-DLLVM_TABLEGEN_EXE=${llvm}/bin/llvm-tblgen \
76
76
+
-DLLVM_NATIVE_TOOL_DIR=${llvm}/bin \
77
77
+
-DLLVM_HOST_TRIPLE=wasm32-unknown-linux-musl \
78
78
+
-DLLVM_TARGET_ARCH=wasm32 \
79
79
+
-DLLVM_TARGETS_TO_BUILD="WebAssembly" \
80
80
+
-DLLVM_USE_LINKER=lld
81
81
+
82
82
+
cmake --build build --target install -j$NIX_BUILD_CORES
83
83
+
ln -s $out/bin/clang $out/bin/cc
84
84
+
ln -s $out/bin/clang++ $out/bin/c++
85
85
+
''
···
3
3
run,
4
4
config,
5
5
6
6
-
clang,
6
6
+
clang-no-compiler-rt,
7
7
cmake,
8
8
lld,
9
9
llvm,
···
16
16
rec {
17
17
name = "compiler-rt";
18
18
# renovate: datasource=github-releases name=llvm/llvm-project
19
19
-
version = "19.1.6";
19
19
+
version = "19.1.7";
20
20
src = fetch.tar {
21
21
url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-${version}/llvm-project-${version}.src.tar.xz";
22
22
-
hash = "sha256-4/eTF62qkZbSz//hyGnXwQC3VAgyvET+DT9EoShh+jQ=";
22
22
+
hash = "sha256-gkAf6nt50AeAQ/dZi4NShNZlCnW5PmS292Hqe2MJdQE=";
23
23
};
24
24
path = [
25
25
-
clang
25
25
+
clang-no-compiler-rt
26
26
cmake
27
27
lld
28
28
llvm
···
35
35
36
36
cmake -S compiler-rt -B build -G Ninja \
37
37
-DCMAKE_BUILD_TYPE=${if config.debug then "Debug" else "Release"} \
38
38
-
-DCMAKE_CXX_COMPILER_TARGET=wasm32-unknown \
38
38
+
-DCMAKE_C_COMPILER_TARGET=wasm32-unknown-linux-musl \
39
39
+
-DCMAKE_C_COMPILER_WORKS=ON \
40
40
+
-DCMAKE_C_FLAGS="-I${musl}/include" \
41
41
+
-DCMAKE_CXX_COMPILER_TARGET=wasm32-unknown-linux-musl \
39
42
-DCMAKE_CXX_COMPILER_WORKS=ON \
40
43
-DCMAKE_CXX_FLAGS="-I${musl}/include" \
41
41
-
-DCMAKE_C_COMPILER_TARGET=wasm32-unknown \
42
42
-
-DCMAKE_C_COMPILER_WORKS=ON \
43
43
-
-DCMAKE_C_FLAGS="-I${musl}/include" \
44
44
-DCOMPILER_RT_BUILD_CRT=false \
45
45
-
-DCOMPILER_RT_DEFAULT_TARGET_ARCH=wasm32-unknown \
45
45
+
-DCOMPILER_RT_DEFAULT_TARGET_ARCH=wasm32-unknown-linux-musl \
46
46
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=true
47
47
48
48
cmake --build build -j$NIX_BUILD_CORES
···
1
1
{
2
2
run,
3
3
-
busybox,
4
3
lib,
4
4
+
wasmpkgs,
5
5
}:
6
6
7
7
let
···
377
377
run { name = "initramfs.cpio"; } ''
378
378
mkdir -p root/bin
379
379
cp ${./init.sh} root/init
380
380
-
cp ${busybox}/bin/busybox root/bin/busybox
380
380
+
cp ${wasmpkgs.busybox}/bin/busybox root/bin/busybox
381
381
382
382
for applet in ${lib.concatStringsSep " " applets}; do
383
383
ln -s busybox root/bin/$applet
···
1
1
+
{
2
2
+
fetch,
3
3
+
run,
4
4
+
config,
5
5
+
6
6
+
clang,
7
7
+
cmake,
8
8
+
lld,
9
9
+
linux,
10
10
+
llvm,
11
11
+
musl,
12
12
+
ninja,
13
13
+
python3,
14
14
+
}:
15
15
+
16
16
+
run
17
17
+
rec {
18
18
+
name = "libcxx";
19
19
+
# renovate: datasource=github-releases name=llvm/llvm-project
20
20
+
version = "19.1.7";
21
21
+
src = fetch.tar {
22
22
+
url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-${version}/llvm-project-${version}.src.tar.xz";
23
23
+
hash = "sha256-gkAf6nt50AeAQ/dZi4NShNZlCnW5PmS292Hqe2MJdQE=";
24
24
+
};
25
25
+
path = [
26
26
+
clang
27
27
+
cmake
28
28
+
lld
29
29
+
llvm
30
30
+
ninja
31
31
+
python3
32
32
+
];
33
33
+
}
34
34
+
''
35
35
+
# Make libunwind headers available for libc++abi
36
36
+
export CPLUS_INCLUDE_PATH="$PWD/libunwind/include''${CPLUS_INCLUDE_PATH:+:$CPLUS_INCLUDE_PATH}"
37
37
+
export C_INCLUDE_PATH="$PWD/libunwind/include''${C_INCLUDE_PATH:+:$C_INCLUDE_PATH}"
38
38
+
39
39
+
cmake -S runtimes -B build -G Ninja \
40
40
+
-DCMAKE_BUILD_TYPE=${if config.debug then "Debug" else "Release"} \
41
41
+
-DCMAKE_INSTALL_PREFIX=$out \
42
42
+
-DCMAKE_SYSROOT=${musl} \
43
43
+
-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \
44
44
+
-DCMAKE_C_COMPILER_TARGET=wasm32-unknown-linux-musl \
45
45
+
-DCMAKE_C_COMPILER_WORKS=ON \
46
46
+
-DCMAKE_C_FLAGS="-I${musl}/include -I${linux.headers}/include" \
47
47
+
-DCMAKE_CXX_COMPILER_TARGET=wasm32-unknown-linux-musl \
48
48
+
-DCMAKE_CXX_COMPILER_WORKS=ON \
49
49
+
-DCMAKE_CXX_FLAGS="-I${musl}/include -I${linux.headers}/include" \
50
50
+
-DLIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL=libunwind/include \
51
51
+
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \
52
52
+
-DLLVM_ENABLE_PROJECTS="" \
53
53
+
-DLLVM_HOST_TRIPLE=wasm32-unknown-linux-musl \
54
54
+
-DLLVM_TARGETS_TO_BUILD="WebAssembly" \
55
55
+
-DLIBCXX_ENABLE_FILESYSTEM=ON \
56
56
+
-DLIBCXX_ENABLE_RTTI=ON \
57
57
+
-DLIBCXX_ENABLE_SHARED=OFF \
58
58
+
-DLIBCXX_ENABLE_STATIC=ON \
59
59
+
-DLIBCXX_ENABLE_THREADS=ON \
60
60
+
-DLIBCXX_HAS_PTHREAD_API=ON \
61
61
+
-DLIBCXX_ENABLE_EXCEPTIONS=ON \
62
62
+
-DLIBCXX_ENABLE_MONOTONIC_CLOCK=ON \
63
63
+
-DLIBCXX_HAS_MUSL_LIBC=ON \
64
64
+
-DLIBCXX_USE_COMPILER_RT=ON \
65
65
+
-DLIBCXXABI_ENABLE_SHARED=OFF \
66
66
+
-DLIBCXXABI_ENABLE_THREADS=ON \
67
67
+
-DLIBCXXABI_HAS_PTHREAD_API=ON \
68
68
+
-DLIBCXXABI_ENABLE_EXCEPTIONS=ON \
69
69
+
-DLIBCXXABI_USE_COMPILER_RT=ON \
70
70
+
-DLIBCXXABI_INSTALL_STATIC_LIBRARY=ON \
71
71
+
-DLIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY=OFF \
72
72
+
-DLIBCXX_CXX_ABI=libcxxabi \
73
73
+
-DLIBCXXABI_USE_LLVM_UNWINDER=OFF \
74
74
+
-DLIBCXXABI_ENABLE_STATIC_UNWINDER=OFF \
75
75
+
-DLLVM_PATH=llvm
76
76
+
77
77
+
cmake --build build --target install -j$NIX_BUILD_CORES
78
78
+
''
···
6
6
7
7
bc,
8
8
bison,
9
9
-
clang-host ? clang,
10
10
-
clang,
9
9
+
clang-no-compiler-rt,
10
10
+
clang-host ? clang-no-compiler-rt,
11
11
esbuild,
12
12
findutils,
13
13
flex,
···
31
31
path = [
32
32
bc
33
33
bison
34
34
-
clang
34
34
+
clang-no-compiler-rt
35
35
esbuild
36
36
findutils
37
37
flex
···
4
4
lib,
5
5
config,
6
6
7
7
-
clang,
7
7
+
clang-no-compiler-rt,
8
8
gnumake,
9
9
lld,
10
10
llvm,
···
16
16
src = fetch.github {
17
17
owner = "tombl";
18
18
repo = "musl";
19
19
-
rev = "refs/heads/master";
20
20
-
hash = "sha256-iqTTSWLXv850UNToxCrZbXoxke9M9i/7bjgfCzn/zLs=";
19
19
+
rev = "314d4e81e26546ba063663437657095ad2c0351c";
20
20
+
hash = "sha256-gCylldyaICorupH1e1eXD6fW8ILYeFkokMlMPz4UV5E=";
21
21
};
22
22
path = [
23
23
-
clang
23
23
+
clang-no-compiler-rt
24
24
gnumake
25
25
lld
26
26
llvm
···
3
3
currentSystem,
4
4
bash,
5
5
busybox,
6
6
-
busybox-host ? busybox,
7
6
}:
8
7
9
8
let
···
34
33
path
35
34
++ [
36
35
bash
37
37
-
busybox-host
36
36
+
busybox
38
37
]
39
38
);
40
39
inherit command;
···
54
53
: ${"$"}{outputs:=out}
55
54
56
55
if [ 0 -eq "$NIX_BUILD_CORES" ]; then
57
57
-
NIX_BUILD_CORES=$(${busybox-host}/bin/nproc)
56
56
+
NIX_BUILD_CORES=$(${busybox}/bin/nproc)
58
57
fi
59
58
60
59
eval "_build() { $(cat $commandPath); }"
···
1
1
+
{
2
2
+
run,
3
3
+
libcxx,
4
4
+
musl,
5
5
+
linux,
6
6
+
}:
7
7
+
8
8
+
run { name = "sysroot"; } ''
9
9
+
mkdir -p $out/lib $out/include $out/share
10
10
+
11
11
+
cp ${libcxx}/lib/* $out/lib/
12
12
+
cp -r ${libcxx}/include/c++ $out/include/
13
13
+
cp -r ${libcxx}/share/libc++ $out/share/
14
14
+
cp -r ${musl}/include/* $out/include/
15
15
+
cp ${musl}/lib/* $out/lib/
16
16
+
cp -r ${linux.headers}/* $out/include/
17
17
+
''