Skip to content

Commit

Permalink
Setup repository
Browse files Browse the repository at this point in the history
  • Loading branch information
t-wallet committed Jul 23, 2024
1 parent 12b562b commit e205083
Show file tree
Hide file tree
Showing 10 changed files with 571 additions and 0 deletions.
47 changes: 47 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
dist/
build/
dist-newstyle/
.stack-work/
stack.yaml.lock
cabal-dev
/cabal.project.local
.ghc.environment.*
*.o
*.o-boot
*.hi
*.hi-boot
*.po
*.po-boot
*.p_o
*.p_o-boot
*.chi
*.chs.h
*.dyn_o
*.dyn_o-boot
*.dyn_hi
*.dyn_hi-boot
.virtualenv
.hpc
.hsenv
.cabal-sandbox/
cabal.sandbox.config
cabal.config
*.prof
*.aux
*.hp
*.bin
*.log
*.tar.gz
stack.yaml.lock

*~
*.DS_Store

# IntelliJ
/.idea
*.iml

# HDL directories often created during development cycle
/vhdl
/verilog
/systemverilog
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Clash Cores
TODO
10 changes: 10 additions & 0 deletions cabal.project
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
packages:
clash-cores.cabal

package clash-cores
ghc-options: +RTS -qn4 -A128M -RTS -j4

write-ghc-environment-files: always

-- Eliminates the need for `--enable-tests`, which is needed for HLS.
tests: true
6 changes: 6 additions & 0 deletions default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{ nixpkgs ? import ./nix/nixpkgs.nix {} }:

with nixpkgs.pkgs;
with gitignore;

