This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

add clang (#65)

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