Compare commits
7 Commits
master
...
feature/co
Author | SHA1 | Date |
---|---|---|
Brad Bondurant | c7a5c2cf00 | |
Brad Bondurant | 6a5fd192df | |
Brad Bondurant | ddc184cd89 | |
Brad Bondurant | efa9a17cd2 | |
Brad Bondurant | 4b139cfc2f | |
Brad Bondurant | ab6d14f492 | |
Brad Bondurant | 4ae8ffa640 |
|
@ -126,6 +126,16 @@ dependencies = [
|
||||||
"volatile-register",
|
"volatile-register",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libcortex_r5"
|
||||||
|
version = "0.0.0"
|
||||||
|
dependencies = [
|
||||||
|
"bit_field",
|
||||||
|
"libcortex_a9",
|
||||||
|
"libregister",
|
||||||
|
"volatile-register",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libregister"
|
name = "libregister"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
members = [
|
members = [
|
||||||
"libregister",
|
"libregister",
|
||||||
"libcortex_a9",
|
"libcortex_a9",
|
||||||
|
"libcortex_r5",
|
||||||
"libboard_zynq",
|
"libboard_zynq",
|
||||||
"libsupport_zynq",
|
"libsupport_zynq",
|
||||||
"libasync",
|
"libasync",
|
||||||
|
|
|
@ -8,7 +8,6 @@ edition = "2018"
|
||||||
[features]
|
[features]
|
||||||
target_zc706 = ["libboard_zynq/target_zc706", "libsupport_zynq/target_zc706"]
|
target_zc706 = ["libboard_zynq/target_zc706", "libsupport_zynq/target_zc706"]
|
||||||
target_coraz7 = ["libboard_zynq/target_coraz7", "libsupport_zynq/target_coraz7"]
|
target_coraz7 = ["libboard_zynq/target_coraz7", "libsupport_zynq/target_coraz7"]
|
||||||
target_ebaz4205 = ["libboard_zynq/target_ebaz4205", "libsupport_zynq/target_ebaz4205"]
|
|
||||||
target_redpitaya = ["libboard_zynq/target_redpitaya", "libsupport_zynq/target_redpitaya"]
|
target_redpitaya = ["libboard_zynq/target_redpitaya", "libsupport_zynq/target_redpitaya"]
|
||||||
target_kasli_soc = ["libboard_zynq/target_kasli_soc", "libsupport_zynq/target_kasli_soc"]
|
target_kasli_soc = ["libboard_zynq/target_kasli_soc", "libsupport_zynq/target_kasli_soc"]
|
||||||
default = ["target_zc706"]
|
default = ["target_zc706"]
|
||||||
|
@ -19,5 +18,5 @@ embedded-hal = "0.2"
|
||||||
libregister = { path = "../libregister" }
|
libregister = { path = "../libregister" }
|
||||||
libcortex_a9 = { path = "../libcortex_a9" }
|
libcortex_a9 = { path = "../libcortex_a9" }
|
||||||
libboard_zynq = { path = "../libboard_zynq" }
|
libboard_zynq = { path = "../libboard_zynq" }
|
||||||
libsupport_zynq = { path = "../libsupport_zynq", default-features = false, features = ["panic_handler", "dummy_fiq_handler"]}
|
libsupport_zynq = { path = "../libsupport_zynq", default-features = false, features = ["panic_handler"]}
|
||||||
libasync = { path = "../libasync" }
|
libasync = { path = "../libasync" }
|
||||||
|
|
|
@ -39,7 +39,7 @@ use libcortex_a9::{
|
||||||
};
|
};
|
||||||
use libregister::{RegisterR, RegisterW};
|
use libregister::{RegisterR, RegisterW};
|
||||||
use libsupport_zynq::{
|
use libsupport_zynq::{
|
||||||
boot, exception_vectors, ram,
|
boot, ram,
|
||||||
};
|
};
|
||||||
use log::{info, warn};
|
use log::{info, warn};
|
||||||
use core::sync::atomic::{AtomicBool, Ordering};
|
use core::sync::atomic::{AtomicBool, Ordering};
|
||||||
|
@ -56,18 +56,10 @@ extern "C" {
|
||||||
static CORE1_RESTART: AtomicBool = AtomicBool::new(false);
|
static CORE1_RESTART: AtomicBool = AtomicBool::new(false);
|
||||||
|
|
||||||
interrupt_handler!(IRQ, irq, __irq_stack0_start, __irq_stack1_start, {
|
interrupt_handler!(IRQ, irq, __irq_stack0_start, __irq_stack1_start, {
|
||||||
|
if MPIDR.read().cpu_id() == 1{
|
||||||
let mpcore = mpcore::RegisterBlock::mpcore();
|
let mpcore = mpcore::RegisterBlock::mpcore();
|
||||||
let mut gic = gic::InterruptController::gic(mpcore);
|
let mut gic = gic::InterruptController::gic(mpcore);
|
||||||
let id = gic.get_interrupt_id();
|
let id = gic.get_interrupt_id();
|
||||||
match MPIDR.read().cpu_id(){
|
|
||||||
0 => {
|
|
||||||
if id.0 == 0 {
|
|
||||||
println!("Interrupting core0...");
|
|
||||||
gic.end_interrupt(id);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
1 => {
|
|
||||||
if id.0 == 0 {
|
if id.0 == 0 {
|
||||||
gic.end_interrupt(id);
|
gic.end_interrupt(id);
|
||||||
asm::exit_irq();
|
asm::exit_irq();
|
||||||
|
@ -77,8 +69,6 @@ interrupt_handler!(IRQ, irq, __irq_stack0_start, __irq_stack1_start, {
|
||||||
notify_spin_lock();
|
notify_spin_lock();
|
||||||
main_core1();
|
main_core1();
|
||||||
}
|
}
|
||||||
},
|
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
stdio::drop_uart();
|
stdio::drop_uart();
|
||||||
println!("IRQ");
|
println!("IRQ");
|
||||||
|
@ -96,7 +86,6 @@ pub fn restart_core1() {
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub fn main_core0() {
|
pub fn main_core0() {
|
||||||
exception_vectors::set_vector_table(0x0);
|
|
||||||
// zynq::clocks::CpuClocks::enable_io(1_250_000_000);
|
// zynq::clocks::CpuClocks::enable_io(1_250_000_000);
|
||||||
enable_l2_cache(0x8);
|
enable_l2_cache(0x8);
|
||||||
println!("\nZynq experiments");
|
println!("\nZynq experiments");
|
||||||
|
@ -116,7 +105,6 @@ pub fn main_core0() {
|
||||||
|
|
||||||
#[cfg(any(
|
#[cfg(any(
|
||||||
feature = "target_zc706",
|
feature = "target_zc706",
|
||||||
feature = "target_ebaz4205",
|
|
||||||
feature = "target_redpitaya",
|
feature = "target_redpitaya",
|
||||||
feature = "target_kasli_soc",
|
feature = "target_kasli_soc",
|
||||||
))]
|
))]
|
||||||
|
@ -146,10 +134,6 @@ pub fn main_core0() {
|
||||||
ddr.memtest();
|
ddr.memtest();
|
||||||
ram::init_alloc_ddr(&mut ddr);
|
ram::init_alloc_ddr(&mut ddr);
|
||||||
|
|
||||||
info!("Send software interrupt to core0");
|
|
||||||
interrupt_controller.send_sgi(gic::InterruptId(0), gic::CPUCore::Core0.into());
|
|
||||||
info!("Core0 returned from interrupt");
|
|
||||||
|
|
||||||
boot::Core1::start(false);
|
boot::Core1::start(false);
|
||||||
|
|
||||||
let core1_req = unsafe { &mut CORE1_REQ.0 };
|
let core1_req = unsafe { &mut CORE1_REQ.0 };
|
||||||
|
|
49
flake.lock
49
flake.lock
|
@ -1,46 +1,41 @@
|
||||||
{
|
{
|
||||||
"nodes": {
|
"nodes": {
|
||||||
|
"mozilla-overlay": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1650459918,
|
||||||
|
"narHash": "sha256-sroCK+QJTmoXtcRkwZyKOP9iAYOPID2Bwdxn4GkG16w=",
|
||||||
|
"owner": "mozilla",
|
||||||
|
"repo": "nixpkgs-mozilla",
|
||||||
|
"rev": "e1f7540fc0a8b989fb8cf701dc4fd7fc76bcf168",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "mozilla",
|
||||||
|
"repo": "nixpkgs-mozilla",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1731652201,
|
"lastModified": 1653920503,
|
||||||
"narHash": "sha256-XUO0JKP1hlww0d7mm3kpmIr4hhtR4zicg5Wwes9cPMg=",
|
"narHash": "sha256-BBeCZwZImtjP3oYy4WogkQYy5OxNyfNciVSc1AfZgLQ=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "c21b77913ea840f8bcf9adf4c41cecc2abffd38d",
|
"rev": "a634c8f6c1fbf9b9730e01764999666f3436f10a",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"ref": "nixos-24.05",
|
"ref": "nixos-22.05",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs",
|
"mozilla-overlay": "mozilla-overlay",
|
||||||
"rust-overlay": "rust-overlay"
|
"nixpkgs": "nixpkgs"
|
||||||
}
|
|
||||||
},
|
|
||||||
"rust-overlay": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1719454714,
|
|
||||||
"narHash": "sha256-MojqG0lyUINkEk0b3kM2drsU5vyaF8DFZe/FAlZVOGs=",
|
|
||||||
"owner": "oxalica",
|
|
||||||
"repo": "rust-overlay",
|
|
||||||
"rev": "d1c527659cf076ecc4b96a91c702d080b213801e",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "oxalica",
|
|
||||||
"ref": "snapshot/2024-08-01",
|
|
||||||
"repo": "rust-overlay",
|
|
||||||
"type": "github"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
242
flake.nix
242
flake.nix
|
@ -1,61 +1,173 @@
|
||||||
{
|
{
|
||||||
description = "Bare-metal Rust on Zynq-7000";
|
description = "Bare-metal Rust on Zynq-7000";
|
||||||
|
|
||||||
inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-24.05;
|
inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-22.05;
|
||||||
inputs.rust-overlay = {
|
inputs.mozilla-overlay = { url = github:mozilla/nixpkgs-mozilla; flake = false; };
|
||||||
url = "github:oxalica/rust-overlay?ref=snapshot/2024-08-01";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
outputs = { self, nixpkgs, rust-overlay }:
|
outputs = { self, nixpkgs, mozilla-overlay }:
|
||||||
let
|
let
|
||||||
pkgs = import nixpkgs { system = "x86_64-linux"; overlays = [ (import rust-overlay) crosspkgs-overlay ]; };
|
pkgs = import nixpkgs { system = "x86_64-linux"; overlays = [ (import mozilla-overlay) ]; };
|
||||||
|
|
||||||
rust = pkgs.rust-bin.nightly."2021-01-28".default.override {
|
rustManifest = pkgs.fetchurl {
|
||||||
extensions = [ "rust-src" ];
|
url = "https://static.rust-lang.org/dist/2021-01-29/channel-rust-nightly.toml";
|
||||||
targets = [ ];
|
sha256 = "sha256-EZKgw89AH4vxaJpUHmIMzMW/80wAFQlfcxRoBD9nz0c=";
|
||||||
};
|
};
|
||||||
rustPlatform = pkgs.makeRustPlatform {
|
rustTargets = [];
|
||||||
rustc = rust // {
|
rustChannelOfTargets = _channel: _date: targets:
|
||||||
# https://github.com/oxalica/rust-overlay/commit/c48c2d76b68dd9ede0815fec53479375c61af857
|
(pkgs.lib.rustLib.fromManifestFile rustManifest {
|
||||||
targetPlatforms = pkgs.lib.platforms.all;
|
inherit (pkgs) stdenv lib fetchurl patchelf;
|
||||||
tier1TargetPlatforms = pkgs.lib.platforms.all;
|
}).rust.override {
|
||||||
badTargetPlatforms = [ ];
|
inherit targets;
|
||||||
|
extensions = ["rust-src"];
|
||||||
};
|
};
|
||||||
|
rust = rustChannelOfTargets "nightly" null rustTargets;
|
||||||
|
rustPlatform = pkgs.recurseIntoAttrs (pkgs.makeRustPlatform {
|
||||||
|
rustc = rust;
|
||||||
cargo = rust;
|
cargo = rust;
|
||||||
};
|
|
||||||
|
|
||||||
# https://doc.rust-lang.org/rustc/linker-plugin-lto.html#toolchain-compatibility
|
|
||||||
llvmPackages_11 = pkgs.recurseIntoAttrs (pkgs.callPackage (import ./llvm/11) ({
|
|
||||||
inherit (pkgs.stdenvAdapters) overrideCC;
|
|
||||||
buildLlvmTools = null;
|
|
||||||
targetLlvmLibraries = null;
|
|
||||||
targetLlvm = null;
|
|
||||||
}));
|
|
||||||
|
|
||||||
crosspkgs-overlay = (self: super: {
|
|
||||||
pkgsCross = super.pkgsCross // {
|
|
||||||
zynq-baremetal = import super.path {
|
|
||||||
system = "x86_64-linux";
|
|
||||||
crossSystem = {
|
|
||||||
config = "arm-none-eabihf";
|
|
||||||
libc = "newlib";
|
|
||||||
gcc.cpu = "cortex-a9";
|
|
||||||
gcc.fpu = "vfpv3";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
gnu-platform = "arm-none-eabi";
|
||||||
|
|
||||||
|
binutils-pkg = { zlib, extraConfigureFlags ? [] }: pkgs.stdenv.mkDerivation rec {
|
||||||
|
basename = "binutils";
|
||||||
|
version = "2.30";
|
||||||
|
name = "${basename}-${gnu-platform}-${version}";
|
||||||
|
src = pkgs.fetchurl {
|
||||||
|
url = "https://ftp.gnu.org/gnu/binutils/binutils-${version}.tar.bz2";
|
||||||
|
sha256 = "028cklfqaab24glva1ks2aqa1zxa6w6xmc8q34zs1sb7h22dxspg";
|
||||||
|
};
|
||||||
|
configureFlags = [
|
||||||
|
"--enable-deterministic-archives"
|
||||||
|
"--target=${gnu-platform}"
|
||||||
|
"--with-cpu=cortex-a9"
|
||||||
|
"--with-fpu=vfpv3"
|
||||||
|
"--with-float=hard"
|
||||||
|
"--with-mode=thumb"
|
||||||
|
] ++ extraConfigureFlags;
|
||||||
|
outputs = [ "out" "info" "man" ];
|
||||||
|
depsBuildBuild = [ pkgs.buildPackages.stdenv.cc ];
|
||||||
|
buildInputs = [ zlib ];
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
meta = {
|
||||||
|
description = "Tools for manipulating binaries (linker, assembler, etc.)";
|
||||||
|
longDescription = ''
|
||||||
|
The GNU Binutils are a collection of binary tools. The main
|
||||||
|
ones are `ld' (the GNU linker) and `as' (the GNU assembler).
|
||||||
|
They also include the BFD (Binary File Descriptor) library,
|
||||||
|
`gprof', `nm', `strip', etc.
|
||||||
|
'';
|
||||||
|
homepage = http://www.gnu.org/software/binutils/;
|
||||||
|
license = pkgs.lib.licenses.gpl3Plus;
|
||||||
|
/* Give binutils a lower priority than gcc-wrapper to prevent a
|
||||||
|
collision due to the ld/as wrappers/symlinks in the latter. */
|
||||||
|
priority = "10";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
gcc-pkg = { gmp, mpfr, libmpc, platform-binutils, extraConfigureFlags ? [] }: pkgs.stdenv.mkDerivation rec {
|
||||||
|
basename = "gcc";
|
||||||
|
version = "9.1.0";
|
||||||
|
name = "${basename}-${gnu-platform}-${version}";
|
||||||
|
src = pkgs.fetchurl {
|
||||||
|
url = "https://ftp.gnu.org/gnu/gcc/gcc-${version}/gcc-${version}.tar.xz";
|
||||||
|
sha256 = "1817nc2bqdc251k0lpc51cimna7v68xjrnvqzvc50q3ax4s6i9kr";
|
||||||
|
};
|
||||||
|
preConfigure = ''
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
'';
|
||||||
|
configureScript = "../configure";
|
||||||
|
configureFlags = [
|
||||||
|
"--target=${gnu-platform}"
|
||||||
|
"--with-arch=armv7-a"
|
||||||
|
"--with-tune=cortex-a9"
|
||||||
|
"--with-fpu=vfpv3"
|
||||||
|
"--with-float=hard"
|
||||||
|
"--disable-libssp"
|
||||||
|
"--enable-languages=c"
|
||||||
|
"--with-as=${platform-binutils}/bin/${gnu-platform}-as"
|
||||||
|
"--with-ld=${platform-binutils}/bin/${gnu-platform}-ld" ] ++ extraConfigureFlags;
|
||||||
|
outputs = [ "out" "info" "man" ];
|
||||||
|
hardeningDisable = [ "format" "pie" ];
|
||||||
|
propagatedBuildInputs = [ gmp mpfr libmpc platform-binutils ];
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
dontFixup = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
newlib-pkg = { platform-binutils, platform-gcc }: pkgs.stdenv.mkDerivation rec {
|
||||||
|
pname = "newlib";
|
||||||
|
version = "3.1.0";
|
||||||
|
src = pkgs.fetchurl {
|
||||||
|
url = "ftp://sourceware.org/pub/newlib/newlib-${version}.tar.gz";
|
||||||
|
sha256 = "0ahh3n079zjp7d9wynggwrnrs27440aac04340chf1p9476a2kzv";
|
||||||
|
};
|
||||||
|
nativeBuildInputs = [ platform-binutils platform-gcc ];
|
||||||
|
configureFlags = [
|
||||||
|
"--target=${gnu-platform}"
|
||||||
|
|
||||||
|
"--with-cpu=cortex-a9"
|
||||||
|
"--with-fpu=vfpv3"
|
||||||
|
"--with-float=hard"
|
||||||
|
"--with-mode=thumb"
|
||||||
|
"--enable-interwork"
|
||||||
|
"--disable-multilib"
|
||||||
|
|
||||||
|
"--disable-newlib-supplied-syscalls"
|
||||||
|
"--with-gnu-ld"
|
||||||
|
"--with-gnu-as"
|
||||||
|
"--disable-newlib-io-float"
|
||||||
|
"--disable-werror"
|
||||||
|
];
|
||||||
|
dontFixup = true;
|
||||||
|
};
|
||||||
|
gnutoolchain = rec {
|
||||||
|
binutils-bootstrap = pkgs.callPackage binutils-pkg { };
|
||||||
|
gcc-bootstrap = pkgs.callPackage gcc-pkg {
|
||||||
|
platform-binutils = binutils-bootstrap;
|
||||||
|
extraConfigureFlags = [ "--disable-libgcc" ];
|
||||||
|
};
|
||||||
|
newlib = pkgs.callPackage newlib-pkg {
|
||||||
|
platform-binutils = binutils-bootstrap;
|
||||||
|
platform-gcc = gcc-bootstrap;
|
||||||
|
};
|
||||||
|
binutils = pkgs.callPackage binutils-pkg {
|
||||||
|
extraConfigureFlags = [ "--with-lib-path=${newlib}/arm-none-eabi/lib" ];
|
||||||
|
};
|
||||||
|
gcc = pkgs.callPackage gcc-pkg {
|
||||||
|
platform-binutils = binutils;
|
||||||
|
extraConfigureFlags = [ "--enable-newlib" "--with-headers=${newlib}/arm-none-eabi/include" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
cargo-xbuild = rustPlatform.buildRustPackage rec {
|
||||||
|
pname = "cargo-xbuild";
|
||||||
|
version = "0.6.5";
|
||||||
|
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "rust-osdev";
|
||||||
|
repo = pname;
|
||||||
|
rev = "v${version}";
|
||||||
|
sha256 = "18djvygq9v8rmfchvi2hfj0i6fhn36m716vqndqnj56fiqviwxvf";
|
||||||
|
};
|
||||||
|
cargoSha256 = "13sj9j9kl6js75h9xq0yidxy63vixxm9q3f8jil6ymarml5wkhx8";
|
||||||
|
|
||||||
|
meta = with pkgs.lib; {
|
||||||
|
description = "Automatically cross-compiles the sysroot crates core, compiler_builtins, and alloc";
|
||||||
|
homepage = "https://github.com/rust-osdev/cargo-xbuild";
|
||||||
|
license = with licenses; [ mit asl20 ];
|
||||||
|
maintainers = with maintainers; [ johntitor xrelkd ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
mkbootimage = pkgs.stdenv.mkDerivation {
|
mkbootimage = pkgs.stdenv.mkDerivation {
|
||||||
pname = "mkbootimage";
|
pname = "mkbootimage";
|
||||||
version = "2.3dev";
|
version = "2.2";
|
||||||
|
|
||||||
src = pkgs.fetchFromGitHub {
|
src = pkgs.fetchFromGitHub {
|
||||||
owner = "antmicro";
|
owner = "antmicro";
|
||||||
repo = "zynq-mkbootimage";
|
repo = "zynq-mkbootimage";
|
||||||
rev = "872363ce32c249f8278cf107bc6d3bdeb38d849f";
|
rev = "4ee42d782a9ba65725ed165a4916853224a8edf7";
|
||||||
sha256 = "sha256-5FPyAhUWZDwHbqmp9J2ZXTmjaXPz+dzrJMolaNwADHs=";
|
sha256 = "1k1mbsngqadqihzjgvwvsrkvryxy5ladpxd9yh9iqn2s7fxqwqa9";
|
||||||
};
|
};
|
||||||
|
|
||||||
propagatedBuildInputs = [ pkgs.libelf pkgs.pcre ];
|
propagatedBuildInputs = [ pkgs.libelf pkgs.pcre ];
|
||||||
|
@ -68,7 +180,6 @@
|
||||||
mkdir -p $out/bin
|
mkdir -p $out/bin
|
||||||
cp mkbootimage $out/bin
|
cp mkbootimage $out/bin
|
||||||
'';
|
'';
|
||||||
hardeningDisable = [ "fortify" ];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
fsbl = { board ? "zc706" }: pkgs.stdenv.mkDerivation {
|
fsbl = { board ? "zc706" }: pkgs.stdenv.mkDerivation {
|
||||||
|
@ -76,20 +187,19 @@
|
||||||
src = pkgs.fetchFromGitHub {
|
src = pkgs.fetchFromGitHub {
|
||||||
owner = "Xilinx";
|
owner = "Xilinx";
|
||||||
repo = "embeddedsw";
|
repo = "embeddedsw";
|
||||||
rev = "xilinx_v2022.2";
|
rev = "65c849ed46c88c67457e1fc742744f96db968ff1";
|
||||||
sha256 = "sha256-UDz9KK/Hw3qM1BAeKif30rE8Bi6C2uvuZlvyvtJCMfw=";
|
sha256 = "1rvl06ha40dzd6s9aa4sylmksh4xb9dqaxq462lffv1fdk342pda";
|
||||||
};
|
};
|
||||||
|
patches = [ ./fsbl.patch ];
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
pkgs.pkgsCross.zynq-baremetal.buildPackages.binutils
|
pkgs.gnumake
|
||||||
pkgs.pkgsCross.zynq-baremetal.buildPackages.gcc
|
gnutoolchain.binutils
|
||||||
|
gnutoolchain.gcc
|
||||||
];
|
];
|
||||||
patchPhase = ''
|
patchPhase = ''
|
||||||
|
patch -p1 -i ${./fsbl.patch}
|
||||||
patchShebangs lib/sw_apps/zynq_fsbl/misc/copy_bsp.sh
|
patchShebangs lib/sw_apps/zynq_fsbl/misc/copy_bsp.sh
|
||||||
|
echo 'SEARCH_DIR("${gnutoolchain.newlib}/arm-none-eabi/lib");' >> lib/sw_apps/zynq_fsbl/src/lscript.ld
|
||||||
for x in lib/sw_apps/zynq_fsbl/src/Makefile lib/sw_apps/zynq_fsbl/misc/copy_bsp.sh lib/bsp/standalone/src/arm/cortexa9/gcc/Makefile; do
|
|
||||||
substituteInPlace $x \
|
|
||||||
--replace "arm-none-eabi-" "arm-none-eabihf-"
|
|
||||||
done
|
|
||||||
'';
|
'';
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
cd lib/sw_apps/zynq_fsbl/src
|
cd lib/sw_apps/zynq_fsbl/src
|
||||||
|
@ -103,10 +213,6 @@
|
||||||
dontFixup = true;
|
dontFixup = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
cargo-xbuild = pkgs.cargo-xbuild.overrideAttrs(oa: {
|
|
||||||
postPatch = "substituteInPlace src/sysroot.rs --replace 2021 2018";
|
|
||||||
});
|
|
||||||
|
|
||||||
build-crate = name: crate: features: rustPlatform.buildRustPackage rec {
|
build-crate = name: crate: features: rustPlatform.buildRustPackage rec {
|
||||||
name = "${crate}";
|
name = "${crate}";
|
||||||
|
|
||||||
|
@ -115,9 +221,9 @@
|
||||||
) ./.;
|
) ./.;
|
||||||
cargoLock = { lockFile = ./Cargo.lock; };
|
cargoLock = { lockFile = ./Cargo.lock; };
|
||||||
|
|
||||||
nativeBuildInputs = [ cargo-xbuild llvmPackages_11.clang-unwrapped ];
|
nativeBuildInputs = [ cargo-xbuild pkgs.llvmPackages_9.clang-unwrapped ];
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
export XARGO_RUST_SRC="${rust}/lib/rustlib/src/rust/library"
|
export XARGO_RUST_SRC="${rustPlatform.rust.rustc}/lib/rustlib/src/rust/library"
|
||||||
export CARGO_HOME=$(mktemp -d cargo-home.XXX)
|
export CARGO_HOME=$(mktemp -d cargo-home.XXX)
|
||||||
pushd ${crate}
|
pushd ${crate}
|
||||||
cargo xbuild --release --frozen \
|
cargo xbuild --release --frozen \
|
||||||
|
@ -134,14 +240,13 @@
|
||||||
|
|
||||||
doCheck = false;
|
doCheck = false;
|
||||||
dontFixup = true;
|
dontFixup = true;
|
||||||
auditable = false;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
targetCrates = target: {
|
targetCrates = target: {
|
||||||
"${target}-experiments" = build-crate "${target}-experiments" "experiments" "target_${target}";
|
"${target}-experiments" = build-crate "${target}-experiments" "experiments" "target_${target}";
|
||||||
"${target}-szl" = build-crate "${target}-szl" "szl" "target_${target}";
|
"${target}-szl" = build-crate "${target}-szl" "szl" "target_${target}";
|
||||||
};
|
};
|
||||||
targets = ["zc706" "coraz7" "redpitaya" "kasli_soc" "ebaz4205"];
|
targets = ["zc706" "coraz7" "redpitaya" "kasli_soc"];
|
||||||
allTargetCrates = (builtins.foldl' (results: target:
|
allTargetCrates = (builtins.foldl' (results: target:
|
||||||
results // targetCrates target
|
results // targetCrates target
|
||||||
) {} targets);
|
) {} targets);
|
||||||
|
@ -160,20 +265,21 @@
|
||||||
|
|
||||||
hydraJobs = packages.x86_64-linux;
|
hydraJobs = packages.x86_64-linux;
|
||||||
|
|
||||||
inherit rust rustPlatform llvmPackages_11;
|
inherit rustPlatform;
|
||||||
|
|
||||||
devShell.x86_64-linux = pkgs.mkShell {
|
devShell.x86_64-linux = pkgs.mkShell {
|
||||||
name = "zynq-rs-dev-shell";
|
name = "zynq-rs-dev-shell";
|
||||||
buildInputs = [
|
buildInputs = with pkgs; [
|
||||||
rust
|
rustPlatform.rust.rustc
|
||||||
|
rustPlatform.rust.cargo
|
||||||
|
cacert
|
||||||
cargo-xbuild
|
cargo-xbuild
|
||||||
mkbootimage
|
|
||||||
|
|
||||||
pkgs.openocd pkgs.gdb
|
openocd gdb
|
||||||
pkgs.openssh pkgs.rsync
|
openssh rsync
|
||||||
llvmPackages_11.clang-unwrapped
|
llvmPackages_9.clang-unwrapped
|
||||||
(pkgs.python3.withPackages(ps: [ ps.pyftdi ]))
|
(python3.withPackages(ps: [ ps.pyftdi ]))
|
||||||
];
|
mkbootimage ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
diff --git a/lib/sw_apps/zynq_fsbl/src/Makefile b/lib/sw_apps/zynq_fsbl/src/Makefile
|
||||||
|
index 0e3ccdf1c5..a5b02f386e 100644
|
||||||
|
--- a/lib/sw_apps/zynq_fsbl/src/Makefile
|
||||||
|
+++ b/lib/sw_apps/zynq_fsbl/src/Makefile
|
||||||
|
@@ -71,11 +71,14 @@ endif
|
||||||
|
all: $(EXEC)
|
||||||
|
|
||||||
|
$(EXEC): $(LIBS) $(OBJS) $(INCLUDES)
|
||||||
|
- cp $(BSP_DIR)/$(BOARD)/ps7_init.* .
|
||||||
|
$(LINKER) $(LD1FLAGS) -o $@ $(OBJS) $(LDFLAGS)
|
||||||
|
rm -rf $(OBJS)
|
||||||
|
-
|
||||||
|
-
|
||||||
|
+
|
||||||
|
+.PHONY: ps7_init
|
||||||
|
+
|
||||||
|
+ps7_init:
|
||||||
|
+ cp $(BSP_DIR)/$(BOARD)/ps7_init.* .
|
||||||
|
+
|
||||||
|
$(LIBS):
|
||||||
|
echo "Copying BSP files"
|
||||||
|
$(BSP_DIR)/copy_bsp.sh $(BOARD) $(CC)
|
||||||
|
@@ -86,7 +89,7 @@ $(LIBS):
|
||||||
|
make -C $(BSP_DIR) -k all "CC=armcc" "AR=armar" "C_FLAGS= -O2 -c" "EC_FLAGS=--debug --wchar32"; \
|
||||||
|
fi;
|
||||||
|
|
||||||
|
-%.o:%.c
|
||||||
|
+%.o:%.c ps7_init
|
||||||
|
$(CC) $(CC_FLAGS) $(CFLAGS) $(ECFLAGS) -c $< -o $@ $(INCLUDEPATH)
|
||||||
|
|
||||||
|
%.o:%.S
|
|
@ -8,7 +8,6 @@ edition = "2018"
|
||||||
[features]
|
[features]
|
||||||
target_zc706 = []
|
target_zc706 = []
|
||||||
target_coraz7 = []
|
target_coraz7 = []
|
||||||
target_ebaz4205 = []
|
|
||||||
target_redpitaya = []
|
target_redpitaya = []
|
||||||
target_kasli_soc = []
|
target_kasli_soc = []
|
||||||
ipv6 = [ "smoltcp/proto-ipv6" ]
|
ipv6 = [ "smoltcp/proto-ipv6" ]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
use core::unimplemented;
|
|
||||||
|
|
||||||
use libregister::{RegisterR, RegisterRW};
|
use libregister::{RegisterR, RegisterRW};
|
||||||
use super::slcr;
|
use super::slcr;
|
||||||
pub use slcr::ArmPllSource;
|
pub use slcr::ArmPllSource;
|
||||||
|
@ -103,8 +101,6 @@ impl Clocks {
|
||||||
self.ddr,
|
self.ddr,
|
||||||
slcr::PllSource::IoPll =>
|
slcr::PllSource::IoPll =>
|
||||||
self.io,
|
self.io,
|
||||||
slcr::PllSource::Emio =>
|
|
||||||
unimplemented!(),
|
|
||||||
};
|
};
|
||||||
pll / u32::from(uart_clk_ctrl.divisor())
|
pll / u32::from(uart_clk_ctrl.divisor())
|
||||||
}
|
}
|
||||||
|
@ -119,8 +115,6 @@ impl Clocks {
|
||||||
self.ddr,
|
self.ddr,
|
||||||
slcr::PllSource::IoPll =>
|
slcr::PllSource::IoPll =>
|
||||||
self.io,
|
self.io,
|
||||||
slcr::PllSource::Emio =>
|
|
||||||
unimplemented!(),
|
|
||||||
};
|
};
|
||||||
pll / u32::from(sdio_clk_ctrl.divisor())
|
pll / u32::from(sdio_clk_ctrl.divisor())
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,6 @@ use super::slcr;
|
||||||
pub const PS_CLK: u32 = 33_333_333;
|
pub const PS_CLK: u32 = 33_333_333;
|
||||||
#[cfg(feature = "target_coraz7")]
|
#[cfg(feature = "target_coraz7")]
|
||||||
pub const PS_CLK: u32 = 50_000_000;
|
pub const PS_CLK: u32 = 50_000_000;
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
pub const PS_CLK: u32 = 33_333_333;
|
|
||||||
#[cfg(feature = "target_redpitaya")]
|
#[cfg(feature = "target_redpitaya")]
|
||||||
pub const PS_CLK: u32 = 33_333_333;
|
pub const PS_CLK: u32 = 33_333_333;
|
||||||
#[cfg(feature = "target_kasli_soc")]
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
|
|
@ -16,10 +16,6 @@ const DDR_FREQ: u32 = 666_666_666;
|
||||||
/// Micron MT41K256M16HA-125: 800 MHz DDR3L, max supported 533 MHz
|
/// Micron MT41K256M16HA-125: 800 MHz DDR3L, max supported 533 MHz
|
||||||
const DDR_FREQ: u32 = 525_000_000;
|
const DDR_FREQ: u32 = 525_000_000;
|
||||||
|
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
/// EtronTech Memory EM6GD16EWKG-12H: 800 MHz DDR3 at 533 MHz
|
|
||||||
const DDR_FREQ: u32 = 533_333_333;
|
|
||||||
|
|
||||||
#[cfg(feature = "target_redpitaya")]
|
#[cfg(feature = "target_redpitaya")]
|
||||||
/// Alliance Memory AS4C256M16D3B: 800 MHz DDR3 at 533 MHz
|
/// Alliance Memory AS4C256M16D3B: 800 MHz DDR3 at 533 MHz
|
||||||
const DDR_FREQ: u32 = 533_333_333;
|
const DDR_FREQ: u32 = 533_333_333;
|
||||||
|
@ -151,23 +147,22 @@ impl DdrRam {
|
||||||
.output_en(slcr::DdriobOutputEn::Obuf);
|
.output_en(slcr::DdriobOutputEn::Obuf);
|
||||||
#[cfg(feature = "target_zc706")]
|
#[cfg(feature = "target_zc706")]
|
||||||
let data1_config = data0_config.clone();
|
let data1_config = data0_config.clone();
|
||||||
#[cfg(any(
|
#[cfg(any(feature = "target_coraz7", feature = "target_kasli_soc"))]
|
||||||
feature = "target_coraz7",
|
|
||||||
feature = "target_ebaz4205",
|
|
||||||
feature = "target_redpitaya",
|
|
||||||
feature = "target_kasli_soc",
|
|
||||||
))]
|
|
||||||
let data0_config = slcr::DdriobConfig::zeroed()
|
let data0_config = slcr::DdriobConfig::zeroed()
|
||||||
.inp_type(slcr::DdriobInputType::VrefDifferential)
|
.inp_type(slcr::DdriobInputType::VrefDifferential)
|
||||||
.term_en(true)
|
.term_en(true)
|
||||||
.dci_type(slcr::DdriobDciType::Termination)
|
.dci_type(slcr::DdriobDciType::Termination)
|
||||||
.output_en(slcr::DdriobOutputEn::Obuf);
|
.output_en(slcr::DdriobOutputEn::Obuf);
|
||||||
#[cfg(any(
|
#[cfg(any(feature = "target_coraz7", feature = "target_kasli_soc"))]
|
||||||
feature = "target_coraz7",
|
let data1_config = slcr::DdriobConfig::zeroed()
|
||||||
feature = "target_ebaz4205",
|
.pullup_en(true);
|
||||||
feature = "target_redpitaya",
|
#[cfg(feature = "target_redpitaya")]
|
||||||
feature = "target_kasli_soc",
|
let data0_config = slcr::DdriobConfig::zeroed()
|
||||||
))]
|
.inp_type(slcr::DdriobInputType::VrefDifferential)
|
||||||
|
.term_en(true)
|
||||||
|
.dci_type(slcr::DdriobDciType::Termination)
|
||||||
|
.output_en(slcr::DdriobOutputEn::Obuf);
|
||||||
|
#[cfg(feature = "target_redpitaya")]
|
||||||
let data1_config = slcr::DdriobConfig::zeroed()
|
let data1_config = slcr::DdriobConfig::zeroed()
|
||||||
.pullup_en(true);
|
.pullup_en(true);
|
||||||
slcr.ddriob_data0.write(data0_config);
|
slcr.ddriob_data0.write(data0_config);
|
||||||
|
@ -181,23 +176,22 @@ impl DdrRam {
|
||||||
.output_en(slcr::DdriobOutputEn::Obuf);
|
.output_en(slcr::DdriobOutputEn::Obuf);
|
||||||
#[cfg(feature = "target_zc706")]
|
#[cfg(feature = "target_zc706")]
|
||||||
let diff1_config = diff0_config.clone();
|
let diff1_config = diff0_config.clone();
|
||||||
#[cfg(any(
|
#[cfg(any(feature = "target_coraz7", feature = "target_kasli_soc"))]
|
||||||
feature = "target_coraz7",
|
|
||||||
feature = "target_ebaz4205",
|
|
||||||
feature = "target_redpitaya",
|
|
||||||
feature = "target_kasli_soc",
|
|
||||||
))]
|
|
||||||
let diff0_config = slcr::DdriobConfig::zeroed()
|
let diff0_config = slcr::DdriobConfig::zeroed()
|
||||||
.inp_type(slcr::DdriobInputType::Differential)
|
.inp_type(slcr::DdriobInputType::Differential)
|
||||||
.term_en(true)
|
.term_en(true)
|
||||||
.dci_type(slcr::DdriobDciType::Termination)
|
.dci_type(slcr::DdriobDciType::Termination)
|
||||||
.output_en(slcr::DdriobOutputEn::Obuf);
|
.output_en(slcr::DdriobOutputEn::Obuf);
|
||||||
#[cfg(any(
|
#[cfg(any(feature = "target_coraz7", feature = "target_kasli_soc"))]
|
||||||
feature = "target_coraz7",
|
let diff1_config = slcr::DdriobConfig::zeroed()
|
||||||
feature = "target_ebaz4205",
|
.pullup_en(true);
|
||||||
feature = "target_redpitaya",
|
#[cfg(feature = "target_redpitaya")]
|
||||||
feature = "target_kasli_soc",
|
let diff0_config = slcr::DdriobConfig::zeroed()
|
||||||
))]
|
.inp_type(slcr::DdriobInputType::Differential)
|
||||||
|
.term_en(true)
|
||||||
|
.dci_type(slcr::DdriobDciType::Termination)
|
||||||
|
.output_en(slcr::DdriobOutputEn::Obuf);
|
||||||
|
#[cfg(feature = "target_redpitaya")]
|
||||||
let diff1_config = slcr::DdriobConfig::zeroed()
|
let diff1_config = slcr::DdriobConfig::zeroed()
|
||||||
.pullup_en(true);
|
.pullup_en(true);
|
||||||
slcr.ddriob_diff0.write(diff0_config);
|
slcr.ddriob_diff0.write(diff0_config);
|
||||||
|
@ -216,12 +210,7 @@ impl DdrRam {
|
||||||
slcr.ddriob_drive_slew_clock.write(0x00F9861C);
|
slcr.ddriob_drive_slew_clock.write(0x00F9861C);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(
|
#[cfg(any(feature = "target_coraz7", feature = "target_kasli_soc"))]
|
||||||
feature = "target_coraz7",
|
|
||||||
feature = "target_ebaz4205",
|
|
||||||
feature = "target_redpitaya",
|
|
||||||
feature = "target_kasli_soc",
|
|
||||||
))]
|
|
||||||
slcr.ddriob_ddr_ctrl.modify(|_, w| w
|
slcr.ddriob_ddr_ctrl.modify(|_, w| w
|
||||||
.vref_int_en(false)
|
.vref_int_en(false)
|
||||||
.vref_ext_en_lower(true)
|
.vref_ext_en_lower(true)
|
||||||
|
@ -235,6 +224,13 @@ impl DdrRam {
|
||||||
.vref_ext_en_lower(false)
|
.vref_ext_en_lower(false)
|
||||||
.vref_ext_en_upper(false)
|
.vref_ext_en_upper(false)
|
||||||
);
|
);
|
||||||
|
#[cfg(feature = "target_redpitaya")]
|
||||||
|
slcr.ddriob_ddr_ctrl.modify(|_, w| w
|
||||||
|
.vref_int_en(false)
|
||||||
|
.vref_ext_en_lower(true)
|
||||||
|
.vref_ext_en_upper(false)
|
||||||
|
.refio_en(true)
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,13 +242,6 @@ impl DdrRam {
|
||||||
.t_rfc_min(0x9e)
|
.t_rfc_min(0x9e)
|
||||||
.post_selfref_gap_x32(0x10)
|
.post_selfref_gap_x32(0x10)
|
||||||
);
|
);
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
self.regs.dram_param0.write(
|
|
||||||
regs::DramParam0::zeroed()
|
|
||||||
.t_rc(0x1a)
|
|
||||||
.t_rfc_min(0x56)
|
|
||||||
.post_selfref_gap_x32(0x10)
|
|
||||||
);
|
|
||||||
#[cfg(feature = "target_redpitaya")]
|
#[cfg(feature = "target_redpitaya")]
|
||||||
self.regs.dram_param0.write(
|
self.regs.dram_param0.write(
|
||||||
regs::DramParam0::zeroed()
|
regs::DramParam0::zeroed()
|
||||||
|
@ -267,12 +256,6 @@ impl DdrRam {
|
||||||
.t_rfc_min(0x56)
|
.t_rfc_min(0x56)
|
||||||
.post_selfref_gap_x32(0x10)
|
.post_selfref_gap_x32(0x10)
|
||||||
);
|
);
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
self.regs.dram_param1.modify(
|
|
||||||
|_, w| w
|
|
||||||
.t_faw(0x16)
|
|
||||||
.t_ras_min(0x13)
|
|
||||||
);
|
|
||||||
#[cfg(feature = "target_redpitaya")]
|
#[cfg(feature = "target_redpitaya")]
|
||||||
self.regs.dram_param1.modify(
|
self.regs.dram_param1.modify(
|
||||||
|_, w| w
|
|_, w| w
|
||||||
|
@ -294,11 +277,6 @@ impl DdrRam {
|
||||||
.rd2pre(0x4)
|
.rd2pre(0x4)
|
||||||
.t_rcd(0x7)
|
.t_rcd(0x7)
|
||||||
);
|
);
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
self.regs.dram_param3.modify(
|
|
||||||
|_, w| w
|
|
||||||
.t_rp(7)
|
|
||||||
);
|
|
||||||
#[cfg(feature = "target_redpitaya")]
|
#[cfg(feature = "target_redpitaya")]
|
||||||
self.regs.dram_param3.modify(
|
self.regs.dram_param3.modify(
|
||||||
|_, w| w
|
|_, w| w
|
||||||
|
@ -320,21 +298,19 @@ impl DdrRam {
|
||||||
.emr(0x4)
|
.emr(0x4)
|
||||||
);
|
);
|
||||||
|
|
||||||
#[cfg(any(
|
#[cfg(any(feature = "target_coraz7", feature = "target_kasli_soc"))]
|
||||||
feature = "target_coraz7",
|
|
||||||
feature = "target_ebaz4205",
|
|
||||||
feature = "target_redpitaya",
|
|
||||||
feature = "target_kasli_soc",
|
|
||||||
))]
|
|
||||||
self.regs.phy_configs[2].modify(
|
self.regs.phy_configs[2].modify(
|
||||||
|_, w| w.data_slice_in_use(false)
|
|_, w| w.data_slice_in_use(false)
|
||||||
);
|
);
|
||||||
#[cfg(any(
|
#[cfg(any(feature = "target_coraz7", feature = "target_kasli_soc"))]
|
||||||
feature = "target_coraz7",
|
self.regs.phy_configs[3].modify(
|
||||||
feature = "target_ebaz4205",
|
|_, w| w.data_slice_in_use(false)
|
||||||
feature = "target_redpitaya",
|
);
|
||||||
feature = "target_kasli_soc",
|
#[cfg(feature = "target_redpitaya")]
|
||||||
))]
|
self.regs.phy_configs[2].modify(
|
||||||
|
|_, w| w.data_slice_in_use(false)
|
||||||
|
);
|
||||||
|
#[cfg(feature = "target_redpitaya")]
|
||||||
self.regs.phy_configs[3].modify(
|
self.regs.phy_configs[3].modify(
|
||||||
|_, w| w.data_slice_in_use(false)
|
|_, w| w.data_slice_in_use(false)
|
||||||
);
|
);
|
||||||
|
@ -378,11 +354,7 @@ impl DdrRam {
|
||||||
.gatelvl_init_ratio(0xee)
|
.gatelvl_init_ratio(0xee)
|
||||||
);
|
);
|
||||||
|
|
||||||
#[cfg(any(
|
#[cfg(any(feature = "target_coraz7", feature = "target_kasli_soc"))]
|
||||||
feature = "target_coraz7",
|
|
||||||
feature = "target_ebaz4205",
|
|
||||||
feature = "target_kasli_soc"),
|
|
||||||
)]
|
|
||||||
self.regs.reg_64.modify(
|
self.regs.reg_64.modify(
|
||||||
|_, w| w
|
|_, w| w
|
||||||
.phy_ctrl_slave_ratio(0x100)
|
.phy_ctrl_slave_ratio(0x100)
|
||||||
|
@ -418,12 +390,9 @@ impl DdrRam {
|
||||||
fn reset_ddrc<F: FnMut(&mut Self)>(&mut self, mut f: F) {
|
fn reset_ddrc<F: FnMut(&mut Self)>(&mut self, mut f: F) {
|
||||||
#[cfg(feature = "target_zc706")]
|
#[cfg(feature = "target_zc706")]
|
||||||
let width = regs::DataBusWidth::Width32bit;
|
let width = regs::DataBusWidth::Width32bit;
|
||||||
#[cfg(any(
|
#[cfg(any(feature = "target_coraz7", feature = "target_kasli_soc"))]
|
||||||
feature = "target_coraz7",
|
let width = regs::DataBusWidth::Width16bit;
|
||||||
feature = "target_ebaz4205",
|
#[cfg(feature = "target_redpitaya")]
|
||||||
feature = "target_redpitaya",
|
|
||||||
feature = "target_kasli_soc",
|
|
||||||
))]
|
|
||||||
let width = regs::DataBusWidth::Width16bit;
|
let width = regs::DataBusWidth::Width16bit;
|
||||||
self.regs.ddrc_ctrl.modify(|_, w| w
|
self.regs.ddrc_ctrl.modify(|_, w| w
|
||||||
.soft_rstb(false)
|
.soft_rstb(false)
|
||||||
|
@ -441,7 +410,6 @@ impl DdrRam {
|
||||||
}
|
}
|
||||||
#[cfg(any(
|
#[cfg(any(
|
||||||
feature = "target_coraz7",
|
feature = "target_coraz7",
|
||||||
feature = "target_ebaz4205",
|
|
||||||
feature = "target_redpitaya",
|
feature = "target_redpitaya",
|
||||||
feature = "target_kasli_soc",
|
feature = "target_kasli_soc",
|
||||||
))]
|
))]
|
||||||
|
@ -482,8 +450,6 @@ impl DdrRam {
|
||||||
feature = "target_kasli_soc",
|
feature = "target_kasli_soc",
|
||||||
))]
|
))]
|
||||||
let megabytes = 512;
|
let megabytes = 512;
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
let megabytes = 256;
|
|
||||||
|
|
||||||
megabytes * 1024 * 1024
|
megabytes * 1024 * 1024
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,8 @@ impl ErrorLED {
|
||||||
.pullup(true)
|
.pullup(true)
|
||||||
.disable_rcvr(true)
|
.disable_rcvr(true)
|
||||||
);
|
);
|
||||||
|
// reset
|
||||||
|
slcr.gpio_rst_ctrl.reset_gpio();
|
||||||
});
|
});
|
||||||
|
|
||||||
Self::error_led_common(0xFFFF - 0x0080)
|
Self::error_led_common(0xFFFF - 0x0080)
|
||||||
|
|
|
@ -13,9 +13,6 @@ mod regs;
|
||||||
pub mod rx;
|
pub mod rx;
|
||||||
pub mod tx;
|
pub mod tx;
|
||||||
|
|
||||||
use super::time::Milliseconds;
|
|
||||||
use embedded_hal::timer::CountDown;
|
|
||||||
|
|
||||||
/// Size of all the buffers
|
/// Size of all the buffers
|
||||||
pub const MTU: usize = 1536;
|
pub const MTU: usize = 1536;
|
||||||
/// Maximum MDC clock
|
/// Maximum MDC clock
|
||||||
|
@ -65,31 +62,17 @@ impl Gem for Gem0 {
|
||||||
slcr.gem0_clk_ctrl.write(
|
slcr.gem0_clk_ctrl.write(
|
||||||
// 0x0050_0801: 8, 5: 100 Mb/s
|
// 0x0050_0801: 8, 5: 100 Mb/s
|
||||||
// ...: 8, 1: 1000 Mb/s
|
// ...: 8, 1: 1000 Mb/s
|
||||||
#[cfg(not(feature = "target_ebaz4205"))]
|
|
||||||
slcr::GemClkCtrl::zeroed()
|
slcr::GemClkCtrl::zeroed()
|
||||||
.clkact(true)
|
.clkact(true)
|
||||||
.srcsel(slcr::PllSource::IoPll)
|
.srcsel(slcr::PllSource::IoPll)
|
||||||
.divisor(divisor0 as u8)
|
.divisor(divisor0 as u8)
|
||||||
.divisor1(divisor1 as u8),
|
|
||||||
// ebaz4205 -- EMIO
|
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
slcr::GemClkCtrl::zeroed()
|
|
||||||
.clkact(true)
|
|
||||||
.srcsel(slcr::PllSource::Emio)
|
|
||||||
.divisor(divisor0 as u8)
|
|
||||||
.divisor1(divisor1 as u8)
|
.divisor1(divisor1 as u8)
|
||||||
);
|
);
|
||||||
// Enable gem0 recv clock
|
// Enable gem0 recv clock
|
||||||
slcr.gem0_rclk_ctrl.write(
|
slcr.gem0_rclk_ctrl.write(
|
||||||
// 0x0000_0801
|
// 0x0000_0801
|
||||||
#[cfg(not(feature = "target_ebaz4205"))]
|
|
||||||
slcr::RclkCtrl::zeroed()
|
|
||||||
.clkact(true),
|
|
||||||
// ebaz4205 -- EMIO
|
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
slcr::RclkCtrl::zeroed()
|
slcr::RclkCtrl::zeroed()
|
||||||
.clkact(true)
|
.clkact(true)
|
||||||
.srcsel(true)
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -168,7 +151,6 @@ pub struct Eth<GEM: Gem, RX, TX> {
|
||||||
|
|
||||||
impl Eth<Gem0, (), ()> {
|
impl Eth<Gem0, (), ()> {
|
||||||
pub fn eth0(macaddr: [u8; 6]) -> Self {
|
pub fn eth0(macaddr: [u8; 6]) -> Self {
|
||||||
#[cfg(not(feature = "target_ebaz4205"))]
|
|
||||||
slcr::RegisterBlock::unlocked(|slcr| {
|
slcr::RegisterBlock::unlocked(|slcr| {
|
||||||
// Manual example: 0x0000_1280
|
// Manual example: 0x0000_1280
|
||||||
// MDIO
|
// MDIO
|
||||||
|
@ -318,18 +300,11 @@ impl<GEM: Gem> Eth<GEM, (), ()> {
|
||||||
fn gem_common(macaddr: [u8; 6]) -> Self {
|
fn gem_common(macaddr: [u8; 6]) -> Self {
|
||||||
GEM::setup_clock(TX_1000);
|
GEM::setup_clock(TX_1000);
|
||||||
|
|
||||||
#[cfg(feature="target_kasli_soc")]
|
|
||||||
{
|
|
||||||
let mut eth_reset_pin = PhyRst::rst_pin();
|
|
||||||
eth_reset_pin.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut inner = EthInner {
|
let mut inner = EthInner {
|
||||||
gem: PhantomData,
|
gem: PhantomData,
|
||||||
link: None,
|
link: None,
|
||||||
};
|
};
|
||||||
inner.init();
|
inner.init();
|
||||||
|
|
||||||
inner.configure(macaddr);
|
inner.configure(macaddr);
|
||||||
|
|
||||||
let phy = Phy::find(&mut inner).expect("phy");
|
let phy = Phy::find(&mut inner).expect("phy");
|
||||||
|
@ -507,69 +482,6 @@ impl<'a, GEM: Gem> smoltcp::phy::Device<'a> for &mut Eth<GEM, rx::DescList, tx::
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct PhyRst {
|
|
||||||
regs: regs::GpioRegisterBlock,
|
|
||||||
count_down: super::timer::global::CountDown<Milliseconds>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl PhyRst {
|
|
||||||
pub fn rst_pin() -> Self {
|
|
||||||
slcr::RegisterBlock::unlocked(|slcr| {
|
|
||||||
// Hardware Reset for PHY
|
|
||||||
slcr.mio_pin_47.write(
|
|
||||||
slcr::MioPin47::zeroed()
|
|
||||||
.l3_sel(0b000)
|
|
||||||
.io_type(slcr::IoBufferType::Lvcmos18)
|
|
||||||
.pullup(true)
|
|
||||||
.disable_rcvr(true)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
Self::eth_reset_common(0xFFFF - 0x8000)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn delay_ms(&mut self, ms: u64) {
|
|
||||||
self.count_down.start(Milliseconds(ms));
|
|
||||||
nb::block!(self.count_down.wait()).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn eth_reset_common(gpio_output_mask: u16) -> Self {
|
|
||||||
let self_ = Self {
|
|
||||||
regs: regs::GpioRegisterBlock::regs(),
|
|
||||||
count_down: unsafe { super::timer::GlobalTimer::get() }.countdown(),
|
|
||||||
};
|
|
||||||
|
|
||||||
// Setup GPIO output mask
|
|
||||||
self_.regs.gpio_output_mask.modify(|_, w| {
|
|
||||||
w.mask(gpio_output_mask)
|
|
||||||
});
|
|
||||||
|
|
||||||
self_.regs.gpio_direction.modify(|_, w| {
|
|
||||||
w.phy_rst(true)
|
|
||||||
});
|
|
||||||
|
|
||||||
self_
|
|
||||||
}
|
|
||||||
|
|
||||||
fn oe(&mut self, oe: bool) {
|
|
||||||
self.regs.gpio_output_enable.modify(|_, w| {
|
|
||||||
w.phy_rst(oe)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn toggle(&mut self, o: bool) {
|
|
||||||
self.regs.gpio_output_mask.modify(|_, w| {
|
|
||||||
w.phy_rst(o)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn reset(&mut self) {
|
|
||||||
self.toggle(false); // drive phy_rst (active LOW) pin low
|
|
||||||
self.oe(true); // enable pin's output
|
|
||||||
self.delay_ms(10);
|
|
||||||
self.toggle(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct EthInner<GEM: Gem> {
|
struct EthInner<GEM: Gem> {
|
||||||
gem: PhantomData<GEM>,
|
gem: PhantomData<GEM>,
|
||||||
|
|
|
@ -83,7 +83,6 @@ pub struct Phy {
|
||||||
const OUI_MARVELL: u32 = 0x005043;
|
const OUI_MARVELL: u32 = 0x005043;
|
||||||
const OUI_REALTEK: u32 = 0x000732;
|
const OUI_REALTEK: u32 = 0x000732;
|
||||||
const OUI_LANTIQ : u32 = 0x355969;
|
const OUI_LANTIQ : u32 = 0x355969;
|
||||||
const OUI_ICPLUS : u32 = 0x0090c3;
|
|
||||||
|
|
||||||
//only change pages on Kasli-SoC's Marvel 88E11xx
|
//only change pages on Kasli-SoC's Marvel 88E11xx
|
||||||
#[cfg(feature="target_kasli_soc")]
|
#[cfg(feature="target_kasli_soc")]
|
||||||
|
@ -118,12 +117,6 @@ impl Phy {
|
||||||
model: 0,
|
model: 0,
|
||||||
..
|
..
|
||||||
}) => true,
|
}) => true,
|
||||||
Some(PhyIdentifier {
|
|
||||||
oui: OUI_ICPLUS,
|
|
||||||
// IP101G-DS-R01
|
|
||||||
model: 5,
|
|
||||||
rev: 4,
|
|
||||||
}) => true,
|
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}).map(|addr| Phy { addr })
|
}).map(|addr| Phy { addr })
|
||||||
|
|
|
@ -55,27 +55,7 @@ impl Status {
|
||||||
pub fn get_link(&self) -> Option<Link> {
|
pub fn get_link(&self) -> Option<Link> {
|
||||||
if ! self.link_status() {
|
if ! self.link_status() {
|
||||||
None
|
None
|
||||||
} else if self.cap_100base_tx_full() {
|
} else if self.cap_10base_t_half() {
|
||||||
Some(Link {
|
|
||||||
speed: LinkSpeed::S100,
|
|
||||||
duplex: LinkDuplex::Full,
|
|
||||||
})
|
|
||||||
} else if self.cap_100base_tx_half() {
|
|
||||||
Some(Link {
|
|
||||||
speed: LinkSpeed::S100,
|
|
||||||
duplex: LinkDuplex::Half,
|
|
||||||
})
|
|
||||||
} else if self.cap_100base_t4() {
|
|
||||||
Some(Link {
|
|
||||||
speed: LinkSpeed::S100,
|
|
||||||
duplex: LinkDuplex::Half,
|
|
||||||
})
|
|
||||||
} else if self.cap_10base_t2_full() {
|
|
||||||
Some(Link {
|
|
||||||
speed: LinkSpeed::S10,
|
|
||||||
duplex: LinkDuplex::Full,
|
|
||||||
})
|
|
||||||
} else if self.cap_10base_t2_half() {
|
|
||||||
Some(Link {
|
Some(Link {
|
||||||
speed: LinkSpeed::S10,
|
speed: LinkSpeed::S10,
|
||||||
duplex: LinkDuplex::Half,
|
duplex: LinkDuplex::Half,
|
||||||
|
@ -85,11 +65,31 @@ impl Status {
|
||||||
speed: LinkSpeed::S10,
|
speed: LinkSpeed::S10,
|
||||||
duplex: LinkDuplex::Full,
|
duplex: LinkDuplex::Full,
|
||||||
})
|
})
|
||||||
} else if self.cap_10base_t_half() {
|
} else if self.cap_10base_t2_half() {
|
||||||
Some(Link {
|
Some(Link {
|
||||||
speed: LinkSpeed::S10,
|
speed: LinkSpeed::S10,
|
||||||
duplex: LinkDuplex::Half,
|
duplex: LinkDuplex::Half,
|
||||||
})
|
})
|
||||||
|
} else if self.cap_10base_t2_full() {
|
||||||
|
Some(Link {
|
||||||
|
speed: LinkSpeed::S10,
|
||||||
|
duplex: LinkDuplex::Full,
|
||||||
|
})
|
||||||
|
} else if self.cap_100base_t4() {
|
||||||
|
Some(Link {
|
||||||
|
speed: LinkSpeed::S100,
|
||||||
|
duplex: LinkDuplex::Half,
|
||||||
|
})
|
||||||
|
} else if self.cap_100base_tx_half() {
|
||||||
|
Some(Link {
|
||||||
|
speed: LinkSpeed::S100,
|
||||||
|
duplex: LinkDuplex::Half,
|
||||||
|
})
|
||||||
|
} else if self.cap_100base_tx_full() {
|
||||||
|
Some(Link {
|
||||||
|
speed: LinkSpeed::S100,
|
||||||
|
duplex: LinkDuplex::Full,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,49 +110,6 @@ pub struct RegisterBlock {
|
||||||
pub design_cfg5: RO<u32>,
|
pub design_cfg5: RO<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct GpioRegisterBlock {
|
|
||||||
pub gpio_output_mask: &'static mut OutputMask,
|
|
||||||
pub gpio_direction: &'static mut Direction,
|
|
||||||
pub gpio_output_enable: &'static mut OutputEnable,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl GpioRegisterBlock {
|
|
||||||
pub fn regs() -> Self {
|
|
||||||
Self {
|
|
||||||
gpio_output_mask: OutputMask::new(),
|
|
||||||
gpio_direction: Direction::new(),
|
|
||||||
gpio_output_enable: OutputEnable::new(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
register!(gpio_output_mask,
|
|
||||||
/// MASK_DATA_1_SW:
|
|
||||||
/// Maskable output data for MIO[47:32]
|
|
||||||
OutputMask, RW, u32);
|
|
||||||
register_at!(OutputMask, 0xE000A008, new);
|
|
||||||
register_bit!(gpio_output_mask,
|
|
||||||
/// Output for PHY_RST (MIO[47])
|
|
||||||
phy_rst, 15);
|
|
||||||
register_bits!(gpio_output_mask,
|
|
||||||
mask, u16, 16, 31);
|
|
||||||
register!(gpio_direction,
|
|
||||||
/// DIRM_1:
|
|
||||||
/// Direction mode for MIO[53:32]; 0/1 = in/out
|
|
||||||
Direction, RW, u32);
|
|
||||||
register_at!(Direction, 0xE000A244, new);
|
|
||||||
register_bit!(gpio_direction,
|
|
||||||
/// Direction for PHY_RST
|
|
||||||
phy_rst, 15);
|
|
||||||
register!(gpio_output_enable,
|
|
||||||
/// OEN_1:
|
|
||||||
/// Output enable for MIO[53:32]
|
|
||||||
OutputEnable, RW, u32);
|
|
||||||
register_at!(OutputEnable, 0xE000A248, new);
|
|
||||||
register_bit!(gpio_output_enable,
|
|
||||||
/// Output enable for PHY_RST
|
|
||||||
phy_rst, 15);
|
|
||||||
|
|
||||||
register_at!(RegisterBlock, 0xE000B000, gem0);
|
register_at!(RegisterBlock, 0xE000B000, gem0);
|
||||||
register_at!(RegisterBlock, 0xE000C000, gem1);
|
register_at!(RegisterBlock, 0xE000C000, gem1);
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ impl InterruptController {
|
||||||
let m = (id.0 >> 2) as usize;
|
let m = (id.0 >> 2) as usize;
|
||||||
let n = (8 * (id.0 & 3)) as usize;
|
let n = (8 * (id.0 & 3)) as usize;
|
||||||
unsafe {
|
unsafe {
|
||||||
self.mpcore.icdiptr[m].modify(|mut icdiptr| *icdiptr.set_bits(n..=n+1, target_cpu as u32));
|
self.mpcore.icdiptr[m].modify(|mut icdiptr| *icdiptr.set_bits(n..=n+1, target_cpu as u32 + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
// sensitivity
|
// sensitivity
|
||||||
|
|
|
@ -4,7 +4,6 @@ use embedded_hal::timer::CountDown;
|
||||||
|
|
||||||
pub struct EEPROM<'a> {
|
pub struct EEPROM<'a> {
|
||||||
i2c: &'a mut I2c,
|
i2c: &'a mut I2c,
|
||||||
#[cfg(not(feature = "target_ebaz4205"))]
|
|
||||||
port: u8,
|
port: u8,
|
||||||
address: u8,
|
address: u8,
|
||||||
page_size: u8,
|
page_size: u8,
|
||||||
|
@ -47,11 +46,6 @@ impl<'a> EEPROM<'a> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
fn select(&mut self) -> Result<(), &'static str> {
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Random read
|
/// Random read
|
||||||
pub fn read<'r>(&mut self, addr: u8, buf: &'r mut [u8]) -> Result<(), &'static str> {
|
pub fn read<'r>(&mut self, addr: u8, buf: &'r mut [u8]) -> Result<(), &'static str> {
|
||||||
self.select()?;
|
self.select()?;
|
||||||
|
|
|
@ -2,13 +2,10 @@
|
||||||
|
|
||||||
mod regs;
|
mod regs;
|
||||||
pub mod eeprom;
|
pub mod eeprom;
|
||||||
#[cfg(not(feature = "target_ebaz4205"))]
|
|
||||||
use super::slcr;
|
use super::slcr;
|
||||||
use super::time::Microseconds;
|
use super::time::Microseconds;
|
||||||
use embedded_hal::timer::CountDown;
|
use embedded_hal::timer::CountDown;
|
||||||
use libregister::{RegisterR, RegisterRW};
|
use libregister::{RegisterR, RegisterRW, RegisterW};
|
||||||
#[cfg(not(feature = "target_ebaz4205"))]
|
|
||||||
use libregister::RegisterW;
|
|
||||||
#[cfg(feature = "target_kasli_soc")]
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
use log::info;
|
use log::info;
|
||||||
|
|
||||||
|
@ -25,10 +22,9 @@ pub struct I2c {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl I2c {
|
impl I2c {
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
pub fn i2c0() -> Self {
|
pub fn i2c0() -> Self {
|
||||||
// Route I2C 0 SCL / SDA Signals to MIO Pins 50 / 51
|
// Route I2C 0 SCL / SDA Signals to MIO Pins 50 / 51
|
||||||
#[cfg(not(feature = "target_ebaz4205"))]
|
|
||||||
slcr::RegisterBlock::unlocked(|slcr| {
|
slcr::RegisterBlock::unlocked(|slcr| {
|
||||||
// SCL
|
// SCL
|
||||||
slcr.mio_pin_50.write(
|
slcr.mio_pin_50.write(
|
||||||
|
@ -57,6 +53,8 @@ impl I2c {
|
||||||
.pullup(false)
|
.pullup(false)
|
||||||
.disable_rcvr(true)
|
.disable_rcvr(true)
|
||||||
);
|
);
|
||||||
|
// Reset
|
||||||
|
slcr.gpio_rst_ctrl.reset_gpio();
|
||||||
});
|
});
|
||||||
|
|
||||||
Self::i2c_common(0xFFFF - 0x000C, 0xFFFF - 0x0002)
|
Self::i2c_common(0xFFFF - 0x000C, 0xFFFF - 0x0002)
|
||||||
|
|
|
@ -21,7 +21,6 @@ use libregister::{
|
||||||
// Current compatibility:
|
// Current compatibility:
|
||||||
// zc706: GPIO 50, 51 == SCL, SDA
|
// zc706: GPIO 50, 51 == SCL, SDA
|
||||||
// kasli_soc: GPIO 50, 51 == SCL, SDA; GPIO 33 == I2C_SW_RESET
|
// kasli_soc: GPIO 50, 51 == SCL, SDA; GPIO 33 == I2C_SW_RESET
|
||||||
// ebaz4205: GPIO (EMIO)
|
|
||||||
|
|
||||||
pub struct RegisterBlock {
|
pub struct RegisterBlock {
|
||||||
pub gpio_output_mask: &'static mut GPIOOutputMask,
|
pub gpio_output_mask: &'static mut GPIOOutputMask,
|
||||||
|
@ -49,17 +48,17 @@ register!(gpio_output_mask,
|
||||||
/// MASK_DATA_1_MSW:
|
/// MASK_DATA_1_MSW:
|
||||||
/// Maskable output data for MIO[53:48]
|
/// Maskable output data for MIO[53:48]
|
||||||
GPIOOutputMask, RW, u32);
|
GPIOOutputMask, RW, u32);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_at!(GPIOOutputMask, 0xE000A00C, new);
|
register_at!(GPIOOutputMask, 0xE000A00C, new);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_bit!(gpio_output_mask,
|
register_bit!(gpio_output_mask,
|
||||||
/// Output for SCL
|
/// Output for SCL
|
||||||
scl_o, 2);
|
scl_o, 2);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_bit!(gpio_output_mask,
|
register_bit!(gpio_output_mask,
|
||||||
/// Output for SDA
|
/// Output for SDA
|
||||||
sda_o, 3);
|
sda_o, 3);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_bits!(gpio_output_mask,
|
register_bits!(gpio_output_mask,
|
||||||
/// Mask for keeping bits except SCL and SDA unchanged
|
/// Mask for keeping bits except SCL and SDA unchanged
|
||||||
mask, u16, 16, 31);
|
mask, u16, 16, 31);
|
||||||
|
@ -83,13 +82,13 @@ register!(gpio_input,
|
||||||
/// DATA_1_RO:
|
/// DATA_1_RO:
|
||||||
/// Input data for MIO[53:32]
|
/// Input data for MIO[53:32]
|
||||||
GPIOInput, RO, u32);
|
GPIOInput, RO, u32);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_at!(GPIOInput, 0xE000A064, new);
|
register_at!(GPIOInput, 0xE000A064, new);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_bit!(gpio_input,
|
register_bit!(gpio_input,
|
||||||
/// Input for SCL
|
/// Input for SCL
|
||||||
scl, 18);
|
scl, 18);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_bit!(gpio_input,
|
register_bit!(gpio_input,
|
||||||
/// Input for SDA
|
/// Input for SDA
|
||||||
sda, 19);
|
sda, 19);
|
||||||
|
@ -99,13 +98,13 @@ register!(gpio_direction,
|
||||||
/// DIRM_1:
|
/// DIRM_1:
|
||||||
/// Direction mode for MIO[53:32]; 0/1 = in/out
|
/// Direction mode for MIO[53:32]; 0/1 = in/out
|
||||||
GPIODirection, RW, u32);
|
GPIODirection, RW, u32);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_at!(GPIODirection, 0xE000A244, new);
|
register_at!(GPIODirection, 0xE000A244, new);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_bit!(gpio_direction,
|
register_bit!(gpio_direction,
|
||||||
/// Direction for SCL
|
/// Direction for SCL
|
||||||
scl, 18);
|
scl, 18);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_bit!(gpio_direction,
|
register_bit!(gpio_direction,
|
||||||
/// Direction for SDA
|
/// Direction for SDA
|
||||||
sda, 19);
|
sda, 19);
|
||||||
|
@ -118,13 +117,13 @@ register!(gpio_output_enable,
|
||||||
/// OEN_1:
|
/// OEN_1:
|
||||||
/// Output enable for MIO[53:32]
|
/// Output enable for MIO[53:32]
|
||||||
GPIOOutputEnable, RW, u32);
|
GPIOOutputEnable, RW, u32);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_at!(GPIOOutputEnable, 0xE000A248, new);
|
register_at!(GPIOOutputEnable, 0xE000A248, new);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_bit!(gpio_output_enable,
|
register_bit!(gpio_output_enable,
|
||||||
/// Output enable for SCL
|
/// Output enable for SCL
|
||||||
scl, 18);
|
scl, 18);
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
register_bit!(gpio_output_enable,
|
register_bit!(gpio_output_enable,
|
||||||
/// Output enable for SDA
|
/// Output enable for SDA
|
||||||
sda, 19);
|
sda, 19);
|
||||||
|
|
|
@ -19,7 +19,7 @@ pub mod gic;
|
||||||
pub mod time;
|
pub mod time;
|
||||||
pub mod timer;
|
pub mod timer;
|
||||||
pub mod sdio;
|
pub mod sdio;
|
||||||
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc", feature = "target_ebaz4205"))]
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
pub mod i2c;
|
pub mod i2c;
|
||||||
pub mod logger;
|
pub mod logger;
|
||||||
pub mod ps7_init;
|
pub mod ps7_init;
|
||||||
|
|
|
@ -116,8 +116,8 @@ impl Sdio {
|
||||||
.speed(true),
|
.speed(true),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// kasli_soc and redpitaya card detect pin
|
// redpitaya card detect pin
|
||||||
#[cfg(any(feature = "target_kasli_soc", feature = "target_redpitaya"))]
|
#[cfg(any(feature = "target_redpitaya", feature = "target_kasli_soc"))]
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
slcr.sd0_wp_cd_sel.write(46 << 16);
|
slcr.sd0_wp_cd_sel.write(46 << 16);
|
||||||
|
@ -128,20 +128,6 @@ impl Sdio {
|
||||||
.speed(true),
|
.speed(true),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// ebaz4205 card detect pin
|
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
{
|
|
||||||
unsafe {
|
|
||||||
slcr.sd0_wp_cd_sel.write(34 << 16);
|
|
||||||
}
|
|
||||||
slcr.mio_pin_34.write(
|
|
||||||
slcr::MioPin34::zeroed()
|
|
||||||
.io_type(slcr::IoBufferType::Lvcmos33)
|
|
||||||
.pullup(true)
|
|
||||||
.speed(true),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
slcr.sdio_rst_ctrl.reset_sdio0();
|
slcr.sdio_rst_ctrl.reset_sdio0();
|
||||||
slcr.aper_clk_ctrl.enable_sdio0();
|
slcr.aper_clk_ctrl.enable_sdio0();
|
||||||
slcr.sdio_clk_ctrl.enable_sdio0();
|
slcr.sdio_clk_ctrl.enable_sdio0();
|
||||||
|
|
|
@ -9,11 +9,9 @@ use libregister::{
|
||||||
|
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
pub enum PllSource {
|
pub enum PllSource {
|
||||||
IoPll = 0b000,
|
IoPll = 0b00,
|
||||||
ArmPll = 0b010,
|
ArmPll = 0b10,
|
||||||
DdrPll = 0b011,
|
DdrPll = 0b11,
|
||||||
// Ethernet controller 0 EMIO clock
|
|
||||||
Emio = 0b100,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
|
|
|
@ -47,11 +47,7 @@ impl DerefMut for LazyUart {
|
||||||
LazyUart::Uninitialized => {
|
LazyUart::Uninitialized => {
|
||||||
#[cfg(any(feature = "target_coraz7", feature = "target_redpitaya"))]
|
#[cfg(any(feature = "target_coraz7", feature = "target_redpitaya"))]
|
||||||
let uart = Uart::uart0(UART_RATE);
|
let uart = Uart::uart0(UART_RATE);
|
||||||
#[cfg(any(
|
#[cfg(any(feature = "target_zc706", feature = "target_kasli_soc"))]
|
||||||
feature = "target_zc706",
|
|
||||||
feature = "target_ebaz4205",
|
|
||||||
feature = "target_kasli_soc",
|
|
||||||
))]
|
|
||||||
let uart = Uart::uart1(UART_RATE);
|
let uart = Uart::uart1(UART_RATE);
|
||||||
*self = LazyUart::Initialized(uart);
|
*self = LazyUart::Initialized(uart);
|
||||||
self
|
self
|
||||||
|
|
|
@ -79,39 +79,6 @@ impl Uart {
|
||||||
self_
|
self_
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
pub fn uart1(baudrate: u32) -> Self {
|
|
||||||
slcr::RegisterBlock::unlocked(|slcr| {
|
|
||||||
// Route UART 1 RxD/TxD Signals to MIO Pins
|
|
||||||
// TX pin
|
|
||||||
slcr.mio_pin_24.write(
|
|
||||||
slcr::MioPin24::zeroed()
|
|
||||||
.l3_sel(0b111)
|
|
||||||
.io_type(slcr::IoBufferType::Lvcmos33)
|
|
||||||
.pullup(true)
|
|
||||||
);
|
|
||||||
// RX pin
|
|
||||||
slcr.mio_pin_25.write(
|
|
||||||
slcr::MioPin25::zeroed()
|
|
||||||
.tri_enable(true)
|
|
||||||
.l3_sel(0b111)
|
|
||||||
.io_type(slcr::IoBufferType::Lvcmos33)
|
|
||||||
.pullup(true)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
slcr::RegisterBlock::unlocked(|slcr| {
|
|
||||||
slcr.uart_rst_ctrl.reset_uart1();
|
|
||||||
slcr.aper_clk_ctrl.enable_uart1();
|
|
||||||
slcr.uart_clk_ctrl.enable_uart1();
|
|
||||||
});
|
|
||||||
let mut self_ = Uart {
|
|
||||||
regs: regs::RegisterBlock::uart1(),
|
|
||||||
};
|
|
||||||
self_.configure(baudrate);
|
|
||||||
self_
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn write_byte(&mut self, value: u8) {
|
pub fn write_byte(&mut self, value: u8) {
|
||||||
while self.tx_fifo_full() {}
|
while self.tx_fifo_full() {}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@ log = "0.4"
|
||||||
[features]
|
[features]
|
||||||
target_zc706 = []
|
target_zc706 = []
|
||||||
target_coraz7 = []
|
target_coraz7 = []
|
||||||
target_ebaz4205 = []
|
|
||||||
target_redpitaya = []
|
target_redpitaya = []
|
||||||
target_kasli_soc = []
|
target_kasli_soc = []
|
||||||
ipv6 = []
|
ipv6 = []
|
||||||
|
|
|
@ -59,10 +59,6 @@ pub fn get_addresses(cfg: &Config) -> NetAddresses {
|
||||||
let mut hardware_addr = get_address_from_eeprom();
|
let mut hardware_addr = get_address_from_eeprom();
|
||||||
#[cfg(feature = "target_kasli_soc")]
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
let mut ipv4_addr = IpAddress::v4(192, 168, 1, 56);
|
let mut ipv4_addr = IpAddress::v4(192, 168, 1, 56);
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
let mut hardware_addr = EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x57]);
|
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
let mut ipv4_addr = IpAddress::v4(192, 168, 1, 57);
|
|
||||||
|
|
||||||
if let Ok(Ok(addr)) = cfg.read_str("mac").map(|s| s.parse()) {
|
if let Ok(Ok(addr)) = cfg.read_str("mac").map(|s| s.parse()) {
|
||||||
hardware_addr = addr;
|
hardware_addr = addr;
|
||||||
|
|
|
@ -34,12 +34,6 @@ pub fn isb() {
|
||||||
unsafe { llvm_asm!("isb" :::: "volatile") }
|
unsafe { llvm_asm!("isb" :::: "volatile") }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Enable FIQ
|
|
||||||
#[inline]
|
|
||||||
pub unsafe fn enable_fiq() {
|
|
||||||
llvm_asm!("cpsie f":::: "volatile");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Enable IRQ
|
/// Enable IRQ
|
||||||
#[inline]
|
#[inline]
|
||||||
pub unsafe fn enable_irq() {
|
pub unsafe fn enable_irq() {
|
||||||
|
|
|
@ -125,8 +125,8 @@ pub fn dcciall() {
|
||||||
dsb();
|
dsb();
|
||||||
}
|
}
|
||||||
|
|
||||||
const CACHE_LINE: usize = 0x20;
|
pub const CACHE_LINE: usize = 0x20;
|
||||||
const CACHE_LINE_MASK: usize = CACHE_LINE - 1;
|
pub const CACHE_LINE_MASK: usize = CACHE_LINE - 1;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn cache_line_addrs(first_addr: usize, beyond_addr: usize) -> impl Iterator<Item = usize> {
|
fn cache_line_addrs(first_addr: usize, beyond_addr: usize) -> impl Iterator<Item = usize> {
|
||||||
|
@ -136,13 +136,13 @@ fn cache_line_addrs(first_addr: usize, beyond_addr: usize) -> impl Iterator<Item
|
||||||
(first_addr..beyond_addr).step_by(CACHE_LINE)
|
(first_addr..beyond_addr).step_by(CACHE_LINE)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn object_cache_line_addrs<T>(object: &T) -> impl Iterator<Item = usize> {
|
pub fn object_cache_line_addrs<T>(object: &T) -> impl Iterator<Item = usize> {
|
||||||
let first_addr = object as *const _ as usize;
|
let first_addr = object as *const _ as usize;
|
||||||
let beyond_addr = (object as *const _ as usize) + core::mem::size_of_val(object);
|
let beyond_addr = (object as *const _ as usize) + core::mem::size_of_val(object);
|
||||||
cache_line_addrs(first_addr, beyond_addr)
|
cache_line_addrs(first_addr, beyond_addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn slice_cache_line_addrs<T>(slice: &[T]) -> impl Iterator<Item = usize> {
|
pub fn slice_cache_line_addrs<T>(slice: &[T]) -> impl Iterator<Item = usize> {
|
||||||
let first_addr = &slice[0] as *const _ as usize;
|
let first_addr = &slice[0] as *const _ as usize;
|
||||||
let beyond_addr = (&slice[slice.len() - 1] as *const _ as usize) +
|
let beyond_addr = (&slice[slice.len() - 1] as *const _ as usize) +
|
||||||
core::mem::size_of_val(&slice[slice.len() - 1]);
|
core::mem::size_of_val(&slice[slice.len() - 1]);
|
||||||
|
|
|
@ -36,9 +36,7 @@ pub fn notify_spin_lock() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
/// Interrupt handler, which setup the stack and preserve registers before jumping to actual interrupt handler.
|
/// Interrupt handler, which setup the stack and jump to actual interrupt handler.
|
||||||
/// Registers r0-r12, PC, SP and CPSR are restored after the actual handler.
|
|
||||||
///
|
|
||||||
/// - `name` is the name of the interrupt, should be the same as the one defined in vector table.
|
/// - `name` is the name of the interrupt, should be the same as the one defined in vector table.
|
||||||
/// - `name2` is the name for the actual handler, should be different from name.
|
/// - `name2` is the name for the actual handler, should be different from name.
|
||||||
/// - `stack0` is the stack for the interrupt handler when called from core0.
|
/// - `stack0` is the stack for the interrupt handler when called from core0.
|
||||||
|
@ -46,7 +44,8 @@ pub fn notify_spin_lock() {
|
||||||
/// - `body` is the body of the actual interrupt handler, should be a normal unsafe rust function
|
/// - `body` is the body of the actual interrupt handler, should be a normal unsafe rust function
|
||||||
/// body.
|
/// body.
|
||||||
///
|
///
|
||||||
/// Note that the interrupt handler would use the same stack as normal programs by default.
|
/// Note that the interrupt handler would use the same stack as normal programs by default, so
|
||||||
|
/// interrupt handlers should not return to normal program or it may corrupt the stack.
|
||||||
macro_rules! interrupt_handler {
|
macro_rules! interrupt_handler {
|
||||||
($name:ident, $name2:ident, $stack0:ident, $stack1:ident, $body:block) => {
|
($name:ident, $name2:ident, $stack0:ident, $stack1:ident, $body:block) => {
|
||||||
#[link_section = ".text.boot"]
|
#[link_section = ".text.boot"]
|
||||||
|
@ -55,27 +54,19 @@ macro_rules! interrupt_handler {
|
||||||
pub unsafe extern "C" fn $name() -> ! {
|
pub unsafe extern "C" fn $name() -> ! {
|
||||||
asm!(
|
asm!(
|
||||||
// setup SP, depending on CPU 0 or 1
|
// setup SP, depending on CPU 0 or 1
|
||||||
// and preserve registers
|
|
||||||
"sub lr, lr, #4",
|
|
||||||
"stmfd sp!, {{r0-r12, lr}}",
|
|
||||||
"mrc p15, #0, r0, c0, c0, #5",
|
"mrc p15, #0, r0, c0, c0, #5",
|
||||||
concat!("movw r1, :lower16:", stringify!($stack0)),
|
concat!("movw r1, :lower16:", stringify!($stack0)),
|
||||||
concat!("movt r1, :upper16:", stringify!($stack0)),
|
concat!("movt r1, :upper16:", stringify!($stack0)),
|
||||||
"tst r0, #3",
|
"tst r0, #3",
|
||||||
concat!("movwne r1, :lower16:", stringify!($stack1)),
|
concat!("movwne r1, :lower16:", stringify!($stack1)),
|
||||||
concat!("movtne r1, :upper16:", stringify!($stack1)),
|
concat!("movtne r1, :upper16:", stringify!($stack1)),
|
||||||
"mov r0, sp",
|
|
||||||
"mov sp, r1",
|
"mov sp, r1",
|
||||||
"push {{r0, r1}}", // 2 registers are pushed to maintain 8 byte stack alignment
|
|
||||||
concat!("bl ", stringify!($name2)),
|
concat!("bl ", stringify!($name2)),
|
||||||
"pop {{r0, r1}}",
|
|
||||||
"mov sp, r0",
|
|
||||||
"ldmfd sp!, {{r0-r12, pc}}^", // caret ^ : copy SPSR to the CPSR
|
|
||||||
options(noreturn)
|
options(noreturn)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn $name2() $body
|
pub unsafe extern "C" fn $name2() -> ! $body
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ use libregister::{
|
||||||
RegisterR, RegisterW, RegisterRW,
|
RegisterR, RegisterW, RegisterRW,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
macro_rules! def_reg_r {
|
macro_rules! def_reg_r {
|
||||||
($name:tt, $type: ty, $asm_instr:tt) => {
|
($name:tt, $type: ty, $asm_instr:tt) => {
|
||||||
impl RegisterR for $name {
|
impl RegisterR for $name {
|
||||||
|
@ -18,6 +19,7 @@ macro_rules! def_reg_r {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
macro_rules! def_reg_w {
|
macro_rules! def_reg_w {
|
||||||
($name:ty, $type:ty, $asm_instr:tt) => {
|
($name:ty, $type:ty, $asm_instr:tt) => {
|
||||||
impl RegisterW for $name {
|
impl RegisterW for $name {
|
||||||
|
@ -37,6 +39,7 @@ macro_rules! def_reg_w {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
macro_rules! wrap_reg {
|
macro_rules! wrap_reg {
|
||||||
($mod_name: ident) => {
|
($mod_name: ident) => {
|
||||||
pub mod $mod_name {
|
pub mod $mod_name {
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
[package]
|
||||||
|
name = "libcortex_r5"
|
||||||
|
version = "0.0.0"
|
||||||
|
authors = ["M-Labs"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
power_saving = []
|
||||||
|
default = []
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bit_field = "0.10"
|
||||||
|
volatile-register = "0.2"
|
||||||
|
libregister = { path = "../libregister" }
|
||||||
|
libcortex_a9 = { path = "../libcortex_a9" }
|
|
@ -0,0 +1 @@
|
||||||
|
pub use libcortex_a9::asm::*;
|
|
@ -0,0 +1,87 @@
|
||||||
|
/// Basically same as the Cortex A9 but with no L2
|
||||||
|
pub use libcortex_a9::cache::{
|
||||||
|
iciallu,
|
||||||
|
dcisw,
|
||||||
|
dccsw,
|
||||||
|
dccisw,
|
||||||
|
dccimvac,
|
||||||
|
dccmvac,
|
||||||
|
dcimvac,
|
||||||
|
object_cache_line_addrs,
|
||||||
|
slice_cache_line_addrs,
|
||||||
|
CACHE_LINE,
|
||||||
|
CACHE_LINE_MASK
|
||||||
|
};
|
||||||
|
use super::asm::{dmb, dsb};
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn dciall() {
|
||||||
|
unsafe {
|
||||||
|
llvm_asm!("mcr p15, 0, $0, c15, c5, 0")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// D$ clean and invalidate
|
||||||
|
pub fn dcci<T>(object: &T) {
|
||||||
|
dmb();
|
||||||
|
for addr in object_cache_line_addrs(object) {
|
||||||
|
dccimvac(addr);
|
||||||
|
}
|
||||||
|
dsb();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dcci_slice<T>(slice: &[T]) {
|
||||||
|
dmb();
|
||||||
|
for addr in slice_cache_line_addrs(slice) {
|
||||||
|
dccimvac(addr);
|
||||||
|
}
|
||||||
|
dsb();
|
||||||
|
}
|
||||||
|
|
||||||
|
// D$ clean
|
||||||
|
pub fn dcc<T>(object: &T) {
|
||||||
|
dmb();
|
||||||
|
for addr in object_cache_line_addrs(object) {
|
||||||
|
dccmvac(addr);
|
||||||
|
}
|
||||||
|
dsb();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dcc_slice<T>(slice: &[T]) {
|
||||||
|
if slice.len() == 0 {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dmb();
|
||||||
|
for addr in slice_cache_line_addrs(slice) {
|
||||||
|
dccmvac(addr);
|
||||||
|
}
|
||||||
|
dsb();
|
||||||
|
}
|
||||||
|
|
||||||
|
// D$ invalidate
|
||||||
|
pub unsafe fn dci<T>(object: &mut T) {
|
||||||
|
let first_addr = object as *const _ as usize;
|
||||||
|
let beyond_addr = (object as *const _ as usize) + core::mem::size_of_val(object);
|
||||||
|
assert_eq!(first_addr & CACHE_LINE_MASK, 0, "dci object first_addr must be aligned");
|
||||||
|
assert_eq!(beyond_addr & CACHE_LINE_MASK, 0, "dci object beyond_addr must be aligned");
|
||||||
|
|
||||||
|
dmb();
|
||||||
|
for addr in (first_addr..beyond_addr).step_by(CACHE_LINE) {
|
||||||
|
dcimvac(addr);
|
||||||
|
}
|
||||||
|
dsb();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub unsafe fn dci_slice<T>(slice: &mut [T]) {
|
||||||
|
let first_addr = &slice[0] as *const _ as usize;
|
||||||
|
let beyond_addr = (&slice[slice.len() - 1] as *const _ as usize) +
|
||||||
|
core::mem::size_of_val(&slice[slice.len() - 1]);
|
||||||
|
assert_eq!(first_addr & CACHE_LINE_MASK, 0, "dci slice first_addr must be aligned");
|
||||||
|
assert_eq!(beyond_addr & CACHE_LINE_MASK, 0, "dci slice beyond_addr must be aligned");
|
||||||
|
|
||||||
|
dmb();
|
||||||
|
for addr in (first_addr..beyond_addr).step_by(CACHE_LINE) {
|
||||||
|
dcimvac(addr);
|
||||||
|
}
|
||||||
|
dsb();
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
#![no_std]
|
||||||
|
#![feature(llvm_asm, global_asm)]
|
||||||
|
#![feature(never_type)]
|
||||||
|
#![feature(const_fn)]
|
||||||
|
|
||||||
|
extern crate alloc;
|
||||||
|
|
||||||
|
pub mod asm;
|
||||||
|
pub mod regs;
|
||||||
|
pub mod cache;
|
|
@ -0,0 +1,374 @@
|
||||||
|
use libregister::{
|
||||||
|
register_bit, register_bits,
|
||||||
|
RegisterR, RegisterW, RegisterRW,
|
||||||
|
};
|
||||||
|
use libcortex_a9::{def_reg_r, def_reg_w, wrap_reg};
|
||||||
|
pub use libcortex_a9::regs::{SP, LR};
|
||||||
|
|
||||||
|
|
||||||
|
/// Multiprocessor Affinity Register
|
||||||
|
pub struct MPIDR;
|
||||||
|
wrap_reg!(mpidr);
|
||||||
|
def_reg_r!(MPIDR, mpidr::Read, "mrc p15, 0, $0, c0, c0, 5");
|
||||||
|
// CPU ID
|
||||||
|
register_bits!(mpidr, cpu_id, u8, 0, 7);
|
||||||
|
// group ID
|
||||||
|
register_bits!(mpidr, group_id, u8, 8, 15);
|
||||||
|
// 0b11 if part of uniprocessor system
|
||||||
|
register_bits!(mpidr, u, u8, 30, 31);
|
||||||
|
|
||||||
|
/// System Control Register
|
||||||
|
pub struct SCTLR;
|
||||||
|
wrap_reg!(sctlr);
|
||||||
|
def_reg_r!(SCTLR, sctlr::Read, "mrc p15, 0, $0, c1, c0, 0");
|
||||||
|
def_reg_w!(SCTLR, sctlr::Write, "mrc p15, 0, $0, c1, c0, 0");
|
||||||
|
// MPU enable
|
||||||
|
register_bit!(sctlr, m, 0);
|
||||||
|
// strict alignment
|
||||||
|
register_bit!(sctlr, a, 1);
|
||||||
|
// L1 data cache enable
|
||||||
|
register_bit!(sctlr, c, 2);
|
||||||
|
// enable SWP and SWPB instructions
|
||||||
|
register_bit!(sctlr, sw, 10);
|
||||||
|
// enable branch prediction (SBO)
|
||||||
|
register_bit!(sctlr, z, 11);
|
||||||
|
// L1 instruction cache enable
|
||||||
|
register_bit!(sctlr, i, 12);
|
||||||
|
// Determines the location of exception vectors:
|
||||||
|
// 0 = normal exception vectors selected, address range = 0x00000000-0x0000001C
|
||||||
|
// 1 = high exception vectors (HIVECS) selected, address range = 0xFFFF0000-0xFFFF001C.
|
||||||
|
// The primary input VINITHIm defines the reset value.
|
||||||
|
register_bit!(sctlr, v, 13);
|
||||||
|
// Round-robin bit, controls replacement strategy for instruction and data caches:
|
||||||
|
// 0 = random replacement strategy
|
||||||
|
// 1 = round-robin replacement strategy.
|
||||||
|
// The reset value of this bit is 0. The processor always uses a random replacement strategy, regardless of the state
|
||||||
|
// of this bit.
|
||||||
|
register_bit!(sctlr, rr, 14);
|
||||||
|
// MPU background region enable
|
||||||
|
register_bit!(sctlr, br, 17);
|
||||||
|
// Divide by zero:
|
||||||
|
// 0 = do not generate an Undefined Instruction exception
|
||||||
|
// 1 = generate an Undefined Instruction exception.
|
||||||
|
// The reset value of this bit is 0
|
||||||
|
register_bit!(sctlr, dz, 19);
|
||||||
|
// Fast Interrupts enable.
|
||||||
|
// On the processor Fast Interrupts are always enabled. This bit is SBO
|
||||||
|
register_bit!(sctlr, fi, 21);
|
||||||
|
// Configures vectored interrupt:
|
||||||
|
// 0 = exception vector address for IRQ is 0x00000018 or 0xFFFF0018. See V bit.
|
||||||
|
// 1 = VIC controller provides handler address for IRQ.
|
||||||
|
// The reset value of this bit is 0.
|
||||||
|
register_bit!(sctlr, ve, 24);
|
||||||
|
// Determines how the E bit in the CPSR is set on an exception:
|
||||||
|
// 0 = CPSR E bit is set to 0 on an exception
|
||||||
|
// 1 = CPSR E bit is set to 1 on an exception.
|
||||||
|
// The primary input CFGEE defines the reset value.
|
||||||
|
register_bit!(sctlr, ee, 25);
|
||||||
|
// NMFI, non-maskable fast interrupt enable:
|
||||||
|
// 0 = Software can disable FIQs
|
||||||
|
// 1 = Software cannot disable FIQs.
|
||||||
|
// This bit is read-only. The configuration input CFGNMFIm defines its value.
|
||||||
|
register_bit!(sctlr, nmfi, 27);
|
||||||
|
// TEX Remap Enable. On the processor this bit is SBZ.
|
||||||
|
register_bit!(sctlr, tre, 28);
|
||||||
|
// Access Flag Enable. On the processor this bit is SBZ.
|
||||||
|
register_bit!(sctlr, afe, 29);
|
||||||
|
// Thumb exception enable:
|
||||||
|
// 0 = enable ARM exception generation
|
||||||
|
// 1 = enable Thumb exception generation.
|
||||||
|
// The primary input TEINIT defines the reset value
|
||||||
|
register_bit!(sctlr, te, 30);
|
||||||
|
// Identifies little or big instruction endianness in use:
|
||||||
|
// 0 = little-endianness
|
||||||
|
// 1 = big-endianness.
|
||||||
|
// The primary input CFGIE defines the value. This bit is read-only
|
||||||
|
register_bit!(sctlr, ie, 31);
|
||||||
|
|
||||||
|
/// Auxiliary Control Register
|
||||||
|
pub struct ACTLR;
|
||||||
|
wrap_reg!(actlr);
|
||||||
|
def_reg_r!(ACTLR, actlr::Read, "mrc p15, 0, $0, c1, c0, 1");
|
||||||
|
def_reg_w!(ACTLR, actlr::Write, "mcr p15, 0, $0, c1, c0, 1");
|
||||||
|
// A(B0/1)TCM external error enable:
|
||||||
|
// 0 = Disabled
|
||||||
|
// 1 = Enabled.
|
||||||
|
// The primary input ERRENRAMm[0] defines the reset value.
|
||||||
|
register_bit!(actlr, atcmecen, 0);
|
||||||
|
register_bit!(actlr, b0tcmecen, 1);
|
||||||
|
register_bit!(actlr, b1tcmecen, 2);
|
||||||
|
// Cache error control for cache parity and ECC errors
|
||||||
|
register_bits!(actlr, cec, u8, 3, 5);
|
||||||
|
// Disable low interrupt latency on all load/store instructions
|
||||||
|
register_bit!(actlr, dils, 6);
|
||||||
|
// sMOV of a divide does not complete out of order.
|
||||||
|
// No other instruction is issued until the divide is finished
|
||||||
|
register_bit!(actlr, smov, 7);
|
||||||
|
// Force D-side to not-shared when MPU is off:
|
||||||
|
// 0 = Normal operation. This is the reset value.
|
||||||
|
// 1 = D-side normal Non-cacheable forced to Non-shared when MPU is off.
|
||||||
|
register_bit!(actlr, fdsns, 8);
|
||||||
|
// Force write-through (WT) for write-back (WB) regions:
|
||||||
|
// 0 = No forcing of WT. This is the reset value.
|
||||||
|
// 1 = WT forced for WB regions
|
||||||
|
register_bit!(actlr, fwt, 9);
|
||||||
|
// Force outer read allocate (ORA) for outer write allocate (OWA) regions:
|
||||||
|
// 0 = No forcing of ORA. This is the reset value.
|
||||||
|
// 1 = ORA forced for OWA regions
|
||||||
|
register_bit!(actlr, fora, 10);
|
||||||
|
// Disable data forwarding for Non-cacheable accesses in the AXI master:
|
||||||
|
// 0 = Normal operation. This is the reset value.
|
||||||
|
// 1 = Disable data forwarding for Non-cacheable accesses
|
||||||
|
register_bit!(actlr, dnch, 11);
|
||||||
|
// Enable random parity error generation:
|
||||||
|
// 0 = Random parity error generation disabled. This is the reset value.
|
||||||
|
// 1 = Enable random parity error generation in the cache RAMs.
|
||||||
|
register_bit!(actlr, erpeg, 12);
|
||||||
|
// Disable linefill optimization in the AXI master:
|
||||||
|
// 0 = Normal operation. This is the reset value.
|
||||||
|
// 1 = Limits the number of outstanding data linefills to two
|
||||||
|
register_bit!(actlr, dlfo, 13);
|
||||||
|
// Disable write burst in the AXI master:
|
||||||
|
// 0 = Normal operation. This is the reset value.
|
||||||
|
// 1 = Disable write burst optimization
|
||||||
|
register_bit!(actlr, dbwr, 14);
|
||||||
|
// This field controls the branch prediction policy:
|
||||||
|
// b00 = Normal operation. This is the reset value.
|
||||||
|
// b01 = Branch always taken and history table updates disabled.
|
||||||
|
// b10 = Branch always not taken and history table updates disabled.
|
||||||
|
// b11 = Reserved. Behavior is Unpredictable if this field is set to b11
|
||||||
|
register_bits!(actlr, bp, u8, 15, 16);
|
||||||
|
// Return stack disable:
|
||||||
|
// 0 = Normal return stack operation. This is the reset value.
|
||||||
|
// 1 = Return stack disabled.
|
||||||
|
register_bit!(actlr, rsdis, 17);
|
||||||
|
// Fetch rate control disable:
|
||||||
|
// 0 = Normal fetch rate control operation. This is the reset value.
|
||||||
|
// 1 = Fetch rate control disabled.
|
||||||
|
register_bit!(actlr, frcdis, 19);
|
||||||
|
// Disable Branch History (BH) extension:
|
||||||
|
// 0 = Enable the extension. This is the reset value.
|
||||||
|
// 1 = Disable the extension
|
||||||
|
register_bit!(actlr, dbhe, 20);
|
||||||
|
// Disable end of loop prediction:
|
||||||
|
// 0 = Enable loop prediction. This is the reset value.
|
||||||
|
// 1 = Disable loop prediction.
|
||||||
|
register_bit!(actlr, deolp, 21);
|
||||||
|
// Disable Low Interrupt Latency (LIL) on load/store multiples:
|
||||||
|
// 0 = Enable LIL on load/store multiples. This is the reset value.
|
||||||
|
// 1 = Disable LIL on all load/store multiples.
|
||||||
|
register_bit!(actlr, dilsm, 22);
|
||||||
|
// AXI slave cache RAM non-privileged access enable:
|
||||||
|
// 0 = Disabled. This is the reset value.
|
||||||
|
// 1 = Enabled
|
||||||
|
register_bit!(actlr, axiscuen, 23);
|
||||||
|
// AXI slave cache RAM access enable:
|
||||||
|
// 0 = Disabled. This is the reset value.
|
||||||
|
// 1 = Enabled
|
||||||
|
register_bit!(actlr, axiscen, 24);
|
||||||
|
// A(B0/1)TCM ECC check enable:
|
||||||
|
// 0 = Disabled
|
||||||
|
// 1 = Enabled
|
||||||
|
// The primary input PARECCENRAMm[0] defines the reset value
|
||||||
|
register_bit!(actlr, atcmpcen, 25);
|
||||||
|
register_bit!(actlr, b0tcmpcen, 26);
|
||||||
|
register_bit!(actlr, b1tcmpcen, 27);
|
||||||
|
// Case A(B1, B2, C) dual issue control:
|
||||||
|
// 0 = Enabled. This is the reset value.
|
||||||
|
// 1 = Disabled.
|
||||||
|
register_bit!(actlr, diadi, 28);
|
||||||
|
register_bit!(actlr, dib1di, 29);
|
||||||
|
register_bit!(actlr, dib2di, 30);
|
||||||
|
register_bit!(actlr, dicdi, 31);
|
||||||
|
|
||||||
|
/// Secondary Auxiliary Control Register
|
||||||
|
pub struct SACTLR;
|
||||||
|
wrap_reg!(sactlr);
|
||||||
|
def_reg_r!(SACTLR, sactlr::Read, "mrc p15, 0, $0, c15, c0, 0");
|
||||||
|
def_reg_w!(SACTLR, sactlr::Write, "mcr p15, 0, $0, c15, c0, 0");
|
||||||
|
// Enables 64-bit stores for the ATCM. When enabled, the processor uses read-modify-write to ensure that all
|
||||||
|
// reads and writes presented on the ATCM port are 64 bits wide.
|
||||||
|
// 0 = Disabled
|
||||||
|
// 1 = Enabled.
|
||||||
|
// The primary input RMWENRAMm[0] defines the reset value.
|
||||||
|
register_bit!(sactlr, atcmrmw, 0);
|
||||||
|
register_bit!(sactlr, btcmrmw, 1);
|
||||||
|
// Correction for internal ECC logic on ATCM port.
|
||||||
|
// 0 = Enabled. This is the reset value.
|
||||||
|
// 1 = Disabled
|
||||||
|
register_bit!(sactlr, atcmecc, 2);
|
||||||
|
register_bit!(sactlr, btcmecc, 3);
|
||||||
|
// Floating-point input denormal exception output mask.
|
||||||
|
// 0 = Mask floating-point input denormal exception output. The output FPIDCm is forced to zero. This is
|
||||||
|
// the reset value.
|
||||||
|
// 1 = Propagate floating-point input denormal exception flag FPSCR.IDC to output FPIDCm
|
||||||
|
register_bit!(sactlr, idc, 8);
|
||||||
|
// Floating-point divide-by-zero exception output mask.
|
||||||
|
// 0 = Mask floating-point divide-by-zero exception output. The output FPDZCm is forced to zero. This is
|
||||||
|
// the reset value.
|
||||||
|
// 1 = Propagate floating-point divide-by-zero exception flag FPSCR.DZC to output FPDZCm
|
||||||
|
register_bit!(sactlr, dzc, 9);
|
||||||
|
// Floating-point invalid operation exception output mask.
|
||||||
|
// 0 = Mask floating-point invalid operation exception output. The output FPIOCm is forced to zero. This is
|
||||||
|
// the reset value.
|
||||||
|
// 1 = Propagate floating-point invalid operation exception flag FPSCR.IOC to output FPIOCm.
|
||||||
|
register_bit!(sactlr, ioc, 10);
|
||||||
|
// Floating-point underflow exception output mask.
|
||||||
|
// 0 = Mask floating-point underflow exception output. The output FPUFCm is forced to zero. This is the
|
||||||
|
// reset value.
|
||||||
|
// 1 = Propagate floating-point underflow exception flag FPSCR.UFC to output FPUFCm
|
||||||
|
register_bit!(sactlr, ufc, 11);
|
||||||
|
// Floating-point overflow exception output mask.
|
||||||
|
// 0 = Mask floating-point overflow exception output. The output FPOFCm is forced to zero. This is the reset
|
||||||
|
// value.
|
||||||
|
// 1 = Propagate floating-point overflow exception flag FPSCR.OFC to output FPOFCm
|
||||||
|
register_bit!(sactlr, ofc, 12);
|
||||||
|
// Floating-point inexact exception output mask.
|
||||||
|
// 0 = Mask floating-point inexact exception output. The output FPIXCm is forced to zero. This is the reset
|
||||||
|
// value.
|
||||||
|
// 1 = Propagate floating point inexact exception flag FPSCR.IXC to output FPIXCm
|
||||||
|
register_bit!(sactlr, ixc, 13);
|
||||||
|
// Out-of-order FMACS control.
|
||||||
|
// 0 = Enabled. This is the reset value.
|
||||||
|
// 1 = Disabled
|
||||||
|
register_bit!(sactlr, doofmacs, 16);
|
||||||
|
// Out-of-order double-precision floating point instruction control.
|
||||||
|
// 0 = Enabled. This is the reset value.
|
||||||
|
// 1 = Disabled.
|
||||||
|
register_bit!(sactlr, doodpfp, 17);
|
||||||
|
// F1/F3/F4dual issue control.
|
||||||
|
// 0 = Enabled. This is the reset value.
|
||||||
|
// 1 = Disabled.
|
||||||
|
register_bit!(sactlr, ddi, 18);
|
||||||
|
// F2_Id/F2_st/F2D dual issue control.
|
||||||
|
// 0 = Enabled. This is the reset value.
|
||||||
|
// 1 = Disabled
|
||||||
|
register_bit!(sactlr, df2di, 19);
|
||||||
|
// F6 dual issue control.
|
||||||
|
// 0 = Enabled. This is the reset value.
|
||||||
|
// 1 = Disabled
|
||||||
|
register_bit!(sactlr, df6di, 20);
|
||||||
|
// Enable random 2-bit error generation in cache RAMs. This bit has no effect unless ECC is configured, see
|
||||||
|
// Configurable options on page 1-6.
|
||||||
|
// 0 = Disabled. This is the reset value.
|
||||||
|
// 1 = Enabled.
|
||||||
|
register_bit!(sactlr, dr2b, 21);
|
||||||
|
// Disable hard-error support in the caches.
|
||||||
|
// 0 = Enabled. The cache logic recovers from some hard errors.
|
||||||
|
// 1 = Disabled. Most hard errors in the caches are fatal. This is the reset value
|
||||||
|
register_bit!(sactlr, dche, 22);
|
||||||
|
|
||||||
|
/// Data Fault Status Register
|
||||||
|
pub struct DFSR;
|
||||||
|
wrap_reg!(dfsr);
|
||||||
|
def_reg_r!(DFSR, dfsr::Read, "mrc p15, 0, $0, c5, c0, 0");
|
||||||
|
// Indicates the type of fault generated. To determine the data fault, you must use bit [12] and bit [10] in
|
||||||
|
// conjunction with bits [3:0].
|
||||||
|
register_bits!(dfsr, status, u8, 0, 3);
|
||||||
|
register_bit!(dfsr, s, 10);
|
||||||
|
// Indicates whether a read or write access caused an abort:
|
||||||
|
// 0 = read access caused the abort
|
||||||
|
// 1 = write access caused the abort.
|
||||||
|
register_bit!(dfsr, rw, 11);
|
||||||
|
// Distinguishes between an AXI Decode or Slave error on an external abort. This bit is only valid for external
|
||||||
|
// aborts. For all other aborts types of abort, this bit is set to zero:
|
||||||
|
// 0 = AXI Decode error (DECERR), or AHB error, caused the abort
|
||||||
|
// 1 = AXI Slave error (SLVERR), or unsupported exclusive access, for example exclusive access using the AHB
|
||||||
|
// peripheral port, caused the abort.
|
||||||
|
register_bit!(dfsr, sd, 12);
|
||||||
|
|
||||||
|
/// Data Fault Address Register
|
||||||
|
pub struct DFAR;
|
||||||
|
def_reg_r!(DFAR, u32, "mrc p15, 0, $0, c6, c0, 0");
|
||||||
|
|
||||||
|
/// MPU Type Register
|
||||||
|
pub struct MPUIR;
|
||||||
|
wrap_reg!(mpuir);
|
||||||
|
def_reg_r!(MPUIR, mpuir::Read, "mrc p15, 0, $0, c0, c0, 4");
|
||||||
|
// number of unified MPU regions (0, 12, or 16)
|
||||||
|
register_bits!(mpuir, d_region, u8, 8, 15);
|
||||||
|
|
||||||
|
/// MPU Region Number Register
|
||||||
|
pub struct RGNR;
|
||||||
|
wrap_reg!(rgnr);
|
||||||
|
def_reg_r!(RGNR, rgnr::Read, "mrc p15, 0, $0, c6, c2, 0");
|
||||||
|
def_reg_w!(RGNR, rgnr::Write, "mcr p15, 0, $0, c6, c2, 0");
|
||||||
|
register_bits!(rgnr, region, u8, 0, 3);
|
||||||
|
|
||||||
|
/// MPU Region Access Control Registers
|
||||||
|
pub struct RACTLR;
|
||||||
|
wrap_reg!(ractlr);
|
||||||
|
def_reg_r!(RACTLR, ractlr::Read, "mrc p15, 0, $0, c6, c1, 4");
|
||||||
|
def_reg_w!(RACTLR, ractlr::Write, "mcr p15, 0, $0, c6, c1, 4");
|
||||||
|
// bufferable
|
||||||
|
register_bit!(ractlr, b, 0);
|
||||||
|
// cacheable
|
||||||
|
register_bit!(ractlr, c, 1);
|
||||||
|
// shareable
|
||||||
|
register_bit!(ractlr, s, 2);
|
||||||
|
// type extension
|
||||||
|
register_bits!(ractlr, tex, u8, 3, 5);
|
||||||
|
// Access permission
|
||||||
|
register_bits!(ractlr, ap, u8, 8, 10);
|
||||||
|
// Execute Never. Determines if a region of memory is executable:
|
||||||
|
// 0 = all instruction fetches enabled
|
||||||
|
// 1 = no instruction fetches enabled.
|
||||||
|
register_bit!(ractlr, xn, 12);
|
||||||
|
|
||||||
|
/// MPU Region Size and Enable Registers
|
||||||
|
pub struct RSER;
|
||||||
|
wrap_reg!(rser);
|
||||||
|
def_reg_r!(RSER, rser::Read, "mrc p15, 0, $0, c6, c1, 2");
|
||||||
|
def_reg_w!(RSER, rser::Write, "mcr p15, 0, $0, c6, c1, 2");
|
||||||
|
// enable region
|
||||||
|
register_bit!(rser, enable, 0);
|
||||||
|
// Defines the region size:
|
||||||
|
// b00000 - b00011=Unpredictable
|
||||||
|
// b00100 = 32 bytes
|
||||||
|
// b00101 = 64 bytes
|
||||||
|
// b00110 = 128 bytes
|
||||||
|
// b00111 = 256 bytes
|
||||||
|
// b01000 = 512 bytes
|
||||||
|
// b01001 = 1KB
|
||||||
|
// b01010 = 2KB
|
||||||
|
// b01011 = 4KB
|
||||||
|
// b01100 = 8KB
|
||||||
|
// b01101 = 16KB
|
||||||
|
// b01110 = 32KB
|
||||||
|
// b01111 = 64KB
|
||||||
|
// b10000 = 128KB
|
||||||
|
// b10001 = 256KB
|
||||||
|
// b10010 = 512KB
|
||||||
|
// b10011 = 1MB
|
||||||
|
// b10100 = 2MB
|
||||||
|
// b10101 = 4MB
|
||||||
|
// b10110 = 8MB
|
||||||
|
// b10111 = 16MB
|
||||||
|
// b11000 = 32MB
|
||||||
|
// b11001 = 64MB
|
||||||
|
// b11010 = 128MB
|
||||||
|
// b11011 = 256MB
|
||||||
|
// b11100 = 512MB
|
||||||
|
// b11101 = 1GB
|
||||||
|
// b11110 = 2GB
|
||||||
|
// b11111 = 4GB
|
||||||
|
register_bits!(rser, region_size, u8, 1, 5);
|
||||||
|
// Each bit position represents a sub-region, 0-7.
|
||||||
|
// Bit [8] corresponds to sub-region 0
|
||||||
|
// ...
|
||||||
|
// Bit [15] corresponds to sub-region 7
|
||||||
|
// The meaning of each bit is:
|
||||||
|
// 0 = address range is part of this region
|
||||||
|
// 1 = address range is not part of this region
|
||||||
|
register_bits!(rser, subregion_disable, u8, 8, 15);
|
||||||
|
|
||||||
|
/// MPU Region Base Address Registers
|
||||||
|
pub struct RBAR;
|
||||||
|
wrap_reg!(rbar);
|
||||||
|
def_reg_r!(RBAR, rbar::Read, "mrc p15, 0, $0, c6, c1, 0");
|
||||||
|
def_reg_w!(RBAR, rbar::Write, "mcr p15, 0, $0, c6, c1, 0");
|
||||||
|
// base address
|
||||||
|
register_bits!(rbar, base_address, u32, 5, 31);
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: TCM registers (R5 TRM sec 4.3.23-25)
|
|
@ -8,15 +8,13 @@ edition = "2018"
|
||||||
[features]
|
[features]
|
||||||
target_zc706 = ["libboard_zynq/target_zc706"]
|
target_zc706 = ["libboard_zynq/target_zc706"]
|
||||||
target_coraz7 = ["libboard_zynq/target_coraz7"]
|
target_coraz7 = ["libboard_zynq/target_coraz7"]
|
||||||
target_ebaz4205 = ["libboard_zynq/target_ebaz4205"]
|
|
||||||
target_redpitaya = ["libboard_zynq/target_redpitaya"]
|
target_redpitaya = ["libboard_zynq/target_redpitaya"]
|
||||||
target_kasli_soc = ["libboard_zynq/target_kasli_soc"]
|
target_kasli_soc = ["libboard_zynq/target_kasli_soc"]
|
||||||
panic_handler = []
|
panic_handler = []
|
||||||
dummy_irq_handler = []
|
dummy_irq_handler = []
|
||||||
dummy_fiq_handler = []
|
|
||||||
alloc_core = []
|
alloc_core = []
|
||||||
|
|
||||||
default = ["panic_handler", "dummy_irq_handler", "dummy_fiq_handler"]
|
default = ["panic_handler", "dummy_irq_handler"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
r0 = "1"
|
r0 = "1"
|
||||||
|
|
|
@ -1,11 +1,7 @@
|
||||||
use libregister::{RegisterR, RegisterW};
|
use libregister::RegisterR;
|
||||||
use libcortex_a9::{regs::{DFSR, MPIDR, VBAR}, interrupt_handler};
|
use libcortex_a9::{regs::{DFSR, MPIDR}, interrupt_handler};
|
||||||
use libboard_zynq::{println, stdio};
|
use libboard_zynq::{println, stdio};
|
||||||
|
|
||||||
pub fn set_vector_table(base_addr: u32){
|
|
||||||
VBAR.write(base_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
interrupt_handler!(UndefinedInstruction, undefined_instruction, __irq_stack0_start, __irq_stack1_start, {
|
interrupt_handler!(UndefinedInstruction, undefined_instruction, __irq_stack0_start, __irq_stack1_start, {
|
||||||
stdio::drop_uart();
|
stdio::drop_uart();
|
||||||
println!("UndefinedInstruction");
|
println!("UndefinedInstruction");
|
||||||
|
@ -46,7 +42,6 @@ interrupt_handler!(IRQ, irq, __irq_stack0_start, __irq_stack1_start, {
|
||||||
loop {}
|
loop {}
|
||||||
});
|
});
|
||||||
|
|
||||||
#[cfg(feature = "dummy_fiq_handler")]
|
|
||||||
interrupt_handler!(FIQ, fiq, __irq_stack0_start, __irq_stack1_start, {
|
interrupt_handler!(FIQ, fiq, __irq_stack0_start, __irq_stack1_start, {
|
||||||
stdio::drop_uart();
|
stdio::drop_uart();
|
||||||
println!("FIQ");
|
println!("FIQ");
|
|
@ -54,7 +54,6 @@ unsafe extern "C" fn boot_core0() -> ! {
|
||||||
asm::dmb();
|
asm::dmb();
|
||||||
asm::dsb();
|
asm::dsb();
|
||||||
|
|
||||||
asm::enable_fiq();
|
|
||||||
asm::enable_irq();
|
asm::enable_irq();
|
||||||
main_core0();
|
main_core0();
|
||||||
panic!("return from main");
|
panic!("return from main");
|
||||||
|
@ -76,7 +75,6 @@ unsafe extern "C" fn boot_core1() -> ! {
|
||||||
asm::dmb();
|
asm::dmb();
|
||||||
asm::dsb();
|
asm::dsb();
|
||||||
|
|
||||||
asm::enable_fiq();
|
|
||||||
asm::enable_irq();
|
asm::enable_irq();
|
||||||
main_core1();
|
main_core1();
|
||||||
panic!("return from main_core1");
|
panic!("return from main_core1");
|
||||||
|
|
|
@ -9,7 +9,7 @@ pub extern crate alloc;
|
||||||
pub extern crate compiler_builtins;
|
pub extern crate compiler_builtins;
|
||||||
|
|
||||||
pub mod boot;
|
pub mod boot;
|
||||||
pub mod exception_vectors;
|
mod abort;
|
||||||
#[cfg(feature = "panic_handler")]
|
#[cfg(feature = "panic_handler")]
|
||||||
mod panic;
|
mod panic;
|
||||||
pub mod ram;
|
pub mod ram;
|
||||||
|
|
|
@ -1,138 +0,0 @@
|
||||||
{ lib, stdenv, llvm_meta, fetch, fetchpatch, substituteAll, cmake, libxml2, libllvm, version, clang-tools-extra_src, python3
|
|
||||||
, buildLlvmTools
|
|
||||||
, fixDarwinDylibNames
|
|
||||||
, enableManpages ? false
|
|
||||||
, enablePolly ? false
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
self = stdenv.mkDerivation ({
|
|
||||||
pname = "clang";
|
|
||||||
inherit version;
|
|
||||||
|
|
||||||
src = fetch "clang" "12sm91qx2m79cvj75a9aazf2x8xybjbd593dv6v7rxficpq8i0ha";
|
|
||||||
inherit clang-tools-extra_src;
|
|
||||||
|
|
||||||
unpackPhase = ''
|
|
||||||
unpackFile $src
|
|
||||||
mv clang-* clang
|
|
||||||
sourceRoot=$PWD/clang
|
|
||||||
unpackFile ${clang-tools-extra_src}
|
|
||||||
mv clang-tools-extra-* $sourceRoot/tools/extra
|
|
||||||
'';
|
|
||||||
|
|
||||||
nativeBuildInputs = [ cmake python3 ]
|
|
||||||
++ lib.optional enableManpages python3.pkgs.sphinx
|
|
||||||
++ lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames;
|
|
||||||
|
|
||||||
buildInputs = [ libxml2 libllvm ];
|
|
||||||
|
|
||||||
cmakeFlags = [
|
|
||||||
"-DCLANGD_BUILD_XPC=OFF"
|
|
||||||
"-DLLVM_ENABLE_RTTI=ON"
|
|
||||||
] ++ lib.optionals enableManpages [
|
|
||||||
"-DCLANG_INCLUDE_DOCS=ON"
|
|
||||||
"-DLLVM_ENABLE_SPHINX=ON"
|
|
||||||
"-DSPHINX_OUTPUT_MAN=ON"
|
|
||||||
"-DSPHINX_OUTPUT_HTML=OFF"
|
|
||||||
"-DSPHINX_WARNINGS_AS_ERRORS=OFF"
|
|
||||||
] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
|
|
||||||
"-DLLVM_TABLEGEN_EXE=${buildLlvmTools.llvm}/bin/llvm-tblgen"
|
|
||||||
"-DCLANG_TABLEGEN=${buildLlvmTools.libclang.dev}/bin/clang-tblgen"
|
|
||||||
] ++ lib.optionals enablePolly [
|
|
||||||
"-DWITH_POLLY=ON"
|
|
||||||
"-DLINK_POLLY_INTO_TOOLS=ON"
|
|
||||||
];
|
|
||||||
|
|
||||||
|
|
||||||
patches = [
|
|
||||||
./purity.patch
|
|
||||||
# https://reviews.llvm.org/D51899
|
|
||||||
./gnu-install-dirs.patch
|
|
||||||
(substituteAll {
|
|
||||||
src = ../../clang-11-12-LLVMgold-path.patch;
|
|
||||||
libllvmLibdir = "${libllvm.lib}/lib";
|
|
||||||
})
|
|
||||||
];
|
|
||||||
|
|
||||||
postPatch = ''
|
|
||||||
sed -i -e 's/DriverArgs.hasArg(options::OPT_nostdlibinc)/true/' \
|
|
||||||
-e 's/Args.hasArg(options::OPT_nostdlibinc)/true/' \
|
|
||||||
lib/Driver/ToolChains/*.cpp
|
|
||||||
'' + lib.optionalString stdenv.hostPlatform.isMusl ''
|
|
||||||
sed -i -e 's/lgcc_s/lgcc_eh/' lib/Driver/ToolChains/*.cpp
|
|
||||||
'' + lib.optionalString stdenv.hostPlatform.isDarwin ''
|
|
||||||
substituteInPlace tools/extra/clangd/CMakeLists.txt \
|
|
||||||
--replace "NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB" FALSE
|
|
||||||
'';
|
|
||||||
|
|
||||||
outputs = [ "out" "lib" "dev" "python" ];
|
|
||||||
|
|
||||||
postInstall = ''
|
|
||||||
ln -sv $out/bin/clang $out/bin/cpp
|
|
||||||
|
|
||||||
# Move libclang to 'lib' output
|
|
||||||
moveToOutput "lib/libclang.*" "$lib"
|
|
||||||
moveToOutput "lib/libclang-cpp.*" "$lib"
|
|
||||||
substituteInPlace $out/lib/cmake/clang/ClangTargets-release.cmake \
|
|
||||||
--replace "\''${_IMPORT_PREFIX}/lib/libclang." "$lib/lib/libclang." \
|
|
||||||
--replace "\''${_IMPORT_PREFIX}/lib/libclang-cpp." "$lib/lib/libclang-cpp."
|
|
||||||
|
|
||||||
mkdir -p $python/bin $python/share/{clang,scan-view}
|
|
||||||
mv $out/bin/{git-clang-format,scan-view} $python/bin
|
|
||||||
if [ -e $out/bin/set-xcode-analyzer ]; then
|
|
||||||
mv $out/bin/set-xcode-analyzer $python/bin
|
|
||||||
fi
|
|
||||||
mv $out/share/clang/*.py $python/share/clang
|
|
||||||
mv $out/share/scan-view/*.py $python/share/scan-view
|
|
||||||
rm $out/bin/c-index-test
|
|
||||||
patchShebangs $python/bin
|
|
||||||
|
|
||||||
mkdir -p $dev/bin
|
|
||||||
cp bin/clang-tblgen $dev/bin
|
|
||||||
'';
|
|
||||||
|
|
||||||
passthru = {
|
|
||||||
inherit libllvm;
|
|
||||||
isClang = true;
|
|
||||||
hardeningUnsupportedFlags = [ "fortify3" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
meta = llvm_meta // {
|
|
||||||
homepage = "https://clang.llvm.org/";
|
|
||||||
description = "A C language family frontend for LLVM";
|
|
||||||
longDescription = ''
|
|
||||||
The Clang project provides a language front-end and tooling
|
|
||||||
infrastructure for languages in the C language family (C, C++, Objective
|
|
||||||
C/C++, OpenCL, CUDA, and RenderScript) for the LLVM project.
|
|
||||||
It aims to deliver amazingly fast compiles, extremely useful error and
|
|
||||||
warning messages and to provide a platform for building great source
|
|
||||||
level tools. The Clang Static Analyzer and clang-tidy are tools that
|
|
||||||
automatically find bugs in your code, and are great examples of the sort
|
|
||||||
of tools that can be built using the Clang frontend as a library to
|
|
||||||
parse C/C++ code.
|
|
||||||
'';
|
|
||||||
mainProgram = "clang";
|
|
||||||
};
|
|
||||||
} // lib.optionalAttrs enableManpages {
|
|
||||||
pname = "clang-manpages";
|
|
||||||
|
|
||||||
buildPhase = ''
|
|
||||||
make docs-clang-man
|
|
||||||
'';
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/share/man/man1
|
|
||||||
# Manually install clang manpage
|
|
||||||
cp docs/man/*.1 $out/share/man/man1/
|
|
||||||
'';
|
|
||||||
|
|
||||||
outputs = [ "out" ];
|
|
||||||
|
|
||||||
doCheck = false;
|
|
||||||
|
|
||||||
meta = llvm_meta // {
|
|
||||||
description = "man page for Clang ${version}";
|
|
||||||
};
|
|
||||||
});
|
|
||||||
in self
|
|
|
@ -1,235 +0,0 @@
|
||||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
|
||||||
index bb4b801f01c8..77a8b43b22c8 100644
|
|
||||||
--- a/CMakeLists.txt
|
|
||||||
+++ b/CMakeLists.txt
|
|
||||||
@@ -9,6 +9,8 @@ endif()
|
|
||||||
if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
|
|
||||||
project(Clang)
|
|
||||||
|
|
||||||
+ include(GNUInstallDirs)
|
|
||||||
+
|
|
||||||
set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ standard to conform to")
|
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED YES)
|
|
||||||
set(CMAKE_CXX_EXTENSIONS NO)
|
|
||||||
@@ -447,7 +449,7 @@ include_directories(BEFORE
|
|
||||||
|
|
||||||
if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
|
|
||||||
install(DIRECTORY include/clang include/clang-c
|
|
||||||
- DESTINATION include
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
COMPONENT clang-headers
|
|
||||||
FILES_MATCHING
|
|
||||||
PATTERN "*.def"
|
|
||||||
@@ -457,7 +459,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
|
|
||||||
)
|
|
||||||
|
|
||||||
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/clang
|
|
||||||
- DESTINATION include
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
COMPONENT clang-headers
|
|
||||||
FILES_MATCHING
|
|
||||||
PATTERN "CMakeFiles" EXCLUDE
|
|
||||||
@@ -477,7 +479,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
|
|
||||||
|
|
||||||
add_custom_target(bash-autocomplete DEPENDS utils/bash-autocomplete.sh)
|
|
||||||
install(PROGRAMS utils/bash-autocomplete.sh
|
|
||||||
- DESTINATION share/clang
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang
|
|
||||||
COMPONENT bash-autocomplete)
|
|
||||||
if(NOT LLVM_ENABLE_IDE)
|
|
||||||
add_llvm_install_targets(install-bash-autocomplete
|
|
||||||
diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake
|
|
||||||
index 704278a0e93b..d25c8d325c71 100644
|
|
||||||
--- a/cmake/modules/AddClang.cmake
|
|
||||||
+++ b/cmake/modules/AddClang.cmake
|
|
||||||
@@ -123,9 +123,9 @@ macro(add_clang_library name)
|
|
||||||
install(TARGETS ${lib}
|
|
||||||
COMPONENT ${lib}
|
|
||||||
${export_to_clangtargets}
|
|
||||||
- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
|
|
||||||
- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
|
|
||||||
- RUNTIME DESTINATION bin)
|
|
||||||
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}
|
|
||||||
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}
|
|
||||||
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
|
||||||
|
|
||||||
if (NOT LLVM_ENABLE_IDE)
|
|
||||||
add_llvm_install_targets(install-${lib}
|
|
||||||
@@ -170,7 +170,7 @@ macro(add_clang_tool name)
|
|
||||||
|
|
||||||
install(TARGETS ${name}
|
|
||||||
${export_to_clangtargets}
|
|
||||||
- RUNTIME DESTINATION bin
|
|
||||||
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
||||||
COMPONENT ${name})
|
|
||||||
|
|
||||||
if(NOT LLVM_ENABLE_IDE)
|
|
||||||
@@ -185,7 +185,7 @@ endmacro()
|
|
||||||
macro(add_clang_symlink name dest)
|
|
||||||
add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE)
|
|
||||||
# Always generate install targets
|
|
||||||
- llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE)
|
|
||||||
+ llvm_install_symlink(${name} ${dest} ${CMAKE_INSTALL_FULL_BINDIR} ALWAYS_GENERATE)
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
function(clang_target_link_libraries target type)
|
|
||||||
diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt
|
|
||||||
index 0692fe75a441..6f201e7207d0 100644
|
|
||||||
--- a/lib/Headers/CMakeLists.txt
|
|
||||||
+++ b/lib/Headers/CMakeLists.txt
|
|
||||||
@@ -208,7 +208,7 @@ set_target_properties(clang-resource-headers PROPERTIES
|
|
||||||
FOLDER "Misc"
|
|
||||||
RUNTIME_OUTPUT_DIRECTORY "${output_dir}")
|
|
||||||
|
|
||||||
-set(header_install_dir lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include)
|
|
||||||
+set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include)
|
|
||||||
|
|
||||||
install(
|
|
||||||
FILES ${files} ${generated_files}
|
|
||||||
diff --git a/tools/c-index-test/CMakeLists.txt b/tools/c-index-test/CMakeLists.txt
|
|
||||||
index ceef4b08637c..8efad5520ca4 100644
|
|
||||||
--- a/tools/c-index-test/CMakeLists.txt
|
|
||||||
+++ b/tools/c-index-test/CMakeLists.txt
|
|
||||||
@@ -54,7 +54,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
|
|
||||||
set_property(TARGET c-index-test APPEND PROPERTY INSTALL_RPATH
|
|
||||||
"@executable_path/../../lib")
|
|
||||||
else()
|
|
||||||
- set(INSTALL_DESTINATION bin)
|
|
||||||
+ set(INSTALL_DESTINATION ${CMAKE_INSTALL_BINDIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
install(TARGETS c-index-test
|
|
||||||
diff --git a/tools/clang-format/CMakeLists.txt b/tools/clang-format/CMakeLists.txt
|
|
||||||
index 35ecdb11253c..d77d75de0094 100644
|
|
||||||
--- a/tools/clang-format/CMakeLists.txt
|
|
||||||
+++ b/tools/clang-format/CMakeLists.txt
|
|
||||||
@@ -21,20 +21,20 @@ if( LLVM_LIB_FUZZING_ENGINE OR LLVM_USE_SANITIZE_COVERAGE )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
install(PROGRAMS clang-format-bbedit.applescript
|
|
||||||
- DESTINATION share/clang
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang
|
|
||||||
COMPONENT clang-format)
|
|
||||||
install(PROGRAMS clang-format-diff.py
|
|
||||||
- DESTINATION share/clang
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang
|
|
||||||
COMPONENT clang-format)
|
|
||||||
install(PROGRAMS clang-format-sublime.py
|
|
||||||
- DESTINATION share/clang
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang
|
|
||||||
COMPONENT clang-format)
|
|
||||||
install(PROGRAMS clang-format.el
|
|
||||||
- DESTINATION share/clang
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang
|
|
||||||
COMPONENT clang-format)
|
|
||||||
install(PROGRAMS clang-format.py
|
|
||||||
- DESTINATION share/clang
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang
|
|
||||||
COMPONENT clang-format)
|
|
||||||
install(PROGRAMS git-clang-format
|
|
||||||
- DESTINATION bin
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
||||||
COMPONENT clang-format)
|
|
||||||
diff --git a/tools/clang-rename/CMakeLists.txt b/tools/clang-rename/CMakeLists.txt
|
|
||||||
index cda8e29ec5b1..0134d8ccd70b 100644
|
|
||||||
--- a/tools/clang-rename/CMakeLists.txt
|
|
||||||
+++ b/tools/clang-rename/CMakeLists.txt
|
|
||||||
@@ -19,8 +19,8 @@ clang_target_link_libraries(clang-rename
|
|
||||||
)
|
|
||||||
|
|
||||||
install(PROGRAMS clang-rename.py
|
|
||||||
- DESTINATION share/clang
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang
|
|
||||||
COMPONENT clang-rename)
|
|
||||||
install(PROGRAMS clang-rename.el
|
|
||||||
- DESTINATION share/clang
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang
|
|
||||||
COMPONENT clang-rename)
|
|
||||||
diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt
|
|
||||||
index 5cd9ac5cddc1..a197676fedbd 100644
|
|
||||||
--- a/tools/libclang/CMakeLists.txt
|
|
||||||
+++ b/tools/libclang/CMakeLists.txt
|
|
||||||
@@ -165,7 +165,7 @@ endif()
|
|
||||||
if(INTERNAL_INSTALL_PREFIX)
|
|
||||||
set(LIBCLANG_HEADERS_INSTALL_DESTINATION "${INTERNAL_INSTALL_PREFIX}/include")
|
|
||||||
else()
|
|
||||||
- set(LIBCLANG_HEADERS_INSTALL_DESTINATION include)
|
|
||||||
+ set(LIBCLANG_HEADERS_INSTALL_DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
install(DIRECTORY ../../include/clang-c
|
|
||||||
@@ -196,7 +196,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS})
|
|
||||||
COMPONENT
|
|
||||||
libclang-python-bindings
|
|
||||||
DESTINATION
|
|
||||||
- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
|
|
||||||
+ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
|
|
||||||
endforeach()
|
|
||||||
if(NOT LLVM_ENABLE_IDE)
|
|
||||||
add_custom_target(libclang-python-bindings)
|
|
||||||
diff --git a/tools/scan-build/CMakeLists.txt b/tools/scan-build/CMakeLists.txt
|
|
||||||
index ec0702d76f18..d25d982f51da 100644
|
|
||||||
--- a/tools/scan-build/CMakeLists.txt
|
|
||||||
+++ b/tools/scan-build/CMakeLists.txt
|
|
||||||
@@ -47,7 +47,7 @@ if(CLANG_INSTALL_SCANBUILD)
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/${BinFile})
|
|
||||||
list(APPEND Depends ${CMAKE_BINARY_DIR}/bin/${BinFile})
|
|
||||||
install(PROGRAMS bin/${BinFile}
|
|
||||||
- DESTINATION bin
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
||||||
COMPONENT scan-build)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ if(CLANG_INSTALL_SCANBUILD)
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libexec/${LibexecFile})
|
|
||||||
list(APPEND Depends ${CMAKE_BINARY_DIR}/libexec/${LibexecFile})
|
|
||||||
install(PROGRAMS libexec/${LibexecFile}
|
|
||||||
- DESTINATION libexec
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}
|
|
||||||
COMPONENT scan-build)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ if(CLANG_INSTALL_SCANBUILD)
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/share/scan-build/${ShareFile})
|
|
||||||
list(APPEND Depends ${CMAKE_BINARY_DIR}/share/scan-build/${ShareFile})
|
|
||||||
install(FILES share/scan-build/${ShareFile}
|
|
||||||
- DESTINATION share/scan-build
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_DATADIR}/scan-build
|
|
||||||
COMPONENT scan-build)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
diff --git a/tools/scan-view/CMakeLists.txt b/tools/scan-view/CMakeLists.txt
|
|
||||||
index 22edb974bac7..9f140a9a4538 100644
|
|
||||||
--- a/tools/scan-view/CMakeLists.txt
|
|
||||||
+++ b/tools/scan-view/CMakeLists.txt
|
|
||||||
@@ -22,7 +22,7 @@ if(CLANG_INSTALL_SCANVIEW)
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/${BinFile})
|
|
||||||
list(APPEND Depends ${CMAKE_BINARY_DIR}/bin/${BinFile})
|
|
||||||
install(PROGRAMS bin/${BinFile}
|
|
||||||
- DESTINATION bin
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
||||||
COMPONENT scan-view)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ if(CLANG_INSTALL_SCANVIEW)
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/share/${ShareFile})
|
|
||||||
list(APPEND Depends ${CMAKE_BINARY_DIR}/share/scan-view/${ShareFile})
|
|
||||||
install(FILES share/${ShareFile}
|
|
||||||
- DESTINATION share/scan-view
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_DATADIR}/scan-view
|
|
||||||
COMPONENT scan-view)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
diff --git a/utils/hmaptool/CMakeLists.txt b/utils/hmaptool/CMakeLists.txt
|
|
||||||
index 62f2de0cb15c..6aa66825b6ec 100644
|
|
||||||
--- a/utils/hmaptool/CMakeLists.txt
|
|
||||||
+++ b/utils/hmaptool/CMakeLists.txt
|
|
||||||
@@ -10,7 +10,7 @@ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin/${CLANG_HM
|
|
||||||
|
|
||||||
list(APPEND Depends ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin/${CLANG_HMAPTOOL})
|
|
||||||
install(PROGRAMS ${CLANG_HMAPTOOL}
|
|
||||||
- DESTINATION bin
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
||||||
COMPONENT hmaptool)
|
|
||||||
|
|
||||||
add_custom_target(hmaptool ALL DEPENDS ${Depends})
|
|
|
@ -1,28 +0,0 @@
|
||||||
From 4add81bba40dcec62c4ea4481be8e35ac53e89d8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Will Dietz <w@wdtz.org>
|
|
||||||
Date: Thu, 18 May 2017 11:56:12 -0500
|
|
||||||
Subject: [PATCH] "purity" patch for 5.0
|
|
||||||
|
|
||||||
---
|
|
||||||
lib/Driver/ToolChains/Gnu.cpp | 7 -------
|
|
||||||
1 file changed, 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp
|
|
||||||
index fe3c0191bb..c6a482bece 100644
|
|
||||||
--- a/lib/Driver/ToolChains/Gnu.cpp
|
|
||||||
+++ b/lib/Driver/ToolChains/Gnu.cpp
|
|
||||||
@@ -487,12 +487,6 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|
||||||
if (!IsStatic) {
|
|
||||||
if (Args.hasArg(options::OPT_rdynamic))
|
|
||||||
CmdArgs.push_back("-export-dynamic");
|
|
||||||
-
|
|
||||||
- if (!Args.hasArg(options::OPT_shared) && !IsStaticPIE) {
|
|
||||||
- CmdArgs.push_back("-dynamic-linker");
|
|
||||||
- CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) +
|
|
||||||
- ToolChain.getDynamicLinker(Args)));
|
|
||||||
- }
|
|
||||||
}
|
|
||||||
|
|
||||||
CmdArgs.push_back("-o");
|
|
||||||
--
|
|
||||||
2.11.0
|
|
|
@ -1,296 +0,0 @@
|
||||||
{ lowPrio, newScope, pkgs, lib, stdenv, cmake
|
|
||||||
, gccForLibs, preLibcCrossHeaders
|
|
||||||
, libxml2, python3, isl, fetchurl, overrideCC, wrapCCWith, wrapBintoolsWith
|
|
||||||
, buildLlvmTools # tools, but from the previous stage, for cross
|
|
||||||
, targetLlvmLibraries # libraries, but from the next stage, for cross
|
|
||||||
, targetLlvm
|
|
||||||
# This is the default binutils, but with *this* version of LLD rather
|
|
||||||
# than the default LLVM version's, if LLD is the choice. We use these for
|
|
||||||
# the `useLLVM` bootstrapping below.
|
|
||||||
, bootBintoolsNoLibc ?
|
|
||||||
if stdenv.targetPlatform.linker == "lld"
|
|
||||||
then null
|
|
||||||
else pkgs.bintoolsNoLibc
|
|
||||||
, bootBintools ?
|
|
||||||
if stdenv.targetPlatform.linker == "lld"
|
|
||||||
then null
|
|
||||||
else pkgs.bintools
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
release_version = "11.1.0";
|
|
||||||
candidate = ""; # empty or "rcN"
|
|
||||||
dash-candidate = lib.optionalString (candidate != "") "-${candidate}";
|
|
||||||
version = "${release_version}${dash-candidate}"; # differentiating these (variables) is important for RCs
|
|
||||||
targetConfig = stdenv.targetPlatform.config;
|
|
||||||
|
|
||||||
fetch = name: sha256: fetchurl {
|
|
||||||
url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-${version}/${name}-${release_version}${candidate}.src.tar.xz";
|
|
||||||
inherit sha256;
|
|
||||||
};
|
|
||||||
|
|
||||||
clang-tools-extra_src = fetch "clang-tools-extra" "18n1w1hkv931xzq02b34wglbv6zd6sd0r5kb8piwvag7klj7qw3n";
|
|
||||||
|
|
||||||
llvm_meta = {
|
|
||||||
license = lib.licenses.ncsa;
|
|
||||||
|
|
||||||
# See llvm/cmake/config-ix.cmake.
|
|
||||||
platforms =
|
|
||||||
lib.platforms.aarch64 ++
|
|
||||||
lib.platforms.arm ++
|
|
||||||
lib.platforms.mips ++
|
|
||||||
lib.platforms.riscv ++
|
|
||||||
lib.platforms.wasi ++
|
|
||||||
lib.platforms.x86;
|
|
||||||
};
|
|
||||||
|
|
||||||
tools = lib.makeExtensible (tools: let
|
|
||||||
callPackage = newScope (tools // { inherit stdenv cmake libxml2 python3 isl release_version version fetch buildLlvmTools; });
|
|
||||||
mkExtraBuildCommands0 = cc: ''
|
|
||||||
rsrc="$out/resource-root"
|
|
||||||
mkdir "$rsrc"
|
|
||||||
ln -s "${cc.lib}/lib/clang/${release_version}/include" "$rsrc"
|
|
||||||
echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
|
|
||||||
'';
|
|
||||||
mkExtraBuildCommands = cc: mkExtraBuildCommands0 cc + ''
|
|
||||||
ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib"
|
|
||||||
ln -s "${targetLlvmLibraries.compiler-rt.out}/share" "$rsrc/share"
|
|
||||||
'';
|
|
||||||
|
|
||||||
bintoolsNoLibc' =
|
|
||||||
if bootBintoolsNoLibc == null
|
|
||||||
then tools.bintoolsNoLibc
|
|
||||||
else bootBintoolsNoLibc;
|
|
||||||
bintools' =
|
|
||||||
if bootBintools == null
|
|
||||||
then tools.bintools
|
|
||||||
else bootBintools;
|
|
||||||
|
|
||||||
in {
|
|
||||||
|
|
||||||
libllvm = callPackage ./llvm {
|
|
||||||
inherit llvm_meta;
|
|
||||||
};
|
|
||||||
|
|
||||||
# `llvm` historically had the binaries. When choosing an output explicitly,
|
|
||||||
# we need to reintroduce `outputSpecified` to get the expected behavior e.g. of lib.get*
|
|
||||||
llvm = tools.libllvm;
|
|
||||||
|
|
||||||
libllvm-polly = callPackage ./llvm {
|
|
||||||
inherit llvm_meta;
|
|
||||||
enablePolly = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
llvm-polly = tools.libllvm-polly.lib // { outputSpecified = false; };
|
|
||||||
|
|
||||||
libclang = callPackage ./clang {
|
|
||||||
inherit clang-tools-extra_src llvm_meta;
|
|
||||||
};
|
|
||||||
|
|
||||||
clang-unwrapped = tools.libclang;
|
|
||||||
|
|
||||||
clang-polly-unwrapped = callPackage ./clang {
|
|
||||||
inherit llvm_meta;
|
|
||||||
inherit clang-tools-extra_src;
|
|
||||||
libllvm = tools.libllvm-polly;
|
|
||||||
enablePolly = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
llvm-manpages = lowPrio (tools.libllvm.override {
|
|
||||||
enableManpages = true;
|
|
||||||
python3 = pkgs.python3; # don't use python-boot
|
|
||||||
});
|
|
||||||
|
|
||||||
clang-manpages = lowPrio (tools.libclang.override {
|
|
||||||
enableManpages = true;
|
|
||||||
python3 = pkgs.python3; # don't use python-boot
|
|
||||||
});
|
|
||||||
|
|
||||||
# disabled until recommonmark supports sphinx 3
|
|
||||||
# lldb-manpages = lowPrio (tools.lldb.override {
|
|
||||||
# enableManpages = true;
|
|
||||||
# python3 = pkgs.python3; # don't use python-boot
|
|
||||||
# });
|
|
||||||
|
|
||||||
# pick clang appropriate for package set we are targeting
|
|
||||||
clang =
|
|
||||||
/**/ if stdenv.targetPlatform.libc == null then tools.clangNoLibc
|
|
||||||
else if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM
|
|
||||||
else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang
|
|
||||||
else tools.libcxxClang;
|
|
||||||
|
|
||||||
libstdcxxClang = wrapCCWith rec {
|
|
||||||
cc = tools.clang-unwrapped;
|
|
||||||
# libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper.
|
|
||||||
libcxx = null;
|
|
||||||
extraPackages = [
|
|
||||||
targetLlvmLibraries.compiler-rt
|
|
||||||
];
|
|
||||||
extraBuildCommands = mkExtraBuildCommands cc;
|
|
||||||
};
|
|
||||||
|
|
||||||
libcxxClang = wrapCCWith rec {
|
|
||||||
cc = tools.clang-unwrapped;
|
|
||||||
libcxx = targetLlvmLibraries.libcxx;
|
|
||||||
extraPackages = [
|
|
||||||
libcxx.cxxabi
|
|
||||||
targetLlvmLibraries.compiler-rt
|
|
||||||
];
|
|
||||||
extraBuildCommands = mkExtraBuildCommands cc;
|
|
||||||
};
|
|
||||||
|
|
||||||
lld = callPackage ./lld {
|
|
||||||
inherit llvm_meta;
|
|
||||||
};
|
|
||||||
|
|
||||||
lldb = callPackage ../common/lldb.nix {
|
|
||||||
src = fetch "lldb" "1vlyg015dyng43xqb8cg2l6r9ix8klibxsajazbfnckdnh54hwxj";
|
|
||||||
patches = [
|
|
||||||
./lldb/procfs.patch
|
|
||||||
./lldb/gnu-install-dirs.patch
|
|
||||||
];
|
|
||||||
inherit llvm_meta;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Below, is the LLVM bootstrapping logic. It handles building a
|
|
||||||
# fully LLVM toolchain from scratch. No GCC toolchain should be
|
|
||||||
# pulled in. As a consequence, it is very quick to build different
|
|
||||||
# targets provided by LLVM and we can also build for what GCC
|
|
||||||
# doesn’t support like LLVM. Probably we should move to some other
|
|
||||||
# file.
|
|
||||||
|
|
||||||
bintools-unwrapped = callPackage ../common/bintools.nix { };
|
|
||||||
|
|
||||||
bintoolsNoLibc = wrapBintoolsWith {
|
|
||||||
bintools = tools.bintools-unwrapped;
|
|
||||||
libc = preLibcCrossHeaders;
|
|
||||||
};
|
|
||||||
|
|
||||||
bintools = wrapBintoolsWith {
|
|
||||||
bintools = tools.bintools-unwrapped;
|
|
||||||
};
|
|
||||||
|
|
||||||
clangUseLLVM = wrapCCWith rec {
|
|
||||||
cc = tools.clang-unwrapped;
|
|
||||||
libcxx = targetLlvmLibraries.libcxx;
|
|
||||||
bintools = bintools';
|
|
||||||
extraPackages = [
|
|
||||||
libcxx.cxxabi
|
|
||||||
targetLlvmLibraries.compiler-rt
|
|
||||||
] ++ lib.optionals (!stdenv.targetPlatform.isWasm) [
|
|
||||||
targetLlvmLibraries.libunwind
|
|
||||||
];
|
|
||||||
extraBuildCommands = ''
|
|
||||||
echo "-rtlib=compiler-rt -Wno-unused-command-line-argument" >> $out/nix-support/cc-cflags
|
|
||||||
echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags
|
|
||||||
'' + lib.optionalString (!stdenv.targetPlatform.isWasm) ''
|
|
||||||
echo "--unwindlib=libunwind" >> $out/nix-support/cc-cflags
|
|
||||||
'' + lib.optionalString (!stdenv.targetPlatform.isWasm && stdenv.targetPlatform.useLLVM or false) ''
|
|
||||||
echo "-lunwind" >> $out/nix-support/cc-ldflags
|
|
||||||
'' + lib.optionalString stdenv.targetPlatform.isWasm ''
|
|
||||||
echo "-fno-exceptions" >> $out/nix-support/cc-cflags
|
|
||||||
'' + mkExtraBuildCommands cc;
|
|
||||||
};
|
|
||||||
|
|
||||||
clangNoLibcxx = wrapCCWith rec {
|
|
||||||
cc = tools.clang-unwrapped;
|
|
||||||
libcxx = null;
|
|
||||||
bintools = bintools';
|
|
||||||
extraPackages = [
|
|
||||||
targetLlvmLibraries.compiler-rt
|
|
||||||
];
|
|
||||||
extraBuildCommands = ''
|
|
||||||
echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags
|
|
||||||
echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags
|
|
||||||
echo "-nostdlib++" >> $out/nix-support/cc-cflags
|
|
||||||
'' + mkExtraBuildCommands cc;
|
|
||||||
};
|
|
||||||
|
|
||||||
clangNoLibc = wrapCCWith rec {
|
|
||||||
cc = tools.clang-unwrapped;
|
|
||||||
libcxx = null;
|
|
||||||
bintools = bintoolsNoLibc';
|
|
||||||
extraPackages = [
|
|
||||||
targetLlvmLibraries.compiler-rt
|
|
||||||
];
|
|
||||||
extraBuildCommands = ''
|
|
||||||
echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags
|
|
||||||
echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags
|
|
||||||
'' + mkExtraBuildCommands cc;
|
|
||||||
};
|
|
||||||
|
|
||||||
clangNoCompilerRt = wrapCCWith rec {
|
|
||||||
cc = tools.clang-unwrapped;
|
|
||||||
libcxx = null;
|
|
||||||
bintools = bintoolsNoLibc';
|
|
||||||
extraPackages = [ ];
|
|
||||||
extraBuildCommands = ''
|
|
||||||
echo "-nostartfiles" >> $out/nix-support/cc-cflags
|
|
||||||
'' + mkExtraBuildCommands0 cc;
|
|
||||||
};
|
|
||||||
|
|
||||||
clangNoCompilerRtWithLibc = wrapCCWith rec {
|
|
||||||
cc = tools.clang-unwrapped;
|
|
||||||
libcxx = null;
|
|
||||||
bintools = bintools';
|
|
||||||
extraPackages = [ ];
|
|
||||||
extraBuildCommands = mkExtraBuildCommands0 cc;
|
|
||||||
};
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
libraries = lib.makeExtensible (libraries: let
|
|
||||||
callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake libxml2 python3 isl release_version version fetch; });
|
|
||||||
in {
|
|
||||||
|
|
||||||
compiler-rt-libc = callPackage ./compiler-rt {
|
|
||||||
inherit llvm_meta;
|
|
||||||
stdenv = if (stdenv.hostPlatform.useLLVM or false) || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64) || (stdenv.hostPlatform.isRiscV && stdenv.hostPlatform.is32bit)
|
|
||||||
then overrideCC stdenv buildLlvmTools.clangNoCompilerRtWithLibc
|
|
||||||
else stdenv;
|
|
||||||
};
|
|
||||||
|
|
||||||
compiler-rt-no-libc = callPackage ./compiler-rt {
|
|
||||||
inherit llvm_meta;
|
|
||||||
stdenv = if (stdenv.hostPlatform.useLLVM or false) || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64)
|
|
||||||
then overrideCC stdenv buildLlvmTools.clangNoCompilerRt
|
|
||||||
else stdenv;
|
|
||||||
};
|
|
||||||
|
|
||||||
# N.B. condition is safe because without useLLVM both are the same.
|
|
||||||
compiler-rt = if stdenv.hostPlatform.isAndroid || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64) || (stdenv.hostPlatform.libc == "newlib")
|
|
||||||
then libraries.compiler-rt-libc
|
|
||||||
else libraries.compiler-rt-no-libc;
|
|
||||||
|
|
||||||
stdenv = overrideCC stdenv buildLlvmTools.clang;
|
|
||||||
|
|
||||||
libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang;
|
|
||||||
|
|
||||||
libcxx = callPackage ./libcxx {
|
|
||||||
inherit llvm_meta;
|
|
||||||
stdenv = if (stdenv.hostPlatform.useLLVM or false) || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64)
|
|
||||||
then overrideCC stdenv buildLlvmTools.clangNoLibcxx
|
|
||||||
else stdenv;
|
|
||||||
};
|
|
||||||
|
|
||||||
libcxxabi = callPackage ./libcxxabi {
|
|
||||||
inherit llvm_meta;
|
|
||||||
stdenv = if (stdenv.hostPlatform.useLLVM or false) || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64)
|
|
||||||
then overrideCC stdenv buildLlvmTools.clangNoLibcxx
|
|
||||||
else stdenv;
|
|
||||||
};
|
|
||||||
|
|
||||||
libunwind = callPackage ./libunwind {
|
|
||||||
inherit llvm_meta;
|
|
||||||
stdenv = if (stdenv.hostPlatform.useLLVM or false) || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64)
|
|
||||||
then overrideCC stdenv buildLlvmTools.clangNoLibcxx
|
|
||||||
else stdenv;
|
|
||||||
};
|
|
||||||
|
|
||||||
openmp = callPackage ./openmp {
|
|
||||||
inherit llvm_meta targetLlvm;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
noExtend = extensible: builtins.removeAttrs extensible [ "extend" ];
|
|
||||||
|
|
||||||
in { inherit tools libraries release_version; } // (noExtend libraries) // (noExtend tools)
|
|
|
@ -1,363 +0,0 @@
|
||||||
{ lib, stdenv, llvm_meta
|
|
||||||
, pkgsBuildBuild
|
|
||||||
, fetch
|
|
||||||
, fetchpatch
|
|
||||||
, cmake
|
|
||||||
, python3
|
|
||||||
, libffi
|
|
||||||
, enableGoldPlugin ? false
|
|
||||||
, libbfd
|
|
||||||
, libpfm
|
|
||||||
, libxml2
|
|
||||||
, ncurses
|
|
||||||
, version
|
|
||||||
, release_version
|
|
||||||
, zlib
|
|
||||||
, buildLlvmTools
|
|
||||||
, debugVersion ? false
|
|
||||||
, doCheck ? stdenv.isLinux && (!stdenv.isx86_32) && (!stdenv.hostPlatform.isMusl) && (!stdenv.hostPlatform.isRiscV)
|
|
||||||
&& (stdenv.hostPlatform == stdenv.buildPlatform)
|
|
||||||
, enableManpages ? false
|
|
||||||
, enableSharedLibraries ? !stdenv.hostPlatform.isStatic
|
|
||||||
# broken for Ampere eMAG 8180 (c2.large.arm on Packet) #56245
|
|
||||||
# broken for the armv7l builder
|
|
||||||
, enablePFM ? stdenv.isLinux && !stdenv.hostPlatform.isAarch
|
|
||||||
, enablePolly ? false # TODO should be on by default
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
inherit (lib) optional optionals optionalString;
|
|
||||||
|
|
||||||
# Used when creating a version-suffixed symlink of libLLVM.dylib
|
|
||||||
shortVersion = with lib;
|
|
||||||
concatStringsSep "." (take 1 (splitString "." release_version));
|
|
||||||
|
|
||||||
# Ordinarily we would just the `doCheck` and `checkDeps` functionality
|
|
||||||
# `mkDerivation` gives us to manage our test dependencies (instead of breaking
|
|
||||||
# out `doCheck` as a package level attribute).
|
|
||||||
#
|
|
||||||
# Unfortunately `lit` does not forward `$PYTHONPATH` to children processes, in
|
|
||||||
# particular the children it uses to do feature detection.
|
|
||||||
#
|
|
||||||
# This means that python deps we add to `checkDeps` (which the python
|
|
||||||
# interpreter is made aware of via `$PYTHONPATH` – populated by the python
|
|
||||||
# setup hook) are not picked up by `lit` which causes it to skip tests.
|
|
||||||
#
|
|
||||||
# Adding `python3.withPackages (ps: [ ... ])` to `checkDeps` also doesn't work
|
|
||||||
# because this package is shadowed in `$PATH` by the regular `python3`
|
|
||||||
# package.
|
|
||||||
#
|
|
||||||
# So, we "manually" assemble one python derivation for the package to depend
|
|
||||||
# on, taking into account whether checks are enabled or not:
|
|
||||||
python = if doCheck then
|
|
||||||
let
|
|
||||||
checkDeps = ps: with ps; [ psutil ];
|
|
||||||
in python3.withPackages checkDeps
|
|
||||||
else python3;
|
|
||||||
|
|
||||||
in stdenv.mkDerivation (rec {
|
|
||||||
pname = "llvm";
|
|
||||||
inherit version;
|
|
||||||
|
|
||||||
src = fetch pname "199yq3a214avcbi4kk2q0ajriifkvsr0l2dkx3a666m033ihi1ff";
|
|
||||||
polly_src = fetch "polly" "031r23ijhx7v93a5n33m2nc0x9xyqmx0d8xg80z7q971p6qd63sq";
|
|
||||||
|
|
||||||
unpackPhase = ''
|
|
||||||
unpackFile $src
|
|
||||||
mv llvm-${release_version}* llvm
|
|
||||||
sourceRoot=$PWD/llvm
|
|
||||||
'' + optionalString enablePolly ''
|
|
||||||
unpackFile $polly_src
|
|
||||||
mv polly-* $sourceRoot/tools/polly
|
|
||||||
'';
|
|
||||||
|
|
||||||
outputs = [ "out" "lib" "dev" "python" ];
|
|
||||||
|
|
||||||
nativeBuildInputs = [ cmake python ]
|
|
||||||
++ optionals enableManpages [ python3.pkgs.sphinx python3.pkgs.recommonmark ];
|
|
||||||
|
|
||||||
buildInputs = [ libxml2 libffi ]
|
|
||||||
++ optional enablePFM libpfm; # exegesis
|
|
||||||
|
|
||||||
propagatedBuildInputs = [ ncurses zlib ];
|
|
||||||
|
|
||||||
patches = [
|
|
||||||
# When cross-compiling we configure llvm-config-native with an approximation
|
|
||||||
# of the flags used for the normal LLVM build. To avoid the need for building
|
|
||||||
# a native libLLVM.so (which would fail) we force llvm-config to be linked
|
|
||||||
# statically against the necessary LLVM components always.
|
|
||||||
../../llvm-config-link-static.patch
|
|
||||||
|
|
||||||
./gnu-install-dirs.patch
|
|
||||||
# On older CPUs (e.g. Hydra/wendy) we'd be getting an error in this test.
|
|
||||||
(fetchpatch {
|
|
||||||
name = "uops-CMOV16rm-noreg.diff";
|
|
||||||
url = "https://github.com/llvm/llvm-project/commit/9e9f991ac033.diff";
|
|
||||||
sha256 = "sha256:12s8vr6ibri8b48h2z38f3afhwam10arfiqfy4yg37bmc054p5hi";
|
|
||||||
stripLen = 1;
|
|
||||||
})
|
|
||||||
# gcc-11 compat upstream patch
|
|
||||||
(fetchpatch {
|
|
||||||
url = "https://github.com/llvm/llvm-project/commit/b498303066a63a203d24f739b2d2e0e56dca70d1.patch";
|
|
||||||
sha256 = "sha256:0nh123kld0dgz2h941lng331dkj3wbm5lfxm375k1f569gv83hlk";
|
|
||||||
stripLen = 1;
|
|
||||||
})
|
|
||||||
|
|
||||||
# Fix invalid std::string(nullptr) for GCC 12
|
|
||||||
(fetchpatch {
|
|
||||||
name = "nvptx-gcc-12.patch";
|
|
||||||
url = "https://github.com/llvm/llvm-project/commit/99e64623ec9b31def9375753491cc6093c831809.patch";
|
|
||||||
sha256 = "0zjfjgavqzi2ypqwqnlvy6flyvdz8hi1anwv0ybwnm2zqixg7za3";
|
|
||||||
stripLen = 1;
|
|
||||||
})
|
|
||||||
(fetchpatch {
|
|
||||||
name = "dfaemitter-gcc-12.patch";
|
|
||||||
url = "https://github.com/llvm/llvm-project/commit/0841916e87a39e3c223c986e8da31e4a9a1432e3.patch";
|
|
||||||
sha256 = "1kckghvsngs51mqm82asy0s9vr19h8aqbw43a0w44mccqw6bzrwf";
|
|
||||||
stripLen = 1;
|
|
||||||
})
|
|
||||||
|
|
||||||
# Fix musl build.
|
|
||||||
(fetchpatch {
|
|
||||||
url = "https://github.com/llvm/llvm-project/commit/5cd554303ead0f8891eee3cd6d25cb07f5a7bf67.patch";
|
|
||||||
relative = "llvm";
|
|
||||||
hash = "sha256-XPbvNJ45SzjMGlNUgt/IgEvM2dHQpDOe6woUJY+nUYA=";
|
|
||||||
})
|
|
||||||
|
|
||||||
# Backport gcc-13 fixes with missing includes.
|
|
||||||
(fetchpatch {
|
|
||||||
name = "signals-gcc-13.patch";
|
|
||||||
url = "https://github.com/llvm/llvm-project/commit/ff1681ddb303223973653f7f5f3f3435b48a1983.patch";
|
|
||||||
hash = "sha256-CXwYxQezTq5vdmc8Yn88BUAEly6YZ5VEIA6X3y5NNOs=";
|
|
||||||
stripLen = 1;
|
|
||||||
})
|
|
||||||
(fetchpatch {
|
|
||||||
name = "base64-gcc-13.patch";
|
|
||||||
url = "https://github.com/llvm/llvm-project/commit/5e9be93566f39ee6cecd579401e453eccfbe81e5.patch";
|
|
||||||
hash = "sha256-PAwrVrvffPd7tphpwCkYiz+67szPRzRB2TXBvKfzQ7U=";
|
|
||||||
stripLen = 1;
|
|
||||||
})
|
|
||||||
] ++ lib.optional enablePolly ./gnu-install-dirs-polly.patch;
|
|
||||||
|
|
||||||
postPatch = optionalString stdenv.isDarwin ''
|
|
||||||
substituteInPlace cmake/modules/AddLLVM.cmake \
|
|
||||||
--replace 'set(_install_name_dir INSTALL_NAME_DIR "@rpath")' "set(_install_name_dir)" \
|
|
||||||
--replace 'set(_install_rpath "@loader_path/../''${CMAKE_INSTALL_LIBDIR}''${LLVM_LIBDIR_SUFFIX}" ''${extra_libdir})' ""
|
|
||||||
'' + ''
|
|
||||||
# FileSystem permissions tests fail with various special bits
|
|
||||||
substituteInPlace unittests/Support/CMakeLists.txt \
|
|
||||||
--replace "Path.cpp" ""
|
|
||||||
rm unittests/Support/Path.cpp
|
|
||||||
'' + optionalString stdenv.hostPlatform.isMusl ''
|
|
||||||
patch -p1 -i ${../../TLI-musl.patch}
|
|
||||||
substituteInPlace unittests/Support/CMakeLists.txt \
|
|
||||||
--replace "add_subdirectory(DynamicLibrary)" ""
|
|
||||||
rm unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp
|
|
||||||
# valgrind unhappy with musl or glibc, but fails w/musl only
|
|
||||||
rm test/CodeGen/AArch64/wineh4.mir
|
|
||||||
'' + optionalString stdenv.hostPlatform.isAarch32 ''
|
|
||||||
# skip failing X86 test cases on 32-bit ARM
|
|
||||||
rm test/DebugInfo/X86/convert-debugloc.ll
|
|
||||||
rm test/DebugInfo/X86/convert-inlined.ll
|
|
||||||
rm test/DebugInfo/X86/convert-linked.ll
|
|
||||||
rm test/tools/dsymutil/X86/op-convert.test
|
|
||||||
rm test/tools/gold/X86/split-dwarf.ll
|
|
||||||
rm test/tools/llvm-readobj/ELF/dependent-libraries.test
|
|
||||||
'' + optionalString (stdenv.hostPlatform.system == "armv6l-linux") ''
|
|
||||||
# Seems to require certain floating point hardware (NEON?)
|
|
||||||
rm test/ExecutionEngine/frem.ll
|
|
||||||
'' + ''
|
|
||||||
patchShebangs test/BugPoint/compile-custom.ll.py
|
|
||||||
'' + ''
|
|
||||||
# Tweak tests to ignore namespace part of type to support
|
|
||||||
# gcc-12: https://gcc.gnu.org/PR103598.
|
|
||||||
# The change below mangles strings like:
|
|
||||||
# CHECK-NEXT: Starting llvm::Function pass manager run.
|
|
||||||
# to:
|
|
||||||
# CHECK-NEXT: Starting {{.*}}Function pass manager run.
|
|
||||||
for f in \
|
|
||||||
test/Other/new-pass-manager.ll \
|
|
||||||
test/Other/new-pm-defaults.ll \
|
|
||||||
test/Other/new-pm-lto-defaults.ll \
|
|
||||||
test/Other/new-pm-thinlto-defaults.ll \
|
|
||||||
test/Other/pass-pipeline-parsing.ll \
|
|
||||||
test/Transforms/Inline/cgscc-incremental-invalidate.ll \
|
|
||||||
test/Transforms/Inline/clear-analyses.ll \
|
|
||||||
test/Transforms/LoopUnroll/unroll-loop-invalidation.ll \
|
|
||||||
test/Transforms/SCCP/ipsccp-preserve-analysis.ll \
|
|
||||||
test/Transforms/SCCP/preserve-analysis.ll \
|
|
||||||
test/Transforms/SROA/dead-inst.ll \
|
|
||||||
test/tools/gold/X86/new-pm.ll \
|
|
||||||
; do
|
|
||||||
echo "PATCH: $f"
|
|
||||||
substituteInPlace $f \
|
|
||||||
--replace 'Starting llvm::' 'Starting {{.*}}' \
|
|
||||||
--replace 'Finished llvm::' 'Finished {{.*}}'
|
|
||||||
done
|
|
||||||
'';
|
|
||||||
|
|
||||||
preConfigure = ''
|
|
||||||
# Workaround for configure flags that need to have spaces
|
|
||||||
cmakeFlagsArray+=(
|
|
||||||
-DLLVM_LIT_ARGS='-svj''${NIX_BUILD_CORES} --no-progress-bar'
|
|
||||||
)
|
|
||||||
'';
|
|
||||||
|
|
||||||
# hacky fix: created binaries need to be run before installation
|
|
||||||
preBuild = ''
|
|
||||||
mkdir -p $out/
|
|
||||||
ln -sv $PWD/lib $out
|
|
||||||
'';
|
|
||||||
|
|
||||||
# E.g. mesa.drivers use the build-id as a cache key (see #93946):
|
|
||||||
LDFLAGS = optionalString (enableSharedLibraries && !stdenv.isDarwin) "-Wl,--build-id=sha1";
|
|
||||||
|
|
||||||
cmakeBuildType = if debugVersion then "Debug" else "Release";
|
|
||||||
|
|
||||||
cmakeFlags = with stdenv; let
|
|
||||||
# These flags influence llvm-config's BuildVariables.inc in addition to the
|
|
||||||
# general build. We need to make sure these are also passed via
|
|
||||||
# CROSS_TOOLCHAIN_FLAGS_NATIVE when cross-compiling or llvm-config-native
|
|
||||||
# will return different results from the cross llvm-config.
|
|
||||||
#
|
|
||||||
# Some flags don't need to be repassed because LLVM already does so (like
|
|
||||||
# CMAKE_BUILD_TYPE), others are irrelevant to the result.
|
|
||||||
flagsForLlvmConfig = [
|
|
||||||
"-DLLVM_INSTALL_CMAKE_DIR=${placeholder "dev"}/lib/cmake/llvm/"
|
|
||||||
"-DLLVM_ENABLE_RTTI=ON"
|
|
||||||
] ++ optionals enableSharedLibraries [
|
|
||||||
"-DLLVM_LINK_LLVM_DYLIB=ON"
|
|
||||||
];
|
|
||||||
in flagsForLlvmConfig ++ [
|
|
||||||
"-DLLVM_INSTALL_UTILS=ON" # Needed by rustc
|
|
||||||
"-DLLVM_BUILD_TESTS=${if doCheck then "ON" else "OFF"}"
|
|
||||||
"-DLLVM_ENABLE_FFI=ON"
|
|
||||||
"-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}"
|
|
||||||
"-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}"
|
|
||||||
"-DLLVM_ENABLE_DUMP=ON"
|
|
||||||
] ++ optionals stdenv.hostPlatform.isStatic [
|
|
||||||
# Disables building of shared libs, -fPIC is still injected by cc-wrapper
|
|
||||||
"-DLLVM_ENABLE_PIC=OFF"
|
|
||||||
"-DLLVM_BUILD_STATIC=ON"
|
|
||||||
# libxml2 needs to be disabled because the LLVM build system ignores its .la
|
|
||||||
# file and doesn't link zlib as well.
|
|
||||||
# https://github.com/ClangBuiltLinux/tc-build/issues/150#issuecomment-845418812
|
|
||||||
"-DLLVM_ENABLE_LIBXML2=OFF"
|
|
||||||
# This is a Shared Library not tied to LLVM_ENABLE_PIC
|
|
||||||
"-DLLVM_TOOL_REMARKS_SHLIB_BUILD=OFF"
|
|
||||||
] ++ optionals enableManpages [
|
|
||||||
"-DLLVM_BUILD_DOCS=ON"
|
|
||||||
"-DLLVM_ENABLE_SPHINX=ON"
|
|
||||||
"-DSPHINX_OUTPUT_MAN=ON"
|
|
||||||
"-DSPHINX_OUTPUT_HTML=OFF"
|
|
||||||
"-DSPHINX_WARNINGS_AS_ERRORS=OFF"
|
|
||||||
] ++ optionals (enableGoldPlugin) [
|
|
||||||
"-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include"
|
|
||||||
] ++ optionals isDarwin [
|
|
||||||
"-DLLVM_ENABLE_LIBCXX=ON"
|
|
||||||
"-DCAN_TARGET_i386=false"
|
|
||||||
] ++ optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
|
|
||||||
"-DCMAKE_CROSSCOMPILING=True"
|
|
||||||
"-DLLVM_TABLEGEN=${buildLlvmTools.llvm}/bin/llvm-tblgen"
|
|
||||||
(
|
|
||||||
let
|
|
||||||
nativeCC = pkgsBuildBuild.targetPackages.stdenv.cc;
|
|
||||||
nativeBintools = nativeCC.bintools.bintools;
|
|
||||||
nativeToolchainFlags = [
|
|
||||||
"-DCMAKE_C_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}cc"
|
|
||||||
"-DCMAKE_CXX_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}c++"
|
|
||||||
"-DCMAKE_AR=${nativeBintools}/bin/${nativeBintools.targetPrefix}ar"
|
|
||||||
"-DCMAKE_STRIP=${nativeBintools}/bin/${nativeBintools.targetPrefix}strip"
|
|
||||||
"-DCMAKE_RANLIB=${nativeBintools}/bin/${nativeBintools.targetPrefix}ranlib"
|
|
||||||
];
|
|
||||||
# We need to repass the custom GNUInstallDirs values, otherwise CMake
|
|
||||||
# will choose them for us, leading to wrong results in llvm-config-native
|
|
||||||
nativeInstallFlags = [
|
|
||||||
"-DCMAKE_INSTALL_PREFIX=${placeholder "out"}"
|
|
||||||
"-DCMAKE_INSTALL_BINDIR=${placeholder "out"}/bin"
|
|
||||||
"-DCMAKE_INSTALL_INCLUDEDIR=${placeholder "dev"}/include"
|
|
||||||
"-DCMAKE_INSTALL_LIBDIR=${placeholder "lib"}/lib"
|
|
||||||
"-DCMAKE_INSTALL_LIBEXECDIR=${placeholder "lib"}/libexec"
|
|
||||||
];
|
|
||||||
in "-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list="
|
|
||||||
+ lib.concatStringsSep ";" (lib.concatLists [
|
|
||||||
flagsForLlvmConfig
|
|
||||||
nativeToolchainFlags
|
|
||||||
nativeInstallFlags
|
|
||||||
])
|
|
||||||
)
|
|
||||||
];
|
|
||||||
|
|
||||||
postBuild = ''
|
|
||||||
rm -fR $out
|
|
||||||
'';
|
|
||||||
|
|
||||||
preCheck = ''
|
|
||||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}$PWD/lib
|
|
||||||
'';
|
|
||||||
|
|
||||||
postInstall = ''
|
|
||||||
mkdir -p $python/share
|
|
||||||
mv $out/share/opt-viewer $python/share/opt-viewer
|
|
||||||
moveToOutput "bin/llvm-config*" "$dev"
|
|
||||||
substituteInPlace "$dev/lib/cmake/llvm/LLVMExports-${if debugVersion then "debug" else "release"}.cmake" \
|
|
||||||
--replace "\''${_IMPORT_PREFIX}/lib/lib" "$lib/lib/lib" \
|
|
||||||
--replace "$out/bin/llvm-config" "$dev/bin/llvm-config"
|
|
||||||
substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \
|
|
||||||
--replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}'"$lib"'")'
|
|
||||||
''
|
|
||||||
+ optionalString (stdenv.isDarwin && enableSharedLibraries) ''
|
|
||||||
ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${shortVersion}.dylib
|
|
||||||
ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${release_version}.dylib
|
|
||||||
''
|
|
||||||
+ optionalString (stdenv.buildPlatform != stdenv.hostPlatform) ''
|
|
||||||
cp NATIVE/bin/llvm-config $dev/bin/llvm-config-native
|
|
||||||
'';
|
|
||||||
|
|
||||||
inherit doCheck;
|
|
||||||
|
|
||||||
checkTarget = "check-all";
|
|
||||||
|
|
||||||
requiredSystemFeatures = [ "big-parallel" ];
|
|
||||||
meta = llvm_meta // {
|
|
||||||
homepage = "https://llvm.org/";
|
|
||||||
description = "A collection of modular and reusable compiler and toolchain technologies";
|
|
||||||
longDescription = ''
|
|
||||||
The LLVM Project is a collection of modular and reusable compiler and
|
|
||||||
toolchain technologies. Despite its name, LLVM has little to do with
|
|
||||||
traditional virtual machines. The name "LLVM" itself is not an acronym; it
|
|
||||||
is the full name of the project.
|
|
||||||
LLVM began as a research project at the University of Illinois, with the
|
|
||||||
goal of providing a modern, SSA-based compilation strategy capable of
|
|
||||||
supporting both static and dynamic compilation of arbitrary programming
|
|
||||||
languages. Since then, LLVM has grown to be an umbrella project consisting
|
|
||||||
of a number of subprojects, many of which are being used in production by
|
|
||||||
a wide variety of commercial and open source projects as well as being
|
|
||||||
widely used in academic research. Code in the LLVM project is licensed
|
|
||||||
under the "Apache 2.0 License with LLVM exceptions".
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
} // lib.optionalAttrs enableManpages {
|
|
||||||
pname = "llvm-manpages";
|
|
||||||
|
|
||||||
buildPhase = ''
|
|
||||||
make docs-llvm-man
|
|
||||||
'';
|
|
||||||
|
|
||||||
propagatedBuildInputs = [];
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
make -C docs install
|
|
||||||
'';
|
|
||||||
|
|
||||||
postPatch = null;
|
|
||||||
postInstall = null;
|
|
||||||
|
|
||||||
outputs = [ "out" ];
|
|
||||||
|
|
||||||
doCheck = false;
|
|
||||||
|
|
||||||
meta = llvm_meta // {
|
|
||||||
description = "man pages for LLVM ${version}";
|
|
||||||
};
|
|
||||||
})
|
|
|
@ -1,106 +0,0 @@
|
||||||
diff --git a/tools/polly/CMakeLists.txt b/tools/polly/CMakeLists.txt
|
|
||||||
index 9939097f743e..8cc538da912a 100644
|
|
||||||
--- a/tools/polly/CMakeLists.txt
|
|
||||||
+++ b/tools/polly/CMakeLists.txt
|
|
||||||
@@ -2,7 +2,11 @@
|
|
||||||
if (NOT DEFINED LLVM_MAIN_SRC_DIR)
|
|
||||||
project(Polly)
|
|
||||||
cmake_minimum_required(VERSION 3.4.3)
|
|
||||||
+endif()
|
|
||||||
+
|
|
||||||
+include(GNUInstallDirs)
|
|
||||||
|
|
||||||
+if (NOT DEFINED LLVM_MAIN_SRC_DIR)
|
|
||||||
# Where is LLVM installed?
|
|
||||||
find_package(LLVM CONFIG REQUIRED)
|
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LLVM_CMAKE_DIR})
|
|
||||||
@@ -145,14 +149,14 @@ include_directories(
|
|
||||||
|
|
||||||
if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
|
|
||||||
install(DIRECTORY include/
|
|
||||||
- DESTINATION include
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
FILES_MATCHING
|
|
||||||
PATTERN "*.h"
|
|
||||||
PATTERN ".svn" EXCLUDE
|
|
||||||
)
|
|
||||||
|
|
||||||
install(DIRECTORY ${POLLY_BINARY_DIR}/include/
|
|
||||||
- DESTINATION include
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
FILES_MATCHING
|
|
||||||
PATTERN "*.h"
|
|
||||||
PATTERN "CMakeFiles" EXCLUDE
|
|
||||||
diff --git a/tools/polly/cmake/CMakeLists.txt b/tools/polly/cmake/CMakeLists.txt
|
|
||||||
index 211f95512717..f9e04a4844b6 100644
|
|
||||||
--- a/tools/polly/cmake/CMakeLists.txt
|
|
||||||
+++ b/tools/polly/cmake/CMakeLists.txt
|
|
||||||
@@ -79,18 +79,18 @@ file(GENERATE
|
|
||||||
|
|
||||||
# Generate PollyConfig.cmake for the install tree.
|
|
||||||
unset(POLLY_EXPORTS)
|
|
||||||
-set(POLLY_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
|
|
||||||
+set(POLLY_INSTALL_PREFIX "")
|
|
||||||
set(POLLY_CONFIG_LLVM_CMAKE_DIR "${LLVM_BINARY_DIR}/${LLVM_INSTALL_PACKAGE_DIR}")
|
|
||||||
-set(POLLY_CONFIG_CMAKE_DIR "${POLLY_INSTALL_PREFIX}/${POLLY_INSTALL_PACKAGE_DIR}")
|
|
||||||
-set(POLLY_CONFIG_LIBRARY_DIRS "${POLLY_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}")
|
|
||||||
+set(POLLY_CONFIG_CMAKE_DIR "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_PREFIX}/${POLLY_INSTALL_PACKAGE_DIR}")
|
|
||||||
+set(POLLY_CONFIG_LIBRARY_DIRS "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}")
|
|
||||||
if (POLLY_BUNDLED_ISL)
|
|
||||||
set(POLLY_CONFIG_INCLUDE_DIRS
|
|
||||||
- "${POLLY_INSTALL_PREFIX}/include"
|
|
||||||
- "${POLLY_INSTALL_PREFIX}/include/polly"
|
|
||||||
+ "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_FULL_LIBDIR}"
|
|
||||||
+ "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_FULL_LIBDIR}/polly"
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
set(POLLY_CONFIG_INCLUDE_DIRS
|
|
||||||
- "${POLLY_INSTALL_PREFIX}/include"
|
|
||||||
+ "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_FULL_INCLUDEDIR}"
|
|
||||||
${ISL_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
@@ -100,12 +100,12 @@ endif()
|
|
||||||
foreach(tgt IN LISTS POLLY_CONFIG_EXPORTED_TARGETS)
|
|
||||||
get_target_property(tgt_type ${tgt} TYPE)
|
|
||||||
if (tgt_type STREQUAL "EXECUTABLE")
|
|
||||||
- set(tgt_prefix "bin/")
|
|
||||||
+ set(tgt_prefix "${CMAKE_INSTALL_BINDIR}/")
|
|
||||||
else()
|
|
||||||
- set(tgt_prefix "lib/")
|
|
||||||
+ set(tgt_prefix "${CMAKE_INSTALL_LIBDIR}/")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
- set(tgt_path "${CMAKE_INSTALL_PREFIX}/${tgt_prefix}$<TARGET_FILE_NAME:${tgt}>")
|
|
||||||
+ set(tgt_path "${tgt_prefix}$<TARGET_FILE_NAME:${tgt}>")
|
|
||||||
file(RELATIVE_PATH tgt_path ${POLLY_CONFIG_CMAKE_DIR} ${tgt_path})
|
|
||||||
|
|
||||||
if (NOT tgt_type STREQUAL "INTERFACE_LIBRARY")
|
|
||||||
diff --git a/tools/polly/cmake/polly_macros.cmake b/tools/polly/cmake/polly_macros.cmake
|
|
||||||
index 86de6f10686e..91f30891ccbe 100644
|
|
||||||
--- a/tools/polly/cmake/polly_macros.cmake
|
|
||||||
+++ b/tools/polly/cmake/polly_macros.cmake
|
|
||||||
@@ -44,8 +44,8 @@ macro(add_polly_library name)
|
|
||||||
if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LLVMPolly")
|
|
||||||
install(TARGETS ${name}
|
|
||||||
EXPORT LLVMExports
|
|
||||||
- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
|
|
||||||
- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
|
|
||||||
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}
|
|
||||||
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX})
|
|
||||||
endif()
|
|
||||||
set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
|
|
||||||
endmacro(add_polly_library)
|
|
||||||
diff --git a/tools/polly/lib/External/CMakeLists.txt b/tools/polly/lib/External/CMakeLists.txt
|
|
||||||
index 1039079cb49c..28b499ae1e9e 100644
|
|
||||||
--- a/tools/polly/lib/External/CMakeLists.txt
|
|
||||||
+++ b/tools/polly/lib/External/CMakeLists.txt
|
|
||||||
@@ -275,7 +275,7 @@ if (POLLY_BUNDLED_ISL)
|
|
||||||
install(DIRECTORY
|
|
||||||
${ISL_SOURCE_DIR}/include/
|
|
||||||
${ISL_BINARY_DIR}/include/
|
|
||||||
- DESTINATION include/polly
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/polly
|
|
||||||
FILES_MATCHING
|
|
||||||
PATTERN "*.h"
|
|
||||||
PATTERN "CMakeFiles" EXCLUDE
|
|
|
@ -1,417 +0,0 @@
|
||||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
|
||||||
index 247ad36d3845..815e2c4ba955 100644
|
|
||||||
--- a/CMakeLists.txt
|
|
||||||
+++ b/CMakeLists.txt
|
|
||||||
@@ -269,15 +269,21 @@ if (CMAKE_BUILD_TYPE AND
|
|
||||||
message(FATAL_ERROR "Invalid value for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
+include(GNUInstallDirs)
|
|
||||||
+
|
|
||||||
set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
|
|
||||||
|
|
||||||
-set(LLVM_TOOLS_INSTALL_DIR "bin" CACHE STRING "Path for binary subdirectory (defaults to 'bin')")
|
|
||||||
+set(LLVM_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE STRING
|
|
||||||
+ "Path for binary subdirectory (defaults to 'bin')")
|
|
||||||
mark_as_advanced(LLVM_TOOLS_INSTALL_DIR)
|
|
||||||
|
|
||||||
set(LLVM_UTILS_INSTALL_DIR "${LLVM_TOOLS_INSTALL_DIR}" CACHE STRING
|
|
||||||
"Path to install LLVM utilities (enabled by LLVM_INSTALL_UTILS=ON) (defaults to LLVM_TOOLS_INSTALL_DIR)")
|
|
||||||
mark_as_advanced(LLVM_UTILS_INSTALL_DIR)
|
|
||||||
|
|
||||||
+set(LLVM_INSTALL_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/cmake/llvm" CACHE STRING
|
|
||||||
+ "Path for CMake subdirectory (defaults to lib/cmake/llvm)" )
|
|
||||||
+
|
|
||||||
# They are used as destination of target generators.
|
|
||||||
set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
|
|
||||||
set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
|
|
||||||
@@ -559,9 +565,9 @@ option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF)
|
|
||||||
option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON)
|
|
||||||
option (LLVM_ENABLE_BINDINGS "Build bindings." ON)
|
|
||||||
|
|
||||||
-set(LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html"
|
|
||||||
+set(LLVM_INSTALL_DOXYGEN_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/${project}/doxygen-html"
|
|
||||||
CACHE STRING "Doxygen-generated HTML documentation install directory")
|
|
||||||
-set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "share/doc/llvm/ocaml-html"
|
|
||||||
+set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/${project}/ocaml-html"
|
|
||||||
CACHE STRING "OCamldoc-generated HTML documentation install directory")
|
|
||||||
|
|
||||||
option (LLVM_BUILD_EXTERNAL_COMPILER_RT
|
|
||||||
@@ -1107,7 +1113,7 @@ endif()
|
|
||||||
|
|
||||||
if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
|
|
||||||
install(DIRECTORY include/llvm include/llvm-c
|
|
||||||
- DESTINATION include
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
COMPONENT llvm-headers
|
|
||||||
FILES_MATCHING
|
|
||||||
PATTERN "*.def"
|
|
||||||
@@ -1119,7 +1125,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
|
|
||||||
)
|
|
||||||
|
|
||||||
install(DIRECTORY ${LLVM_INCLUDE_DIR}/llvm ${LLVM_INCLUDE_DIR}/llvm-c
|
|
||||||
- DESTINATION include
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
COMPONENT llvm-headers
|
|
||||||
FILES_MATCHING
|
|
||||||
PATTERN "*.def"
|
|
||||||
@@ -1134,13 +1140,13 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
|
|
||||||
|
|
||||||
if (LLVM_INSTALL_MODULEMAPS)
|
|
||||||
install(DIRECTORY include/llvm include/llvm-c
|
|
||||||
- DESTINATION include
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
COMPONENT llvm-headers
|
|
||||||
FILES_MATCHING
|
|
||||||
PATTERN "module.modulemap"
|
|
||||||
)
|
|
||||||
install(FILES include/llvm/module.install.modulemap
|
|
||||||
- DESTINATION include/llvm
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/llvm
|
|
||||||
COMPONENT llvm-headers
|
|
||||||
RENAME "module.extern.modulemap"
|
|
||||||
)
|
|
||||||
diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake
|
|
||||||
index b74adc11ade9..a5aa258cde30 100644
|
|
||||||
--- a/cmake/modules/AddLLVM.cmake
|
|
||||||
+++ b/cmake/modules/AddLLVM.cmake
|
|
||||||
@@ -766,9 +766,9 @@ macro(add_llvm_library name)
|
|
||||||
|
|
||||||
install(TARGETS ${name}
|
|
||||||
${export_to_llvmexports}
|
|
||||||
- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
|
|
||||||
- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
|
|
||||||
- RUNTIME DESTINATION bin COMPONENT ${name})
|
|
||||||
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
|
|
||||||
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
|
|
||||||
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${name})
|
|
||||||
|
|
||||||
if (NOT LLVM_ENABLE_IDE)
|
|
||||||
add_llvm_install_targets(install-${name}
|
|
||||||
@@ -981,7 +981,7 @@ function(process_llvm_pass_plugins)
|
|
||||||
"set(LLVM_STATIC_EXTENSIONS ${LLVM_STATIC_EXTENSIONS})")
|
|
||||||
install(FILES
|
|
||||||
${llvm_cmake_builddir}/LLVMConfigExtensions.cmake
|
|
||||||
- DESTINATION ${LLVM_INSTALL_PACKAGE_DIR}
|
|
||||||
+ DESTINATION ${LLVM_INSTALL_CMAKE_DIR}
|
|
||||||
COMPONENT cmake-exports)
|
|
||||||
|
|
||||||
set(ExtensionDef "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def")
|
|
||||||
@@ -1201,7 +1201,7 @@ macro(add_llvm_example name)
|
|
||||||
endif()
|
|
||||||
add_llvm_executable(${name} ${ARGN})
|
|
||||||
if( LLVM_BUILD_EXAMPLES )
|
|
||||||
- install(TARGETS ${name} RUNTIME DESTINATION examples)
|
|
||||||
+ install(TARGETS ${name} RUNTIME DESTINATION ${CMAKE_INSTALL_DOCDIR}/examples)
|
|
||||||
endif()
|
|
||||||
set_target_properties(${name} PROPERTIES FOLDER "Examples")
|
|
||||||
endmacro(add_llvm_example name)
|
|
||||||
@@ -1819,7 +1819,7 @@ function(llvm_install_library_symlink name dest type)
|
|
||||||
set(full_name ${CMAKE_${type}_LIBRARY_PREFIX}${name}${CMAKE_${type}_LIBRARY_SUFFIX})
|
|
||||||
set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX})
|
|
||||||
|
|
||||||
- set(output_dir lib${LLVM_LIBDIR_SUFFIX})
|
|
||||||
+ set(output_dir ${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX})
|
|
||||||
if(WIN32 AND "${type}" STREQUAL "SHARED")
|
|
||||||
set(output_dir bin)
|
|
||||||
endif()
|
|
||||||
@@ -1836,7 +1836,7 @@ function(llvm_install_library_symlink name dest type)
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
-function(llvm_install_symlink name dest)
|
|
||||||
+function(llvm_install_symlink name dest output_dir)
|
|
||||||
cmake_parse_arguments(ARG "ALWAYS_GENERATE" "COMPONENT" "" ${ARGN})
|
|
||||||
foreach(path ${CMAKE_MODULE_PATH})
|
|
||||||
if(EXISTS ${path}/LLVMInstallSymlink.cmake)
|
|
||||||
@@ -1859,7 +1859,7 @@ function(llvm_install_symlink name dest)
|
|
||||||
set(full_dest ${dest}${CMAKE_EXECUTABLE_SUFFIX})
|
|
||||||
|
|
||||||
install(SCRIPT ${INSTALL_SYMLINK}
|
|
||||||
- CODE "install_symlink(${full_name} ${full_dest} ${LLVM_TOOLS_INSTALL_DIR})"
|
|
||||||
+ CODE "install_symlink(${full_name} ${full_dest} ${output_dir})"
|
|
||||||
COMPONENT ${component})
|
|
||||||
|
|
||||||
if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE)
|
|
||||||
@@ -1942,7 +1942,8 @@ function(add_llvm_tool_symlink link_name target)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if ((TOOL_IS_TOOLCHAIN OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) AND LLVM_BUILD_TOOLS)
|
|
||||||
- llvm_install_symlink(${link_name} ${target})
|
|
||||||
+ GNUInstallDirs_get_absolute_install_dir(output_dir LLVM_TOOLS_INSTALL_DIR)
|
|
||||||
+ llvm_install_symlink(${link_name} ${target} ${output_dir})
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
@@ -2064,9 +2065,9 @@ function(llvm_setup_rpath name)
|
|
||||||
|
|
||||||
if (APPLE)
|
|
||||||
set(_install_name_dir INSTALL_NAME_DIR "@rpath")
|
|
||||||
- set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
|
|
||||||
+ set(_install_rpath "@loader_path/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
|
|
||||||
elseif(UNIX)
|
|
||||||
- set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
|
|
||||||
+ set(_install_rpath "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
|
|
||||||
if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
|
|
||||||
set_property(TARGET ${name} APPEND_STRING PROPERTY
|
|
||||||
LINK_FLAGS " -Wl,-z,origin ")
|
|
||||||
diff --git a/cmake/modules/AddOCaml.cmake b/cmake/modules/AddOCaml.cmake
|
|
||||||
index 554046b20edf..4d1ad980641e 100644
|
|
||||||
--- a/cmake/modules/AddOCaml.cmake
|
|
||||||
+++ b/cmake/modules/AddOCaml.cmake
|
|
||||||
@@ -144,9 +144,9 @@ function(add_ocaml_library name)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
if( APPLE )
|
|
||||||
- set(ocaml_rpath "@executable_path/../../../lib${LLVM_LIBDIR_SUFFIX}")
|
|
||||||
+ set(ocaml_rpath "@executable_path/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}")
|
|
||||||
elseif( UNIX )
|
|
||||||
- set(ocaml_rpath "\\$ORIGIN/../../../lib${LLVM_LIBDIR_SUFFIX}")
|
|
||||||
+ set(ocaml_rpath "\\$ORIGIN/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}")
|
|
||||||
endif()
|
|
||||||
list(APPEND ocaml_flags "-ldopt" "-Wl,-rpath,${ocaml_rpath}")
|
|
||||||
|
|
||||||
diff --git a/cmake/modules/AddSphinxTarget.cmake b/cmake/modules/AddSphinxTarget.cmake
|
|
||||||
index b5babb30abcf..190b1222a9f9 100644
|
|
||||||
--- a/cmake/modules/AddSphinxTarget.cmake
|
|
||||||
+++ b/cmake/modules/AddSphinxTarget.cmake
|
|
||||||
@@ -84,7 +84,7 @@ function (add_sphinx_target builder project)
|
|
||||||
endif()
|
|
||||||
elseif (builder STREQUAL html)
|
|
||||||
string(TOUPPER "${project}" project_upper)
|
|
||||||
- set(${project_upper}_INSTALL_SPHINX_HTML_DIR "share/doc/${project}/html"
|
|
||||||
+ set(${project_upper}_INSTALL_SPHINX_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/${project}/html"
|
|
||||||
CACHE STRING "HTML documentation install directory for ${project}")
|
|
||||||
|
|
||||||
# '/.' indicates: copy the contents of the directory directly into
|
|
||||||
diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt
|
|
||||||
index 4b8879f65fe4..f01920bcc60f 100644
|
|
||||||
--- a/cmake/modules/CMakeLists.txt
|
|
||||||
+++ b/cmake/modules/CMakeLists.txt
|
|
||||||
@@ -1,4 +1,4 @@
|
|
||||||
-set(LLVM_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm)
|
|
||||||
+set(LLVM_INSTALL_PACKAGE_DIR ${LLVM_INSTALL_CMAKE_DIR} CACHE STRING "Path for CMake subdirectory (defaults to 'cmake/llvm')")
|
|
||||||
set(llvm_cmake_builddir "${LLVM_BINARY_DIR}/${LLVM_INSTALL_PACKAGE_DIR}")
|
|
||||||
|
|
||||||
# First for users who use an installed LLVM, create the LLVMExports.cmake file.
|
|
||||||
@@ -108,13 +108,13 @@ foreach(p ${_count})
|
|
||||||
set(LLVM_CONFIG_CODE "${LLVM_CONFIG_CODE}
|
|
||||||
get_filename_component(LLVM_INSTALL_PREFIX \"\${LLVM_INSTALL_PREFIX}\" PATH)")
|
|
||||||
endforeach(p)
|
|
||||||
-set(LLVM_CONFIG_INCLUDE_DIRS "\${LLVM_INSTALL_PREFIX}/include")
|
|
||||||
+set(LLVM_CONFIG_INCLUDE_DIRS "\${LLVM_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}")
|
|
||||||
set(LLVM_CONFIG_INCLUDE_DIR "${LLVM_CONFIG_INCLUDE_DIRS}")
|
|
||||||
set(LLVM_CONFIG_MAIN_INCLUDE_DIR "${LLVM_CONFIG_INCLUDE_DIRS}")
|
|
||||||
-set(LLVM_CONFIG_LIBRARY_DIRS "\${LLVM_INSTALL_PREFIX}/lib\${LLVM_LIBDIR_SUFFIX}")
|
|
||||||
+set(LLVM_CONFIG_LIBRARY_DIRS "\${LLVM_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}\${LLVM_LIBDIR_SUFFIX}")
|
|
||||||
set(LLVM_CONFIG_CMAKE_DIR "\${LLVM_INSTALL_PREFIX}/${LLVM_INSTALL_PACKAGE_DIR}")
|
|
||||||
set(LLVM_CONFIG_BINARY_DIR "\${LLVM_INSTALL_PREFIX}")
|
|
||||||
-set(LLVM_CONFIG_TOOLS_BINARY_DIR "\${LLVM_INSTALL_PREFIX}/bin")
|
|
||||||
+set(LLVM_CONFIG_TOOLS_BINARY_DIR "\${LLVM_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}")
|
|
||||||
|
|
||||||
# Generate a default location for lit
|
|
||||||
if (LLVM_INSTALL_UTILS AND LLVM_BUILD_UTILS)
|
|
||||||
diff --git a/cmake/modules/LLVMInstallSymlink.cmake b/cmake/modules/LLVMInstallSymlink.cmake
|
|
||||||
index 09fed8085c23..aa79f192abf0 100644
|
|
||||||
--- a/cmake/modules/LLVMInstallSymlink.cmake
|
|
||||||
+++ b/cmake/modules/LLVMInstallSymlink.cmake
|
|
||||||
@@ -10,7 +10,7 @@ function(install_symlink name target outdir)
|
|
||||||
set(LINK_OR_COPY copy)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
- set(bindir "${DESTDIR}${CMAKE_INSTALL_PREFIX}/${outdir}/")
|
|
||||||
+ set(bindir "${DESTDIR}${outdir}/")
|
|
||||||
|
|
||||||
message(STATUS "Creating ${name}")
|
|
||||||
|
|
||||||
diff --git a/docs/CMake.rst b/docs/CMake.rst
|
|
||||||
index 1f908d3e95b1..1315e0aa40e1 100644
|
|
||||||
--- a/docs/CMake.rst
|
|
||||||
+++ b/docs/CMake.rst
|
|
||||||
@@ -196,7 +196,7 @@ CMake manual, or execute ``cmake --help-variable VARIABLE_NAME``.
|
|
||||||
**LLVM_LIBDIR_SUFFIX**:STRING
|
|
||||||
Extra suffix to append to the directory where libraries are to be
|
|
||||||
installed. On a 64-bit architecture, one could use ``-DLLVM_LIBDIR_SUFFIX=64``
|
|
||||||
- to install libraries to ``/usr/lib64``.
|
|
||||||
+ to install libraries to ``/usr/lib64``. See also ``CMAKE_INSTALL_LIBDIR``.
|
|
||||||
|
|
||||||
**CMAKE_C_FLAGS**:STRING
|
|
||||||
Extra flags to use when compiling C source files.
|
|
||||||
@@ -516,8 +516,8 @@ LLVM-specific variables
|
|
||||||
|
|
||||||
**LLVM_INSTALL_DOXYGEN_HTML_DIR**:STRING
|
|
||||||
The path to install Doxygen-generated HTML documentation to. This path can
|
|
||||||
- either be absolute or relative to the CMAKE_INSTALL_PREFIX. Defaults to
|
|
||||||
- `share/doc/llvm/doxygen-html`.
|
|
||||||
+ either be absolute or relative to the ``CMAKE_INSTALL_PREFIX``. Defaults to
|
|
||||||
+ `${CMAKE_INSTALL_DOCDIR}/${project}/doxygen-html`.
|
|
||||||
|
|
||||||
**LLVM_ENABLE_SPHINX**:BOOL
|
|
||||||
If specified, CMake will search for the ``sphinx-build`` executable and will make
|
|
||||||
@@ -548,13 +548,33 @@ LLVM-specific variables
|
|
||||||
|
|
||||||
**LLVM_INSTALL_SPHINX_HTML_DIR**:STRING
|
|
||||||
The path to install Sphinx-generated HTML documentation to. This path can
|
|
||||||
- either be absolute or relative to the CMAKE_INSTALL_PREFIX. Defaults to
|
|
||||||
- `share/doc/llvm/html`.
|
|
||||||
+ either be absolute or relative to the ``CMAKE_INSTALL_PREFIX``. Defaults to
|
|
||||||
+ `${CMAKE_INSTALL_DOCDIR}/${project}/html`.
|
|
||||||
|
|
||||||
**LLVM_INSTALL_OCAMLDOC_HTML_DIR**:STRING
|
|
||||||
The path to install OCamldoc-generated HTML documentation to. This path can
|
|
||||||
- either be absolute or relative to the CMAKE_INSTALL_PREFIX. Defaults to
|
|
||||||
- `share/doc/llvm/ocaml-html`.
|
|
||||||
+ either be absolute or relative to the ``CMAKE_INSTALL_PREFIX``. Defaults to
|
|
||||||
+ `${CMAKE_INSTALL_DOCDIR}/${project}/ocaml-html`.
|
|
||||||
+
|
|
||||||
+**CMAKE_INSTALL_BINDIR**:STRING
|
|
||||||
+ The path to install binary tools, relative to the ``CMAKE_INSTALL_PREFIX``.
|
|
||||||
+ Defaults to `bin`.
|
|
||||||
+
|
|
||||||
+**CMAKE_INSTALL_LIBDIR**:STRING
|
|
||||||
+ The path to install libraries, relative to the ``CMAKE_INSTALL_PREFIX``.
|
|
||||||
+ Defaults to `lib`.
|
|
||||||
+
|
|
||||||
+**CMAKE_INSTALL_INCLUDEDIR**:STRING
|
|
||||||
+ The path to install header files, relative to the ``CMAKE_INSTALL_PREFIX``.
|
|
||||||
+ Defaults to `include`.
|
|
||||||
+
|
|
||||||
+**CMAKE_INSTALL_DOCDIR**:STRING
|
|
||||||
+ The path to install documentation, relative to the ``CMAKE_INSTALL_PREFIX``.
|
|
||||||
+ Defaults to `share/doc`.
|
|
||||||
+
|
|
||||||
+**CMAKE_INSTALL_MANDIR**:STRING
|
|
||||||
+ The path to install manpage files, relative to the ``CMAKE_INSTALL_PREFIX``.
|
|
||||||
+ Defaults to `share/man`.
|
|
||||||
|
|
||||||
**LLVM_CREATE_XCODE_TOOLCHAIN**:BOOL
|
|
||||||
macOS Only: If enabled CMake will generate a target named
|
|
||||||
@@ -752,9 +772,11 @@ the ``cmake`` command or by setting it directly in ``ccmake`` or ``cmake-gui``).
|
|
||||||
|
|
||||||
This file is available in two different locations.
|
|
||||||
|
|
||||||
-* ``<INSTALL_PREFIX>/lib/cmake/llvm/LLVMConfig.cmake`` where
|
|
||||||
- ``<INSTALL_PREFIX>`` is the install prefix of an installed version of LLVM.
|
|
||||||
- On Linux typically this is ``/usr/lib/cmake/llvm/LLVMConfig.cmake``.
|
|
||||||
+* ``<LLVM_INSTALL_PACKAGE_DIR>LLVMConfig.cmake`` where
|
|
||||||
+ ``<LLVM_INSTALL_PACKAGE_DIR>`` is the location where LLVM CMake modules are
|
|
||||||
+ installed as part of an installed version of LLVM. This is typically
|
|
||||||
+ ``cmake/llvm/`` within the lib directory. On Linux, this is typically
|
|
||||||
+ ``/usr/lib/cmake/llvm/LLVMConfig.cmake``.
|
|
||||||
|
|
||||||
* ``<LLVM_BUILD_ROOT>/lib/cmake/llvm/LLVMConfig.cmake`` where
|
|
||||||
``<LLVM_BUILD_ROOT>`` is the root of the LLVM build tree. **Note: this is only
|
|
||||||
diff --git a/examples/Bye/CMakeLists.txt b/examples/Bye/CMakeLists.txt
|
|
||||||
index bb96edb4b4bf..678c22fb43c8 100644
|
|
||||||
--- a/examples/Bye/CMakeLists.txt
|
|
||||||
+++ b/examples/Bye/CMakeLists.txt
|
|
||||||
@@ -14,6 +14,6 @@ if (NOT WIN32)
|
|
||||||
BUILDTREE_ONLY
|
|
||||||
)
|
|
||||||
|
|
||||||
- install(TARGETS ${name} RUNTIME DESTINATION examples)
|
|
||||||
+ install(TARGETS ${name} RUNTIME DESTINATION ${CMAKE_INSTALL_DOCDIR}/examples)
|
|
||||||
set_target_properties(${name} PROPERTIES FOLDER "Examples")
|
|
||||||
endif()
|
|
||||||
diff --git a/include/llvm/CMakeLists.txt b/include/llvm/CMakeLists.txt
|
|
||||||
index b46319f24fc8..2feabd1954e4 100644
|
|
||||||
--- a/include/llvm/CMakeLists.txt
|
|
||||||
+++ b/include/llvm/CMakeLists.txt
|
|
||||||
@@ -5,5 +5,5 @@ add_subdirectory(Frontend)
|
|
||||||
# If we're doing an out-of-tree build, copy a module map for generated
|
|
||||||
# header files into the build area.
|
|
||||||
if (NOT "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
|
|
||||||
- configure_file(module.modulemap.build module.modulemap COPYONLY)
|
|
||||||
+ configure_file(module.modulemap.build ${LLVM_INCLUDE_DIR}/module.modulemap COPYONLY)
|
|
||||||
endif (NOT "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
|
|
||||||
diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in
|
|
||||||
index 63cef75368b7..6295478b1f3d 100644
|
|
||||||
--- a/tools/llvm-config/BuildVariables.inc.in
|
|
||||||
+++ b/tools/llvm-config/BuildVariables.inc.in
|
|
||||||
@@ -23,6 +23,10 @@
|
|
||||||
#define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@"
|
|
||||||
#define LLVM_BUILDMODE "@LLVM_BUILDMODE@"
|
|
||||||
#define LLVM_LIBDIR_SUFFIX "@LLVM_LIBDIR_SUFFIX@"
|
|
||||||
+#define LLVM_INSTALL_BINDIR "@CMAKE_INSTALL_BINDIR@"
|
|
||||||
+#define LLVM_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@"
|
|
||||||
+#define LLVM_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@"
|
|
||||||
+#define LLVM_INSTALL_CMAKEDIR "@LLVM_INSTALL_CMAKE_DIR@"
|
|
||||||
#define LLVM_TARGETS_BUILT "@LLVM_TARGETS_BUILT@"
|
|
||||||
#define LLVM_SYSTEM_LIBS "@LLVM_SYSTEM_LIBS@"
|
|
||||||
#define LLVM_BUILD_SYSTEM "@LLVM_BUILD_SYSTEM@"
|
|
||||||
diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp
|
|
||||||
index 7e74b7c90816..f185e9283f83 100644
|
|
||||||
--- a/tools/llvm-config/llvm-config.cpp
|
|
||||||
+++ b/tools/llvm-config/llvm-config.cpp
|
|
||||||
@@ -358,12 +358,26 @@ int main(int argc, char **argv) {
|
|
||||||
("-I" + ActiveIncludeDir + " " + "-I" + ActiveObjRoot + "/include");
|
|
||||||
} else {
|
|
||||||
ActivePrefix = CurrentExecPrefix;
|
|
||||||
- ActiveIncludeDir = ActivePrefix + "/include";
|
|
||||||
- SmallString<256> path(StringRef(LLVM_TOOLS_INSTALL_DIR));
|
|
||||||
- sys::fs::make_absolute(ActivePrefix, path);
|
|
||||||
- ActiveBinDir = std::string(path.str());
|
|
||||||
- ActiveLibDir = ActivePrefix + "/lib" + LLVM_LIBDIR_SUFFIX;
|
|
||||||
- ActiveCMakeDir = ActiveLibDir + "/cmake/llvm";
|
|
||||||
+ {
|
|
||||||
+ SmallString<256> path(StringRef(LLVM_INSTALL_INCLUDEDIR));
|
|
||||||
+ sys::fs::make_absolute(ActivePrefix, path);
|
|
||||||
+ ActiveIncludeDir = std::string(path.str());
|
|
||||||
+ }
|
|
||||||
+ {
|
|
||||||
+ SmallString<256> path(StringRef(LLVM_INSTALL_BINDIR));
|
|
||||||
+ sys::fs::make_absolute(ActivePrefix, path);
|
|
||||||
+ ActiveBinDir = std::string(path.str());
|
|
||||||
+ }
|
|
||||||
+ {
|
|
||||||
+ SmallString<256> path(StringRef(LLVM_INSTALL_LIBDIR LLVM_LIBDIR_SUFFIX));
|
|
||||||
+ sys::fs::make_absolute(ActivePrefix, path);
|
|
||||||
+ ActiveLibDir = std::string(path.str());
|
|
||||||
+ }
|
|
||||||
+ {
|
|
||||||
+ SmallString<256> path(StringRef(LLVM_INSTALL_CMAKEDIR));
|
|
||||||
+ sys::fs::make_absolute(ActivePrefix, path);
|
|
||||||
+ ActiveCMakeDir = std::string(path.str());
|
|
||||||
+ }
|
|
||||||
ActiveIncludeOption = "-I" + ActiveIncludeDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/tools/lto/CMakeLists.txt b/tools/lto/CMakeLists.txt
|
|
||||||
index 2963f97cad88..69d66c9c9ca1 100644
|
|
||||||
--- a/tools/lto/CMakeLists.txt
|
|
||||||
+++ b/tools/lto/CMakeLists.txt
|
|
||||||
@@ -25,7 +25,7 @@ add_llvm_library(LTO SHARED INSTALL_WITH_TOOLCHAIN ${SOURCES} DEPENDS
|
|
||||||
intrinsics_gen)
|
|
||||||
|
|
||||||
install(FILES ${LLVM_MAIN_INCLUDE_DIR}/llvm-c/lto.h
|
|
||||||
- DESTINATION include/llvm-c
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/llvm-c
|
|
||||||
COMPONENT LTO)
|
|
||||||
|
|
||||||
if (APPLE)
|
|
||||||
diff --git a/tools/opt-viewer/CMakeLists.txt b/tools/opt-viewer/CMakeLists.txt
|
|
||||||
index ead73ec13a8f..250362021f17 100644
|
|
||||||
--- a/tools/opt-viewer/CMakeLists.txt
|
|
||||||
+++ b/tools/opt-viewer/CMakeLists.txt
|
|
||||||
@@ -8,7 +8,7 @@ set (files
|
|
||||||
|
|
||||||
foreach (file ${files})
|
|
||||||
install(PROGRAMS ${file}
|
|
||||||
- DESTINATION share/opt-viewer
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_DATADIR}/opt-viewer
|
|
||||||
COMPONENT opt-viewer)
|
|
||||||
endforeach (file)
|
|
||||||
|
|
||||||
diff --git a/tools/remarks-shlib/CMakeLists.txt b/tools/remarks-shlib/CMakeLists.txt
|
|
||||||
index e948496c603a..1f4df8a98b10 100644
|
|
||||||
--- a/tools/remarks-shlib/CMakeLists.txt
|
|
||||||
+++ b/tools/remarks-shlib/CMakeLists.txt
|
|
||||||
@@ -11,7 +11,7 @@ set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/Remarks.exports)
|
|
||||||
add_llvm_library(Remarks SHARED INSTALL_WITH_TOOLCHAIN ${SOURCES})
|
|
||||||
|
|
||||||
install(FILES ${LLVM_MAIN_INCLUDE_DIR}/llvm-c/Remarks.h
|
|
||||||
- DESTINATION include/llvm-c
|
|
||||||
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/llvm-c
|
|
||||||
COMPONENT Remarks)
|
|
||||||
|
|
||||||
if (APPLE)
|
|
|
@ -1,35 +0,0 @@
|
||||||
From 5c571082fdaf61f6df19d9b7137dc26d71334058 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Natanael Copa <ncopa@alpinelinux.org>
|
|
||||||
Date: Thu, 18 Feb 2016 10:33:04 +0100
|
|
||||||
Subject: [PATCH 2/3] Fix build with musl libc
|
|
||||||
|
|
||||||
On musl libc the fopen64 and fopen are the same thing, but for
|
|
||||||
compatibility they have a `#define fopen64 fopen`. Same applies for
|
|
||||||
fseek64, fstat64, fstatvfs64, ftello64, lstat64, stat64 and tmpfile64.
|
|
||||||
---
|
|
||||||
include/llvm/Analysis/TargetLibraryInfo.h | 9 +++++++++
|
|
||||||
1 file changed, 9 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/include/llvm/Analysis/TargetLibraryInfo.h b/include/llvm/Analysis/TargetLibraryInfo.h
|
|
||||||
index 7becdf0..7f14427 100644
|
|
||||||
--- a/include/llvm/Analysis/TargetLibraryInfo.h
|
|
||||||
+++ b/include/llvm/Analysis/TargetLibraryInfo.h
|
|
||||||
@@ -18,6 +18,15 @@
|
|
||||||
#include "llvm/IR/Module.h"
|
|
||||||
#include "llvm/Pass.h"
|
|
||||||
|
|
||||||
+#undef fopen64
|
|
||||||
+#undef fseeko64
|
|
||||||
+#undef fstat64
|
|
||||||
+#undef fstatvfs64
|
|
||||||
+#undef ftello64
|
|
||||||
+#undef lstat64
|
|
||||||
+#undef stat64
|
|
||||||
+#undef tmpfile64
|
|
||||||
+
|
|
||||||
namespace llvm {
|
|
||||||
/// VecDesc - Describes a possible vectorization of a function.
|
|
||||||
/// Function 'VectorFnName' is equivalent to 'ScalarFnName' vectorized
|
|
||||||
--
|
|
||||||
2.7.3
|
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
--- lib/Support/Unix/Memory.inc
|
|
||||||
+++ lib/Support/Unix/Memory.inc
|
|
||||||
@@ -126,8 +126,12 @@
|
|
||||||
Result.Address = Addr;
|
|
||||||
Result.Size = NumPages*PageSize;
|
|
||||||
|
|
||||||
- if (PFlags & MF_EXEC)
|
|
||||||
- Memory::InvalidateInstructionCache(Result.Address, Result.Size);
|
|
||||||
+ // Rely on protectMappedMemory to invalidate instruction cache.
|
|
||||||
+ if (PFlags & MF_EXEC) {
|
|
||||||
+ EC = Memory::protectMappedMemory (Result, PFlags);
|
|
||||||
+ if (EC != std::error_code())
|
|
||||||
+ return MemoryBlock();
|
|
||||||
+ }
|
|
||||||
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
@@ -156,15 +160,31 @@
|
|
||||||
return std::error_code(EINVAL, std::generic_category());
|
|
||||||
|
|
||||||
int Protect = getPosixProtectionFlags(Flags);
|
|
||||||
-
|
|
||||||
uintptr_t Start = alignAddr((uint8_t *)M.Address - PageSize + 1, PageSize);
|
|
||||||
uintptr_t End = alignAddr((uint8_t *)M.Address + M.Size, PageSize);
|
|
||||||
+
|
|
||||||
+ bool InvalidateCache = (Flags & MF_EXEC);
|
|
||||||
+
|
|
||||||
+#if defined(__arm__) || defined(__aarch64__)
|
|
||||||
+ // Certain ARM implementations treat icache clear instruction as a memory read,
|
|
||||||
+ // and CPU segfaults on trying to clear cache on !PROT_READ page. Therefore we need
|
|
||||||
+ // to temporarily add PROT_READ for the sake of flushing the instruction caches.
|
|
||||||
+ if (InvalidateCache && !(Protect & PROT_READ)) {
|
|
||||||
+ int Result = ::mprotect((void *)Start, End - Start, Protect | PROT_READ);
|
|
||||||
+ if (Result != 0)
|
|
||||||
+ return std::error_code(errno, std::generic_category());
|
|
||||||
+
|
|
||||||
+ Memory::InvalidateInstructionCache(M.Address, M.Size);
|
|
||||||
+ InvalidateCache = false;
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
int Result = ::mprotect((void *)Start, End - Start, Protect);
|
|
||||||
|
|
||||||
if (Result != 0)
|
|
||||||
return std::error_code(errno, std::generic_category());
|
|
||||||
|
|
||||||
- if (Flags & MF_EXEC)
|
|
||||||
+ if (InvalidateCache)
|
|
||||||
Memory::InvalidateInstructionCache(M.Address, M.Size);
|
|
||||||
|
|
||||||
return std::error_code();
|
|
|
@ -1,13 +0,0 @@
|
||||||
diff --git a/lib/Driver/ToolChains/CommonArgs.cpp b/lib/Driver/ToolChains/CommonArgs.cpp
|
|
||||||
index 6b6e276b8ce7..7896542a1202 100644
|
|
||||||
--- a/lib/Driver/ToolChains/CommonArgs.cpp
|
|
||||||
+++ b/lib/Driver/ToolChains/CommonArgs.cpp
|
|
||||||
@@ -409,7 +409,7 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
|
|
||||||
|
|
||||||
SmallString<1024> Plugin;
|
|
||||||
llvm::sys::path::native(
|
|
||||||
- Twine(D.Dir) + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold" + Suffix,
|
|
||||||
+ Twine("@libllvmLibdir@" "/LLVMgold") + Suffix,
|
|
||||||
Plugin);
|
|
||||||
CmdArgs.push_back(Args.MakeArgString(Plugin));
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
diff --git a/lib/Driver/ToolChains/CommonArgs.cpp b/lib/Driver/ToolChains/CommonArgs.cpp
|
|
||||||
index 37ec73468570..b73e75aa6e59 100644
|
|
||||||
--- a/lib/Driver/ToolChains/CommonArgs.cpp
|
|
||||||
+++ b/lib/Driver/ToolChains/CommonArgs.cpp
|
|
||||||
@@ -370,8 +370,8 @@ void tools::AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SmallString<1024> Plugin;
|
|
||||||
- llvm::sys::path::native(Twine(ToolChain.getDriver().Dir) +
|
|
||||||
- "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold" +
|
|
||||||
+ llvm::sys::path::native(Twine("@libllvmLibdir@"
|
|
||||||
+ "/LLVMgold") +
|
|
||||||
Suffix,
|
|
||||||
Plugin);
|
|
||||||
CmdArgs.push_back(Args.MakeArgString(Plugin));
|
|
|
@ -1,48 +0,0 @@
|
||||||
{ lib, runCommand, stdenv, llvm, lld, version, release_version }:
|
|
||||||
|
|
||||||
let
|
|
||||||
targetPrefix = lib.optionalString (stdenv.hostPlatform != stdenv.targetPlatform) "${stdenv.targetPlatform.config}-";
|
|
||||||
in
|
|
||||||
runCommand "llvm-binutils-${version}"
|
|
||||||
{
|
|
||||||
preferLocalBuild = true;
|
|
||||||
passthru = {
|
|
||||||
isLLVM = true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
(''
|
|
||||||
mkdir -p $out/bin
|
|
||||||
for prog in ${lld}/bin/*; do
|
|
||||||
ln -s $prog $out/bin/${targetPrefix}$(basename $prog)
|
|
||||||
done
|
|
||||||
for prog in ${llvm}/bin/*; do
|
|
||||||
ln -sf $prog $out/bin/${targetPrefix}$(basename $prog)
|
|
||||||
done
|
|
||||||
|
|
||||||
llvmBin="${llvm}/bin"
|
|
||||||
|
|
||||||
ln -s $llvmBin/llvm-ar $out/bin/${targetPrefix}ar
|
|
||||||
ln -s $llvmBin/llvm-ar $out/bin/${targetPrefix}dlltool
|
|
||||||
ln -s $llvmBin/llvm-ar $out/bin/${targetPrefix}ranlib
|
|
||||||
ln -s $llvmBin/llvm-cxxfilt $out/bin/${targetPrefix}c++filt
|
|
||||||
ln -s $llvmBin/llvm-dwp $out/bin/${targetPrefix}dwp
|
|
||||||
ln -s $llvmBin/llvm-nm $out/bin/${targetPrefix}nm
|
|
||||||
ln -s $llvmBin/llvm-objcopy $out/bin/${targetPrefix}objcopy
|
|
||||||
ln -s $llvmBin/llvm-objcopy $out/bin/${targetPrefix}strip
|
|
||||||
ln -s $llvmBin/llvm-objdump $out/bin/${targetPrefix}objdump
|
|
||||||
ln -s $llvmBin/llvm-readobj $out/bin/${targetPrefix}readelf
|
|
||||||
ln -s $llvmBin/llvm-size $out/bin/${targetPrefix}size
|
|
||||||
ln -s $llvmBin/llvm-strings $out/bin/${targetPrefix}strings
|
|
||||||
ln -s $llvmBin/llvm-symbolizer $out/bin/${targetPrefix}addr2line
|
|
||||||
|
|
||||||
if [ -e "$llvmBin/llvm-debuginfod" ]; then
|
|
||||||
ln -s $llvmBin/llvm-debuginfod $out/bin/${targetPrefix}debuginfod
|
|
||||||
ln -s $llvmBin/llvm-debuginfod-find $out/bin/${targetPrefix}debuginfod-find
|
|
||||||
fi
|
|
||||||
|
|
||||||
ln -s ${lld}/bin/lld $out/bin/${targetPrefix}ld
|
|
||||||
|
|
||||||
# Only >=13 show GNU windres compatible in help
|
|
||||||
'' + lib.optionalString (lib.versionAtLeast release_version "13") ''
|
|
||||||
ln -s $llvmBin/llvm-rc $out/bin/${targetPrefix}windres
|
|
||||||
'')
|
|
|
@ -1,30 +0,0 @@
|
||||||
From 4add81bba40dcec62c4ea4481be8e35ac53e89d8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Will Dietz <w@wdtz.org>
|
|
||||||
Date: Thu, 18 May 2017 11:56:12 -0500
|
|
||||||
Subject: [PATCH] "purity" patch for 5.0
|
|
||||||
|
|
||||||
---
|
|
||||||
lib/Driver/ToolChains/Gnu.cpp | 7 -------
|
|
||||||
1 file changed, 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp
|
|
||||||
index fe3c0191bb..c6a482bece 100644
|
|
||||||
--- a/lib/Driver/ToolChains/Gnu.cpp
|
|
||||||
+++ b/lib/Driver/ToolChains/Gnu.cpp
|
|
||||||
@@ -494,13 +494,6 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|
||||||
if (!Args.hasArg(options::OPT_static)) {
|
|
||||||
if (Args.hasArg(options::OPT_rdynamic))
|
|
||||||
CmdArgs.push_back("-export-dynamic");
|
|
||||||
-
|
|
||||||
- if (!Args.hasArg(options::OPT_shared)) {
|
|
||||||
- const std::string Loader =
|
|
||||||
- D.DyldPrefix + ToolChain.getDynamicLinker(Args);
|
|
||||||
- CmdArgs.push_back("-dynamic-linker");
|
|
||||||
- CmdArgs.push_back(Args.MakeArgString(Loader));
|
|
||||||
- }
|
|
||||||
}
|
|
||||||
|
|
||||||
CmdArgs.push_back("-o");
|
|
||||||
--
|
|
||||||
2.11.0
|
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
|
|
||||||
index 3f29afd35971..223d2769cdfc 100644
|
|
||||||
--- a/lib/Driver/Driver.cpp
|
|
||||||
+++ b/lib/Driver/Driver.cpp
|
|
||||||
@@ -491,6 +491,13 @@ DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const {
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+ {
|
|
||||||
+ Arg *A = DAL->MakeFlagArg(/*BaseArg=*/nullptr,
|
|
||||||
+ Opts.getOption(options::OPT_nostdlibinc));
|
|
||||||
+ A->claim();
|
|
||||||
+ DAL->append(A);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
return DAL;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,196 +0,0 @@
|
||||||
{ lib
|
|
||||||
, stdenv
|
|
||||||
, llvm_meta
|
|
||||||
, release_version
|
|
||||||
, cmake
|
|
||||||
, zlib
|
|
||||||
, ncurses
|
|
||||||
, swig
|
|
||||||
, which
|
|
||||||
, libedit
|
|
||||||
, libxml2
|
|
||||||
, libllvm
|
|
||||||
, libclang
|
|
||||||
, python3
|
|
||||||
, version
|
|
||||||
, darwin
|
|
||||||
, lit
|
|
||||||
, makeWrapper
|
|
||||||
, lua5_3
|
|
||||||
, ninja
|
|
||||||
, runCommand
|
|
||||||
, src ? null
|
|
||||||
, monorepoSrc ? null
|
|
||||||
, patches ? [ ]
|
|
||||||
, enableManpages ? false
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
src' =
|
|
||||||
if monorepoSrc != null then
|
|
||||||
runCommand "lldb-src-${version}" { } ''
|
|
||||||
mkdir -p "$out"
|
|
||||||
cp -r ${monorepoSrc}/cmake "$out"
|
|
||||||
cp -r ${monorepoSrc}/lldb "$out"
|
|
||||||
'' else src;
|
|
||||||
in
|
|
||||||
|
|
||||||
stdenv.mkDerivation (rec {
|
|
||||||
passthru.monorepoSrc = monorepoSrc;
|
|
||||||
pname = "lldb";
|
|
||||||
inherit version;
|
|
||||||
|
|
||||||
src = src';
|
|
||||||
inherit patches;
|
|
||||||
|
|
||||||
outputs = [ "out" "lib" "dev" ];
|
|
||||||
|
|
||||||
sourceRoot = lib.optional (lib.versionAtLeast release_version "13") "${src.name}/${pname}";
|
|
||||||
|
|
||||||
nativeBuildInputs = [
|
|
||||||
cmake
|
|
||||||
python3
|
|
||||||
which
|
|
||||||
swig
|
|
||||||
lit
|
|
||||||
makeWrapper
|
|
||||||
lua5_3
|
|
||||||
] ++ lib.optionals enableManpages [
|
|
||||||
python3.pkgs.sphinx
|
|
||||||
python3.pkgs.recommonmark
|
|
||||||
] ++ lib.optionals (lib.versionAtLeast release_version "14") [
|
|
||||||
ninja
|
|
||||||
];
|
|
||||||
|
|
||||||
buildInputs = [
|
|
||||||
ncurses
|
|
||||||
zlib
|
|
||||||
libedit
|
|
||||||
libxml2
|
|
||||||
libllvm
|
|
||||||
] ++ lib.optionals stdenv.isDarwin [
|
|
||||||
darwin.libobjc
|
|
||||||
darwin.apple_sdk.libs.xpc
|
|
||||||
darwin.apple_sdk.frameworks.Foundation
|
|
||||||
darwin.bootstrap_cmds
|
|
||||||
darwin.apple_sdk.frameworks.Carbon
|
|
||||||
darwin.apple_sdk.frameworks.Cocoa
|
|
||||||
]
|
|
||||||
# The older libSystem used on x86_64 macOS is missing the
|
|
||||||
# `<bsm/audit_session.h>` header which `lldb` uses.
|
|
||||||
#
|
|
||||||
# We copy this header over from macOS 10.12 SDK.
|
|
||||||
#
|
|
||||||
# See here for context:
|
|
||||||
# https://github.com/NixOS/nixpkgs/pull/194634#issuecomment-1272129132
|
|
||||||
++ lib.optional
|
|
||||||
(
|
|
||||||
stdenv.targetPlatform.isDarwin
|
|
||||||
&& !stdenv.targetPlatform.isAarch64
|
|
||||||
&& (lib.versionAtLeast release_version "15")
|
|
||||||
)
|
|
||||||
(
|
|
||||||
runCommand "bsm-audit-session-header" { } ''
|
|
||||||
install -Dm444 \
|
|
||||||
"${lib.getDev darwin.apple_sdk.sdk}/include/bsm/audit_session.h" \
|
|
||||||
"$out/include/bsm/audit_session.h"
|
|
||||||
''
|
|
||||||
);
|
|
||||||
|
|
||||||
hardeningDisable = [ "format" ];
|
|
||||||
|
|
||||||
cmakeFlags = [
|
|
||||||
"-DLLDB_INCLUDE_TESTS=${if doCheck then "YES" else "NO"}"
|
|
||||||
"-DLLVM_ENABLE_RTTI=OFF"
|
|
||||||
"-DClang_DIR=${lib.getDev libclang}/lib/cmake"
|
|
||||||
"-DLLVM_EXTERNAL_LIT=${lit}/bin/lit"
|
|
||||||
] ++ lib.optionals stdenv.isDarwin [
|
|
||||||
"-DLLDB_USE_SYSTEM_DEBUGSERVER=ON"
|
|
||||||
] ++ lib.optionals (!stdenv.isDarwin) [
|
|
||||||
"-DLLDB_CODESIGN_IDENTITY=" # codesigning makes nondeterministic
|
|
||||||
] ++ lib.optionals enableManpages ([
|
|
||||||
"-DLLVM_ENABLE_SPHINX=ON"
|
|
||||||
"-DSPHINX_OUTPUT_MAN=ON"
|
|
||||||
"-DSPHINX_OUTPUT_HTML=OFF"
|
|
||||||
] ++ lib.optionals (lib.versionAtLeast release_version "15") [
|
|
||||||
# docs reference `automodapi` but it's not added to the extensions list when
|
|
||||||
# only building the manpages:
|
|
||||||
# https://github.com/llvm/llvm-project/blob/af6ec9200b09039573d85e349496c4f5b17c3d7f/lldb/docs/conf.py#L54
|
|
||||||
#
|
|
||||||
# so, we just ignore the resulting errors
|
|
||||||
"-DSPHINX_WARNINGS_AS_ERRORS=OFF"
|
|
||||||
]) ++ lib.optionals doCheck [
|
|
||||||
"-DLLDB_TEST_C_COMPILER=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc"
|
|
||||||
"-DLLDB_TEST_CXX_COMPILER=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++"
|
|
||||||
];
|
|
||||||
|
|
||||||
doCheck = false;
|
|
||||||
doInstallCheck = lib.versionOlder release_version "15";
|
|
||||||
|
|
||||||
# TODO: cleanup with mass-rebuild
|
|
||||||
installCheckPhase = ''
|
|
||||||
if [ ! -e $lib/${python3.sitePackages}/lldb/_lldb*.so ] ; then
|
|
||||||
echo "ERROR: python files not installed where expected!";
|
|
||||||
return 1;
|
|
||||||
fi
|
|
||||||
'' # Something lua is built on older versions but this file doesn't exist.
|
|
||||||
+ lib.optionalString (lib.versionAtLeast release_version "14") ''
|
|
||||||
if [ ! -e "$lib/lib/lua/${lua5_3.luaversion}/lldb.so" ] ; then
|
|
||||||
echo "ERROR: lua files not installed where expected!";
|
|
||||||
return 1;
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
|
|
||||||
postInstall = ''
|
|
||||||
wrapProgram $out/bin/lldb --prefix PYTHONPATH : $lib/${python3.sitePackages}/
|
|
||||||
|
|
||||||
# Editor support
|
|
||||||
# vscode:
|
|
||||||
install -D ../tools/lldb-vscode/package.json $out/share/vscode/extensions/llvm-org.lldb-vscode-0.1.0/package.json
|
|
||||||
mkdir -p $out/share/vscode/extensions/llvm-org.lldb-vscode-0.1.0/bin
|
|
||||||
ln -s $out/bin/*-vscode $out/share/vscode/extensions/llvm-org.lldb-vscode-0.1.0/bin
|
|
||||||
'';
|
|
||||||
|
|
||||||
meta = llvm_meta // {
|
|
||||||
homepage = "https://lldb.llvm.org/";
|
|
||||||
description = "A next-generation high-performance debugger";
|
|
||||||
longDescription = ''
|
|
||||||
LLDB is a next generation, high-performance debugger. It is built as a set
|
|
||||||
of reusable components which highly leverage existing libraries in the
|
|
||||||
larger LLVM Project, such as the Clang expression parser and LLVM
|
|
||||||
disassembler.
|
|
||||||
'';
|
|
||||||
# llvm <10 never built on aarch64-darwin since first introduction in nixpkgs
|
|
||||||
broken =
|
|
||||||
(lib.versionOlder release_version "11" && stdenv.isDarwin && stdenv.isAarch64)
|
|
||||||
|| (((lib.versions.major release_version) == "13") && stdenv.isDarwin);
|
|
||||||
};
|
|
||||||
} // lib.optionalAttrs enableManpages {
|
|
||||||
pname = "lldb-manpages";
|
|
||||||
|
|
||||||
buildPhase = lib.optionalString (lib.versionOlder release_version "15") ''
|
|
||||||
make ${if (lib.versionOlder release_version "12") then "docs-man" else "docs-lldb-man"}
|
|
||||||
'';
|
|
||||||
|
|
||||||
|
|
||||||
ninjaFlags = lib.optionals (lib.versionAtLeast release_version "15") [ "docs-lldb-man" ];
|
|
||||||
|
|
||||||
propagatedBuildInputs = [ ];
|
|
||||||
|
|
||||||
# manually install lldb man page
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/share/man/man1
|
|
||||||
install docs/man/lldb.1 -t $out/share/man/man1/
|
|
||||||
'';
|
|
||||||
|
|
||||||
postPatch = null;
|
|
||||||
postInstall = null;
|
|
||||||
|
|
||||||
outputs = [ "out" ];
|
|
||||||
|
|
||||||
doCheck = false;
|
|
||||||
|
|
||||||
meta = llvm_meta // {
|
|
||||||
description = "man pages for LLDB ${version}";
|
|
||||||
};
|
|
||||||
})
|
|
|
@ -1,11 +0,0 @@
|
||||||
diff --git a/test/tools/llvm-exegesis/X86/uops-CMOV16rm-noreg.s b/test/tools/llvm-exegesis/X86/uops-CMOV16rm-noreg.s
|
|
||||||
index 3fc1f31d54dc..a4c9bdd92131 100644
|
|
||||||
--- a/test/tools/llvm-exegesis/X86/uops-CMOV16rm-noreg.s
|
|
||||||
+++ b/test/tools/llvm-exegesis/X86/uops-CMOV16rm-noreg.s
|
|
||||||
@@ -1,5 +1,6 @@
|
|
||||||
# RUN: llvm-exegesis -mode=uops -opcode-name=CMOV16rm -benchmarks-file=%t.CMOV16rm-uops.yaml
|
|
||||||
# RUN: FileCheck -check-prefixes=CHECK-YAML -input-file=%t.CMOV16rm-uops.yaml %s
|
|
||||||
+# RUN: sed -i 's,cpu_name:.*,cpu_name: bdver2,g' %t.CMOV16rm-uops.yaml
|
|
||||||
# RUN: llvm-exegesis -mcpu=bdver2 -mode=analysis -benchmarks-file=%t.CMOV16rm-uops.yaml -analysis-clusters-output-file=- -analysis-clustering-epsilon=0.1 -analysis-inconsistency-epsilon=0.1 -analysis-numpoints=1 -analysis-clustering=naive | FileCheck -check-prefixes=CHECK-CLUSTERS %s
|
|
||||||
|
|
||||||
# https://bugs.llvm.org/show_bug.cgi?id=41448
|
|
|
@ -1,39 +0,0 @@
|
||||||
From 1c936d7fda3275265e37f93697232a1ed652390f Mon Sep 17 00:00:00 2001
|
|
||||||
From: Will Dietz <w@wdtz.org>
|
|
||||||
Date: Sat, 9 Jul 2016 19:22:54 -0500
|
|
||||||
Subject: [PATCH] musl fixes/hacks
|
|
||||||
|
|
||||||
Conflicts:
|
|
||||||
|
|
||||||
include/__config
|
|
||||||
include/locale
|
|
||||||
src/locale.cpp
|
|
||||||
---
|
|
||||||
include/locale | 4 ++--
|
|
||||||
1 files changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/locale b/include/locale
|
|
||||||
index 3d804e8..9b01f5b 100644
|
|
||||||
--- a/include/locale
|
|
||||||
+++ b/include/locale
|
|
||||||
@@ -695,7 +695,7 @@ __num_get_signed_integral(const char* __a, const char* __a_end,
|
|
||||||
typename remove_reference<decltype(errno)>::type __save_errno = errno;
|
|
||||||
errno = 0;
|
|
||||||
char *__p2;
|
|
||||||
- long long __ll = strtoll_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE);
|
|
||||||
+ long long __ll = strtoll(__a, &__p2, __base);
|
|
||||||
typename remove_reference<decltype(errno)>::type __current_errno = errno;
|
|
||||||
if (__current_errno == 0)
|
|
||||||
errno = __save_errno;
|
|
||||||
@@ -735,7 +735,7 @@ __num_get_unsigned_integral(const char* __a, const char* __a_end,
|
|
||||||
typename remove_reference<decltype(errno)>::type __save_errno = errno;
|
|
||||||
errno = 0;
|
|
||||||
char *__p2;
|
|
||||||
- unsigned long long __ll = strtoull_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE);
|
|
||||||
+ unsigned long long __ll = strtoull(__a, &__p2, __base);
|
|
||||||
typename remove_reference<decltype(errno)>::type __current_errno = errno;
|
|
||||||
if (__current_errno == 0)
|
|
||||||
errno = __save_errno;
|
|
||||||
--
|
|
||||||
1.7.1
|
|
||||||
|
|
|
@ -1,92 +0,0 @@
|
||||||
From 8c747d3157df2830eed9205e7caf1203b345de17 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Khem Raj <raj.khem@gmail.com>
|
|
||||||
Date: Sat, 4 Feb 2023 13:54:41 -0800
|
|
||||||
Subject: [PATCH] cmake: Enable 64bit off_t on 32bit glibc systems
|
|
||||||
|
|
||||||
Pass -D_FILE_OFFSET_BITS=64 to compiler flags on 32bit glibc based
|
|
||||||
systems. This will make sure that 64bit versions of LFS functions are
|
|
||||||
used e.g. seek will behave same as lseek64. Also revert [1] partially
|
|
||||||
because this added a cmake test to detect lseek64 but then forgot to
|
|
||||||
pass the needed macro to actual compile, this test was incomplete too
|
|
||||||
since libc implementations like musl has 64bit off_t by default on 32bit
|
|
||||||
systems and does not bundle[2] -D_LARGEFILE64_SOURCE under -D_GNU_SOURCE
|
|
||||||
like glibc, which means the compile now fails on musl because the cmake
|
|
||||||
check passes but we do not have _LARGEFILE64_SOURCE defined. Using the
|
|
||||||
*64 function was transitional anyways so use -D_FILE_OFFSET_BITS=64
|
|
||||||
instead
|
|
||||||
|
|
||||||
[1] https://github.com/llvm/llvm-project/commit/8db7e5e4eed4c4e697dc3164f2c9351d8c3e942b
|
|
||||||
[2] https://git.musl-libc.org/cgit/musl/commit/?id=25e6fee27f4a293728dd15b659170e7b9c7db9bc
|
|
||||||
|
|
||||||
Reviewed By: MaskRay
|
|
||||||
|
|
||||||
Differential Revision: https://reviews.llvm.org/D139752
|
|
||||||
|
|
||||||
(cherry picked from commit 5cd554303ead0f8891eee3cd6d25cb07f5a7bf67)
|
|
||||||
---
|
|
||||||
cmake/config-ix.cmake | 13 ++++++++++---
|
|
||||||
include/llvm/Config/config.h.cmake | 3 ---
|
|
||||||
lib/Support/raw_ostream.cpp | 2 --
|
|
||||||
3 files changed, 10 insertions(+), 8 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake
|
|
||||||
index 18977d9950ff..b558aa83fa62 100644
|
|
||||||
--- a/cmake/config-ix.cmake
|
|
||||||
+++ b/cmake/config-ix.cmake
|
|
||||||
@@ -197,9 +197,6 @@ check_symbol_exists(posix_fallocate fcntl.h HAVE_POSIX_FALLOCATE)
|
|
||||||
if( HAVE_SIGNAL_H AND NOT LLVM_USE_SANITIZER MATCHES ".*Address.*" AND NOT APPLE )
|
|
||||||
check_symbol_exists(sigaltstack signal.h HAVE_SIGALTSTACK)
|
|
||||||
endif()
|
|
||||||
-set(CMAKE_REQUIRED_DEFINITIONS "-D_LARGEFILE64_SOURCE")
|
|
||||||
-check_symbol_exists(lseek64 "sys/types.h;unistd.h" HAVE_LSEEK64)
|
|
||||||
-set(CMAKE_REQUIRED_DEFINITIONS "")
|
|
||||||
check_symbol_exists(mallctl malloc_np.h HAVE_MALLCTL)
|
|
||||||
check_symbol_exists(mallinfo malloc.h HAVE_MALLINFO)
|
|
||||||
check_symbol_exists(malloc_zone_statistics malloc/malloc.h
|
|
||||||
@@ -237,6 +234,16 @@ if( PURE_WINDOWS )
|
|
||||||
check_function_exists(__main HAVE___MAIN)
|
|
||||||
check_function_exists(__cmpdi2 HAVE___CMPDI2)
|
|
||||||
endif()
|
|
||||||
+
|
|
||||||
+check_symbol_exists(__GLIBC__ stdio.h LLVM_USING_GLIBC)
|
|
||||||
+if( LLVM_USING_GLIBC )
|
|
||||||
+# enable 64bit off_t on 32bit systems using glibc
|
|
||||||
+ if (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
|
||||||
+ add_compile_definitions(_FILE_OFFSET_BITS=64)
|
|
||||||
+ list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_FILE_OFFSET_BITS=64")
|
|
||||||
+ endif()
|
|
||||||
+endif()
|
|
||||||
+
|
|
||||||
if( HAVE_DLFCN_H )
|
|
||||||
if( HAVE_LIBDL )
|
|
||||||
list(APPEND CMAKE_REQUIRED_LIBRARIES dl)
|
|
||||||
diff --git a/include/llvm/Config/config.h.cmake b/include/llvm/Config/config.h.cmake
|
|
||||||
index e934617d7ec7..3c39c373b3c1 100644
|
|
||||||
--- a/include/llvm/Config/config.h.cmake
|
|
||||||
+++ b/include/llvm/Config/config.h.cmake
|
|
||||||
@@ -112,9 +112,6 @@
|
|
||||||
/* Define to 1 if you have the <link.h> header file. */
|
|
||||||
#cmakedefine HAVE_LINK_H ${HAVE_LINK_H}
|
|
||||||
|
|
||||||
-/* Define to 1 if you have the `lseek64' function. */
|
|
||||||
-#cmakedefine HAVE_LSEEK64 ${HAVE_LSEEK64}
|
|
||||||
-
|
|
||||||
/* Define to 1 if you have the <mach/mach.h> header file. */
|
|
||||||
#cmakedefine HAVE_MACH_MACH_H ${HAVE_MACH_MACH_H}
|
|
||||||
|
|
||||||
diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp
|
|
||||||
index 038ad00bd608..921ab8409008 100644
|
|
||||||
--- a/lib/Support/raw_ostream.cpp
|
|
||||||
+++ b/lib/Support/raw_ostream.cpp
|
|
||||||
@@ -677,8 +677,6 @@ uint64_t raw_fd_ostream::seek(uint64_t off) {
|
|
||||||
flush();
|
|
||||||
#ifdef _WIN32
|
|
||||||
pos = ::_lseeki64(FD, off, SEEK_SET);
|
|
||||||
-#elif defined(HAVE_LSEEK64)
|
|
||||||
- pos = ::lseek64(FD, off, SEEK_SET);
|
|
||||||
#else
|
|
||||||
pos = ::lseek(FD, off, SEEK_SET);
|
|
||||||
#endif
|
|
||||||
--
|
|
||||||
2.37.1
|
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
diff --git llvm/tools/llvm-config/CMakeLists.txt llvm/tools/llvm-config/CMakeLists.txt
|
|
||||||
index 16ba54c0cf2f..20b017195e84 100644
|
|
||||||
--- llvm/tools/llvm-config/CMakeLists.txt
|
|
||||||
+++ llvm/tools/llvm-config/CMakeLists.txt
|
|
||||||
@@ -6,6 +6,7 @@ set(BUILDVARIABLES_OBJPATH ${CMAKE_CURRENT_BINARY_DIR}/BuildVariables.inc)
|
|
||||||
# Add the llvm-config tool.
|
|
||||||
add_llvm_tool(llvm-config
|
|
||||||
llvm-config.cpp
|
|
||||||
+ DISABLE_LLVM_LINK_LLVM_DYLIB
|
|
||||||
)
|
|
||||||
|
|
||||||
# Compute the substitution values for various items.
|
|
|
@ -1,60 +0,0 @@
|
||||||
{ runCommand,
|
|
||||||
clang,
|
|
||||||
gcc64,
|
|
||||||
gcc32,
|
|
||||||
glibc_multi
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
combine = basegcc: runCommand "combine-gcc-libc" {} ''
|
|
||||||
mkdir -p $out
|
|
||||||
cp -r ${basegcc.cc}/lib $out/lib
|
|
||||||
|
|
||||||
chmod u+rw -R $out/lib
|
|
||||||
cp -r ${basegcc.libc}/lib/* $(ls -d $out/lib/gcc/*/*)
|
|
||||||
'';
|
|
||||||
gcc_multi_sysroot = runCommand "gcc-multi-sysroot" {
|
|
||||||
passthru = {
|
|
||||||
inherit (gcc64) version;
|
|
||||||
lib = gcc_multi_sysroot;
|
|
||||||
};
|
|
||||||
} ''
|
|
||||||
mkdir -p $out/lib{,64}/gcc
|
|
||||||
|
|
||||||
ln -s ${combine gcc64}/lib/gcc/* $out/lib64/gcc/
|
|
||||||
ln -s ${combine gcc32}/lib/gcc/* $out/lib/gcc/
|
|
||||||
# XXX: This shouldn't be needed, clang just doesn't look for "i686-unknown"
|
|
||||||
ln -s $out/lib/gcc/i686-unknown-linux-gnu $out/lib/gcc/i686-pc-linux-gnu
|
|
||||||
|
|
||||||
|
|
||||||
# includes
|
|
||||||
mkdir -p $out/include
|
|
||||||
ln -s ${glibc_multi.dev}/include/* $out/include
|
|
||||||
ln -s ${gcc64.cc}/include/c++ $out/include/c++
|
|
||||||
|
|
||||||
# dynamic linkers
|
|
||||||
mkdir -p $out/lib/32
|
|
||||||
ln -s ${glibc_multi.out}/lib/ld-linux* $out/lib
|
|
||||||
ln -s ${glibc_multi.out}/lib/32/ld-linux* $out/lib/32/
|
|
||||||
'';
|
|
||||||
|
|
||||||
clangMulti = clang.override {
|
|
||||||
# Only used for providing expected structure re:dynamic linkers, AFAIK Most
|
|
||||||
# of the magic is done by setting the --gcc-toolchain option via
|
|
||||||
# `gccForLibs`.
|
|
||||||
libc = gcc_multi_sysroot;
|
|
||||||
|
|
||||||
bintools = clang.bintools.override {
|
|
||||||
libc = gcc_multi_sysroot;
|
|
||||||
};
|
|
||||||
|
|
||||||
gccForLibs = gcc_multi_sysroot // {
|
|
||||||
inherit (glibc_multi) libgcc;
|
|
||||||
langCC =
|
|
||||||
assert (gcc64.cc.langCC != gcc32.cc.langCC)
|
|
||||||
-> throw "(gcc64.cc.langCC=${gcc64.cc.langCC}) != (gcc32.cc.langCC=${gcc32.cc.langCC})";
|
|
||||||
gcc64.cc.langCC;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
in clangMulti
|
|
|
@ -1,33 +0,0 @@
|
||||||
# The contents of this file are partially dependend on
|
|
||||||
# the adapter that you have. Please modify accordingly.
|
|
||||||
adapter driver ftdi
|
|
||||||
ftdi vid_pid 0x0403 0x6010
|
|
||||||
ftdi channel 0
|
|
||||||
# Every pin set as high impedance except TCK, TDI, TDO and TMS
|
|
||||||
ftdi layout_init 0x0088 0x008b
|
|
||||||
|
|
||||||
# nSRST defined on pin CN2-13 of the MiniModule (pin ADBUS5 [AD5] on the FT2232H chip)
|
|
||||||
# This choice is arbitrary. Use other GPIO pin if desired.
|
|
||||||
ftdi layout_signal nSRST -data 0x0020 -oe 0x0020
|
|
||||||
|
|
||||||
transport select jtag
|
|
||||||
adapter speed 10000
|
|
||||||
|
|
||||||
set PL_TAPID 0x13722093
|
|
||||||
set SMP 1
|
|
||||||
|
|
||||||
source ./zynq-7000.cfg
|
|
||||||
|
|
||||||
reset_config srst_only srst_open_drain
|
|
||||||
adapter srst pulse_width 250
|
|
||||||
adapter srst delay 400
|
|
||||||
|
|
||||||
source ./common.cfg
|
|
||||||
|
|
||||||
reset halt
|
|
||||||
|
|
||||||
# Disable MMU
|
|
||||||
targets $_TARGETNAME_1
|
|
||||||
arm mcr 15 0 1 0 0 [expr { [arm mrc 15 0 1 0 0] & ~0xd }]
|
|
||||||
targets $_TARGETNAME_0
|
|
||||||
arm mcr 15 0 1 0 0 [expr { [arm mrc 15 0 1 0 0] & ~0xd }]
|
|
|
@ -8,7 +8,6 @@ edition = "2018"
|
||||||
[features]
|
[features]
|
||||||
target_zc706 = ["libboard_zynq/target_zc706", "libsupport_zynq/target_zc706", "libconfig/target_zc706"]
|
target_zc706 = ["libboard_zynq/target_zc706", "libsupport_zynq/target_zc706", "libconfig/target_zc706"]
|
||||||
target_coraz7 = ["libboard_zynq/target_coraz7", "libsupport_zynq/target_coraz7", "libconfig/target_coraz7"]
|
target_coraz7 = ["libboard_zynq/target_coraz7", "libsupport_zynq/target_coraz7", "libconfig/target_coraz7"]
|
||||||
target_ebaz4205 = ["libboard_zynq/target_ebaz4205", "libsupport_zynq/target_ebaz4205", "libconfig/target_ebaz4205"]
|
|
||||||
target_redpitaya = ["libboard_zynq/target_redpitaya", "libsupport_zynq/target_redpitaya", "libconfig/target_redpitaya"]
|
target_redpitaya = ["libboard_zynq/target_redpitaya", "libsupport_zynq/target_redpitaya", "libconfig/target_redpitaya"]
|
||||||
target_kasli_soc = ["libboard_zynq/target_kasli_soc", "libsupport_zynq/target_kasli_soc", "libconfig/target_kasli_soc"]
|
target_kasli_soc = ["libboard_zynq/target_kasli_soc", "libsupport_zynq/target_kasli_soc", "libconfig/target_kasli_soc"]
|
||||||
default = ["target_zc706"]
|
default = ["target_zc706"]
|
||||||
|
|
|
@ -80,15 +80,12 @@ pub fn main_core0() {
|
||||||
);
|
);
|
||||||
info!("Simple Zynq Loader starting...");
|
info!("Simple Zynq Loader starting...");
|
||||||
|
|
||||||
#[cfg(not(any(feature = "target_kasli_soc", feature = "target_ebaz4205")))]
|
#[cfg(not(feature = "target_kasli_soc"))]
|
||||||
const CPU_FREQ: u32 = 800_000_000;
|
const CPU_FREQ: u32 = 800_000_000;
|
||||||
|
|
||||||
#[cfg(feature = "target_kasli_soc")]
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
const CPU_FREQ: u32 = 1_000_000_000;
|
const CPU_FREQ: u32 = 1_000_000_000;
|
||||||
|
|
||||||
#[cfg(feature = "target_ebaz4205")]
|
|
||||||
const CPU_FREQ: u32 = 666_666_666;
|
|
||||||
|
|
||||||
ArmPll::setup(2 * CPU_FREQ);
|
ArmPll::setup(2 * CPU_FREQ);
|
||||||
Clocks::set_cpu_freq(CPU_FREQ);
|
Clocks::set_cpu_freq(CPU_FREQ);
|
||||||
IoPll::setup(1_000_000_000);
|
IoPll::setup(1_000_000_000);
|
||||||
|
|
Loading…
Reference in New Issue