haskellPackages.callCabal2nix "clash-cores" (gitignoreSource ./.) {}
139 changes: 139 additions & 0 deletions nix/aarch64-reloc.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
From bd887b9f8a669f2269c4c420a23b64569be351b5 Mon Sep 17 00:00:00 2001
From: Sylvain Henry <[email protected]>
Date: Wed, 19 Jun 2024 16:55:18 +0200
Subject: [PATCH 1/3] Linker: use m32 allocator for sections when NEED_PLT
(#24432)

Use M32 allocator to avoid fragmentation when allocating ELF sections.
We already did this when NEED_PLT was undefined. Failing to do this led
to relocations impossible to fulfil (#24432).
---
rts/linker/Elf.c | 26 ++++++++++++--------------
1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/rts/linker/Elf.c b/rts/linker/Elf.c
index 9132d9d3973..8168103e4e5 100644
--- a/rts/linker/Elf.c
+++ b/rts/linker/Elf.c
@@ -863,25 +863,23 @@ ocGetNames_ELF ( ObjectCode* oc )

unsigned nstubs = numberOfStubsForSection(oc, i);
unsigned stub_space = STUB_SIZE * nstubs;
+ unsigned full_size = size+stub_space;

- void * mem = mmapAnonForLinker(size+stub_space);
+ // use M32 allocator to avoid fragmentation and relocations impossible
+ // to fulfil (cf #24432)
+ bool executable = kind == SECTIONKIND_CODE_OR_RODATA;
+ m32_allocator *allocator = executable ? oc->rx_m32 : oc->rw_m32;

- if( mem == MAP_FAILED ) {
- barf("failed to mmap allocated memory to load section %d. "
- "errno = %d", i, errno);
- }
+ // Correctly align the section. This is particularly important for
+ // the alignment of .rodata.cstNN sections.
+ start = m32_alloc(allocator, full_size, align);
+ if (start == NULL) goto fail;
+ alloc = SECTION_M32;

/* copy only the image part over; we don't want to copy data
* into the stub part.
*/
- memcpy( mem, oc->image + offset, size );
-
- alloc = SECTION_MMAP;
-
- mapped_offset = 0;
- mapped_size = roundUpToPage(size+stub_space);
- start = mem;
- mapped_start = mem;
+ memcpy(start, oc->image + offset, size);
#else
if (USE_CONTIGUOUS_MMAP || RtsFlags.MiscFlags.linkerAlwaysPic) {
// already mapped.
@@ -918,7 +916,7 @@ ocGetNames_ELF ( ObjectCode* oc )

#if defined(NEED_PLT)
oc->sections[i].info->nstubs = 0;
- oc->sections[i].info->stub_offset = (uint8_t*)mem + size;
+ oc->sections[i].info->stub_offset = (uint8_t*)start + size;
oc->sections[i].info->stub_size = stub_space;
oc->sections[i].info->stubs = NULL;
#else
--
GitLab


From 976ec5d51ab1f185b7d9ba2c15f326f2a4c8828c Mon Sep 17 00:00:00 2001
From: Sylvain Henry <[email protected]>
Date: Thu, 27 Jun 2024 16:40:50 +0200
Subject: [PATCH 2/3] RTS: allow M32 allocation outside of 4GB range when
assuming -fPIC

---
rts/linker/M32Alloc.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/rts/linker/M32Alloc.c b/rts/linker/M32Alloc.c
index 17d3d12459c..adff1b22957 100644
--- a/rts/linker/M32Alloc.c
+++ b/rts/linker/M32Alloc.c
@@ -156,7 +156,10 @@ static bool
is_okay_address(void *p) {
int8_t *here = LINKER_LOAD_BASE;
ssize_t displacement = (int8_t *) p - here;
- return (displacement > -0x7fffffff) && (displacement < 0x7fffffff);
+ // if we assume -fPIC, we don't care where we load code.
+ // But we still want to use the m32 allocator to avoid fragmentation (#24432)
+ return RtsFlags.MiscFlags.linkerAlwaysPic
+ || ((displacement > -0x7fffffff) && (displacement < 0x7fffffff));
}

enum m32_page_type {
--
GitLab


From 54de3a80ebac9a782cf0cc91f3a3afcc94615817 Mon Sep 17 00:00:00 2001
From: Sylvain Henry <[email protected]>
Date: Tue, 9 Jul 2024 13:00:08 +0200
Subject: [PATCH 3/3] Linker: fix stub offset

Remove unjustified +8 offset that leads to memory corruption (cf
discussion in #24432).
---
rts/linker/elf_plt.c | 3 +--
rts/linker/macho/plt.c | 3 +--
2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/rts/linker/elf_plt.c b/rts/linker/elf_plt.c
index 9cd42efff23..5c6ef8ed442 100644
--- a/rts/linker/elf_plt.c
+++ b/rts/linker/elf_plt.c
@@ -56,8 +56,7 @@ makeStub(Section * section,
s->target = *addr;
s->flags = flags;
s->next = NULL;
- s->addr = (uint8_t *)section->info->stub_offset + 8
- + STUB_SIZE * section->info->nstubs;
+ s->addr = (uint8_t *)section->info->stub_offset + STUB_SIZE * section->info->nstubs;

if((*_makeStub)(s))
return EXIT_FAILURE;
diff --git a/rts/linker/macho/plt.c b/rts/linker/macho/plt.c
index ed005ba447a..6eb94c29cb0 100644
--- a/rts/linker/macho/plt.c
+++ b/rts/linker/macho/plt.c
@@ -56,8 +56,7 @@ makeStub(Section * section,
s->target = *addr;
s->flags = flags;
s->next = NULL;
- s->addr = (uint8_t *)section->info->stub_offset + 8
- + STUB_SIZE * section->info->nstubs;
+ s->addr = (uint8_t *)section->info->stub_offset + STUB_SIZE * section->info->nstubs;

if((*_makeStub)(s))
return EXIT_FAILURE;
--
GitLab
47 changes: 47 additions & 0 deletions nix/nixpkgs.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{ sources ? import ./sources.nix }:

let
haskell_compiler = "ghc965";

overlay = _: pkgs: {

# Nix tooling
niv = (import sources.niv {}).niv;
gitignore = import sources.gitignore { inherit (pkgs) lib; };

haskell = pkgs.haskell // {
compiler = pkgs.haskell.compiler // {
"${haskell_compiler}" = pkgs.haskell.compiler.${haskell_compiler}.overrideAttrs (old: {
# Fix for linking issues: https://gitlab.haskell.org/ghc/ghc/-/issues/24432
patches =
let isAarch64 = pkgs.stdenv.hostPlatform.system == "aarch64-linux";
in (old.patches or [ ]) ++ pkgs.lib.optional isAarch64 [ ./aarch64-reloc.patch ];
});
};
};

# Haskell overrides
haskellPackages = pkgs.haskell.packages.${haskell_compiler}.override {
overrides = self: super: {
# Add overrides here
circuit-notation =
self.callCabal2nix "circuit-notation" sources.circuit-notation {};
doctest-parallel =
self.callCabal2nix "doctest-parallel" sources.doctest-parallel {};
clash-prelude =
self.callCabal2nix "clash-prelude" (sources.clash-compiler + "/clash-prelude") {};
clash-lib =
self.callCabal2nix "clash-lib" (sources.clash-compiler + "/clash-lib") {};
clash-ghc =
self.callCabal2nix "clash-ghc" (sources.clash-compiler + "/clash-ghc") {};
clash-prelude-hedgehog =
self.callCabal2nix "clash-prelude" (sources.clash-compiler + "/clash-prelude-hedgehog") {};
tasty-hedgehog =
self.callCabal2nix "tasty-hedgehog" sources.tasty-hedgehog {};
hedgehog =
self.callCabal2nix "hedgehog" (sources.haskell-hedgehog + "/hedgehog") {};
};
};
};

in import sources.nixpkgs { overlays = [ overlay ]; }
102 changes: 102 additions & 0 deletions nix/sources.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
{
"clash-compiler": {
"branch": "master",
"description": "Haskell to VHDL/Verilog/SystemVerilog compiler",
"homepage": "https://clash-lang.org/",
"owner": "clash-lang",
"repo": "clash-compiler",
"rev": "aba55fed9f45711c8336935721a43d243f7f78c1",
"sha256": "1hrzp8g189v46qfr9ds7w6w0yj5w8y4im1pa3lf5vjx3z64v26qv",
"type": "tarball",
"url": "https://github.com/clash-lang/clash-compiler/archive/aba55fed9f45711c8336935721a43d243f7f78c1.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz",
"version": "1.8.1"
},
"doctest-parallel": {
"branch": "main",
"description": "Test interactive Haskell examples",
"homepage": null,
"owner": "martijnbastiaan",
"repo": "doctest-parallel",
"rev": "d73df0a2fd58b0b6aba438eb40aa56d30724e42a",
"sha256": "1k88bkwz2crvb6dafcf6y5y6wm0m2qvds57f3b0rx4id7la4qv89",
"type": "tarball",
"url": "https://github.com/martijnbastiaan/doctest-parallel/archive/d73df0a2fd58b0b6aba438eb40aa56d30724e42a.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz",
"version": "0.3.1"
},
"gitignore": {
"branch": "master",
"description": "Nix function for filtering local git sources",
"homepage": "",
"owner": "hercules-ci",
"repo": "gitignore",
"rev": "bff2832ec341cf30acb3a4d3e2e7f1f7b590116a",
"sha256": "0va0janxvmilm67nbl81gdbpppal4aprxzb25gp9pqvf76ahxsci",
"type": "tarball",
"url": "https://github.com/hercules-ci/gitignore/archive/bff2832ec341cf30acb3a4d3e2e7f1f7b590116a.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"haskell-hedgehog": {
"branch": "master",
"description": "Release with confidence, state-of-the-art property testing for Haskell.",
"homepage": "",
"owner": "hedgehogqa",
"repo": "haskell-hedgehog",
"rev": "52c35cabe24de2a1c03e72dde9d04b64f81d1f44",
"sha256": "1f9znljkmrdd4nlfmjfi8kx0fgcysp328rz27099n7bygchpgjr6",
"type": "tarball",
"url": "https://github.com/hedgehogqa/haskell-hedgehog/archive/52c35cabe24de2a1c03e72dde9d04b64f81d1f44.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz",
"version": "1.4"
},
"circuit-notation": {
"branch": "master",
"description": "A plugin for circuit notation",
"homepage": null,
"owner": "cchalmers",
"repo": "circuit-notation",
"rev": "19b386c4aa3ff690758ae089c7754303f3500cc9",
"sha256": "0qz2w6akxj51kq50rbl88bnjyxzd2798a9sn9jj1z2kak7a6kqbg",
"type": "tarball",
"url": "https://github.com/cchalmers/circuit-notation/archive/19b386c4aa3ff690758ae089c7754303f3500cc9.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"niv": {
"branch": "master",
"description": "Easy dependency management for Nix projects",
"homepage": "https://github.com/nmattia/niv",
"owner": "nmattia",
"repo": "niv",
"rev": "723f0eeb969a730db3c30f977c2b66b9dce9fe4a",
"sha256": "0016l7230gd2kdh0g2w573r9a2krqb7x4ifcjhhsn4h1bwap7qr0",
"type": "tarball",
"url": "https://github.com/nmattia/niv/archive/723f0eeb969a730db3c30f977c2b66b9dce9fe4a.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"nixpkgs": {
"branch": "nixpkgs-unstable",
"description": "Nix Packages collection",
"homepage": "",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "e2dd4e18cc1c7314e24154331bae07df76eb582f",
"sha256": "19zbxf7rb787jvyrfhl4z9sn3aisd6xvx6ikybbi75ym9sy39jds",
"type": "tarball",
"url": "https://github.com/NixOS/nixpkgs/archive/e2dd4e18cc1c7314e24154331bae07df76eb582f.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"tasty-hedgehog": {
"branch": "master",
"description": "Tasty integration for the Hedgehog property testing library",
"homepage": "",
"owner": "qfpl",
"repo": "tasty-hedgehog",
"rev": "ed07ecef3f6a01572b577b450ba6d58108173125",
"sha256": "1b8y5ibg1ihgf44nyym4g45lwmabymfcjb2nigv93s2fmng9zp6r",
"type": "tarball",
"url": "https://github.com/qfpl/tasty-hedgehog/archive/ed07ecef3f6a01572b577b450ba6d58108173125.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz",
"version": "1.4.0.2"
}
}
Loading

0 comments on commit e205083

Please sign in to comment.