boc-sys 0.0.1

Implementation details of boc.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
name: snmalloc CI

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ main ]
  pull_request:
    branches: [ main, snmalloc1 ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:
  linux:
    strategy:
      matrix:
        # Build each combination of OS and release/debug variants
        os: [ "ubuntu-latest", "ubuntu-18.04", "ubuntu-20.04", "macos-11", "macos-12" ]
        build-type: [ Release, Debug ]
        # Extra cmake flags.  GitHub Actions matrix overloads `include` to mean
        # 'add extra things to a job' and 'add jobs'.  You can add extra things
        # to a job by specifying things that exist in a job created from the
        # matrix definition and adding things.  You can specify extra jobs by
        # specifying properties that don't match existing jobs.  We use
        # `cmake-flags` to add cmake flags to all jobs matching a pattern and
        # `extra-cmake-flags` to specify a new job with custom CMake flags.
        extra-cmake-flags: [ "" ]
        # Modify the complete matrix
        include:
          # Provide the dependency installation for each platform
          - os: "ubuntu-18.04"
            dependencies: "sudo apt install ninja-build"
            cmake-flags: "-DSNMALLOC_USE_CXX17=ON"
          - os: "ubuntu-20.04"
            dependencies: "sudo apt install ninja-build"
          - os: "ubuntu-latest" # 22.04 at time of writing
            dependencies: "sudo apt install ninja-build"
          - os: "macos-11"
            # The homebrew packages are broken at the moment and error out
            # after trying to install Python as a dependency of ninja because
            # 2to3 exists.  As a quick hack, delete it first.  This should be
            # removed once the homebrew install is fixed.
            dependencies: "rm -f /usr/local/bin/2to3 ; brew update && brew install ninja"
          - os: "macos-12"
            dependencies: "rm -f /usr/local/bin/2to3 ; brew update && brew install ninja"
          # Add the self-host build, using the bounds-checked memcpy in
          # maximally paranoid mode (checking loads and stores)
          - os: "ubuntu-latest"
            build-type: Debug
            self-host: true
            extra-cmake-flags: "-DSNMALLOC_MEMCPY_BOUNDS=ON -DSNMALLOC_CHECK_LOADS=ON"
            dependencies: "sudo apt install ninja-build"
          # Extra build to check using pthread library for destructing local state.
          - os: "ubuntu-latest"
            variant: "with pthread destructors"
            dependencies: "sudo apt install ninja-build"
            build-type: Debug
            self-host: true
            extra-cmake-flags: "-DSNMALLOC_USE_PTHREAD_DESTRUCTORS=On"
          # Extra build to check using individual mitigations works.
          - os: "ubuntu-latest"
            variant: "individual mitigations"
            dependencies: "sudo apt install ninja-build"
            build-type: Release
            self-host: true
            extra-cmake-flags: "-DSNMALLOC_BENCHMARK_INDIVIDUAL_MITIGATIONS=On -DBUILD_TESTING=Off"
          # Check that we can build specifically with libstdc++
          - os: "ubuntu-latest"
            variant: "libstdc++ (Build only)"
            dependencies: "sudo apt install ninja-build"
            extra-cmake-flags: "-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_CXX_FLAGS=-stdlib=libstdc++"
            build-only: yes
          # Replay some of the above tests with clang-10 specifically
          - os: "ubuntu-20.04"
            variant: "clang-10 (with pthread destructors)."
            dependencies: "sudo apt install ninja-build"
            build-type: Debug
            self-host: true
            extra-cmake-flags: "-DSNMALLOC_USE_PTHREAD_DESTRUCTORS=On -DCMAKE_CXX_COMPILER=clang++-10 -DCMAKE_C_COMPILER=clang-10"
          - os: "ubuntu-20.04"
            variant: "clang-10 libstdc++ (Build only)"
            dependencies: "sudo apt install ninja-build"
            extra-cmake-flags: "-DCMAKE_CXX_COMPILER=clang++-10 -DCMAKE_C_COMPILER=clang-10 -DCMAKE_CXX_FLAGS=-stdlib=libstdc++"
            build-only: yes
      # Don't abort runners if a single one fails
      fail-fast: false
    runs-on: ${{ matrix.os }}
    name: ${{ matrix.os }} ${{ matrix.build-type }} ${{ matrix.variant }}
    steps:
    - uses: actions/checkout@v3
    - name: Install build dependencies
      run: ${{ matrix.dependencies }}
    - name: Configure CMake
      run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.build-type}} -G Ninja ${{ matrix.cmake-flags }} ${{ matrix.extra-cmake-flags }}
      # Build with a nice ninja status line
    - name: Build
      working-directory: ${{github.workspace}}/build
      run: NINJA_STATUS="%p [%f:%s/%t] %o/s, %es" ninja
    - name: Test file size of binaries is sane
      working-directory: ${{github.workspace}}/build
      run: "ls -l libsnmallocshim.* ; [ $(ls -l libsnmallocshim.* | awk '{ print $5}') -lt 10000000 ]"
      # If the tests are enabled for this job, run them
    - name: Test
      if: ${{ matrix.build-only != 'yes' }}
      working-directory: ${{github.workspace}}/build
      run: ctest --output-on-failure -j 4 -C ${{ matrix.build-type }} --timeout 400
    - name: Selfhost
      if: ${{ matrix.self-host }}
      working-directory: ${{github.workspace}}/build
      run: |
        mkdir libs
        cp libsnmallocshim*.so libs
        for lib in `ls libs`; do echo; echo Testing $lib; ninja clean; LD_PRELOAD=libs/$lib ninja libsnmallocshim.so; done
  # GitHub doesn't natively support *BSD, but we can run them in VMs on Mac /
  # Linux runners
  freebsd:
    strategy:
      matrix:
        # Build each combination of OS, version, and release/debug variants
        # FreeBSD and OpenBSD run on xhyve, netbsd needs qemu
        os:
          - version: '13.1'
            dependencies: pkg ins -y cmake ninja
          - version: '12.3'
            dependencies: pkg ins -y cmake ninja
        build-type: [ Release, Debug ]
      # Don't abort runners if a single one fails
      fail-fast: false
    # Kill these jobs if they take too long.
    timeout-minutes: 25
    runs-on: macos-latest
    name: FreeBSD-${{ matrix.os.version}} ${{ matrix.build-type }}
    steps:
    - uses: actions/checkout@v3
    - uses: vmactions/freebsd-vm@v0
      with:
        release: ${{ matrix.os.version}}
        usesh: true
        mem: 8192
        copyback: false
        prepare: |
          ${{ matrix.os.dependencies }}
        run: |
          set -e
          cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.build-type}} -G Ninja 
          cd ${{github.workspace}}/build
          NINJA_STATUS="%p [%f:%s/%t] %o/s, %es" ninja
          ctest -j 4 --output-on-failure -E '(perf-.*)|(.*-malloc$)' --timeout 400

  netbsd:
    strategy:
      matrix:
        # Build each combination of OS, version, and release/debug variants
        # FreeBSD and OpenBSD run on xhyve, netbsd needs qemu
        os:
          - version: '9.2'
            dependencies: |
              pkg_add cmake ninja-build gcc10
        build-type: [ Release, Debug ]
      # Don't abort runners if a single one fails
      fail-fast: false
    # Kill these jobs if they take too long.
    timeout-minutes: 25
    runs-on: macos-latest
    name: NetBSD-${{ matrix.os.version}} ${{ matrix.build-type }}
    steps:
    - uses: actions/checkout@v3
    - uses: vmactions/netbsd-vm@v0
      with:
        release: ${{ matrix.os.version}}
        usesh: true
        mem: 8192
        copyback: false
        prepare: |
          ${{ matrix.os.dependencies }}
        run: |
          set -e
          cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.build-type}} -G Ninja -DCMAKE_CXX_COMPILER=/usr/pkg/gcc10/bin/g++ -DCMAKE_C_COMPILER=/usr/pkg/gcc10/bin/gcc
          cd ${{github.workspace}}/build
          NINJA_STATUS="%p [%f:%s/%t] %o/s, %es" ninja
          ctest -j 4 --output-on-failure -E '(perf-.*)|(.*-malloc$)' --timeout 400

  ## Without overcommit, or explicit commit the current implementation cannot be made to work on openbsd.
  ## We could add a layered pagemap for openbsd, that would address the requirements. 
  # openbsd:
  #   strategy:
  #     matrix:
  #       # Build each combination of OS, version, and release/debug variants
  #       os:
  #         - version: '7.2'
  #           dependencies: pkg_add -I cmake ninja
  #       build-type: [ Release, Debug ]
  #     # Don't abort runners if a single one fails
  #     fail-fast: false
  #   # Kill these jobs if they take too long.
  #   timeout-minutes: 25
  #   runs-on: macos-latest
  #   name: OpenBSD-${{ matrix.os.version}} ${{ matrix.build-type }}
  #   steps:
  #   - uses: actions/checkout@v3
  #   - uses: vmactions/openbsd-vm@v0
  #     with:
  #       release: ${{ matrix.os.version}}
  #       usesh: true
  #       mem: 8192
  #       copyback: false
  #       prepare: |
  #         ${{ matrix.os.dependencies }}
  #       run: |
  #         set -e
  #         cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.build-type}} -G Ninja
  #         cd ${{github.workspace}}/build
  #         NINJA_STATUS="%p [%f:%s/%t] %o/s, %es" ninja
  #         ctest -j 4 --output-on-failure -E '(perf-.*)|(.*-malloc$)' --timeout 400

  sanitizer:
    strategy:
      matrix:
        # Build just release variant as Debug is too slow.
        build-type: [ Release ]
        include:
          - os: "ubuntu-latest"
            continue-on-error: # Don't class as an error if this fails, until we have a more reliablity.
            variant: "libc++ (TSan + UBSan)"
            dependencies: "sudo apt install ninja-build"
            extra-cmake-flags: "-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_CXX_FLAGS=-stdlib=\"libc++ -g\" -DSNMALLOC_SANITIZER=undefined,thread"
          # Also test specifically with clang-10 (on ubuntu-20.04)
          - os: "ubuntu-20.04"
            continue-on-error: # Don't class as an error if this fails, until we have a more reliablity.
            variant: "clang-10 libc++ (TSan + UBSan)"
            dependencies: "sudo apt install ninja-build"
            extra-cmake-flags: "-DCMAKE_CXX_COMPILER=clang++-10 -DCMAKE_CXX_FLAGS=-stdlib=\"libc++ -g\" -DSNMALLOC_SANITIZER=undefined,thread"
      # Don't abort runners if a single one fails
      fail-fast: false
    runs-on: ${{ matrix.os }}
    name: ${{ matrix.os }} ${{ matrix.build-type }} ${{ matrix.variant }}
    steps:
    - uses: actions/checkout@v3
    - name: Install build dependencies
      run: ${{ matrix.dependencies }}
    - name: Configure CMake
      run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.build-type}} -G Ninja ${{ matrix.cmake-flags }} ${{ matrix.extra-cmake-flags }}
      # Build with a nice ninja status line
    - name: Build
      working-directory: ${{github.workspace}}/build
      run: NINJA_STATUS="%p [%f:%s/%t] %o/s, %es" ninja
    - name: Test
      working-directory: ${{github.workspace}}/build
      run: ctest --output-on-failure -j 4 -C ${{ matrix.build-type }} --timeout 400 -E "memcpy|external_pointer" --repeat-until-fail 2

  qemu-crossbuild:
    strategy:
      matrix:
        build-type: [ Release, Debug ]
        arch:
          - name: armhf
            system-processor: arm
            triple: arm-linux-gnueabihf
            rtld: ld-linux-armhf.so.3
            ld-flavour: lld
            host-os: ubuntu-latest
          - name: arm64
            system-processor: aarch64
            triple: aarch64-linux-gnu
            rtld: ld-linux-aarch64.so.1
            ld-flavour: lld
            host-os: ubuntu-latest
          - name: ppc64el
            system-processor: powerpc64le
            triple: powerpc64le-linux-gnu
            rtld: ld64.so.2
            ld-flavour: lld
            # See https://github.com/microsoft/snmalloc/issues/576
            host-os: ubuntu-20.04
          - name: riscv64
            system-processor: riscv64
            triple: riscv64-linux-gnu
            rtld: ld-linux-riscv64-lp64d.so.1
            extra-packages: binutils-riscv64-linux-gnu
            ld-flavour: bfd
            ld: /usr/bin/riscv64-linux-gnu-ld.bfd
            host-os: ubuntu-latest
      # Don't abort runners if a single one fails
      fail-fast: false
    runs-on: ${{matrix.arch.host-os}}
    name: ${{matrix.build-type}} cross-build for ${{ matrix.arch.triple }}
    steps:
    - uses: actions/checkout@v3
    - name: "Install cross-compile toolchain and QEMU (ubuntu-20.04)"
      # Install the dependencies and clang 13.  Earlier versions of clang don't
      # find the multilib things for this week's Ubuntu filesystem layout.
      if: matrix.arch.host-os == 'ubuntu-20.04'
      run: |
        wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
        sudo add-apt-repository "deb http://apt.llvm.org/focal/     llvm-toolchain-focal-13  main"
        sudo apt update
        sudo apt install libstdc++-9-dev-${{ matrix.arch.name }}-cross qemu-user ninja-build clang-13 lld-13
        sudo apt install ${{matrix.arch.extra-packages}}
    - name: "Install cross-compile toolchain and QEMU (ubuntu-latest)"
      if: matrix.arch.host-os == 'ubuntu-latest'
      run: |
        sudo apt update
        sudo apt install libstdc++-12-dev-${{ matrix.arch.name }}-cross qemu-user ninja-build
        sudo apt install ${{matrix.arch.extra-packages}}
    - name: Reconfigure for PowerPC64LE
      if: startsWith(matrix.arch.triple, 'powerpc64le')
      # The default PowerPC qemu configuration uses the wrong page size.
      # Wrap it in a script that fixes this.
      run: |
        sudo update-binfmts --disable qemu-ppc64le
        sudo sh -c 'echo ":qemu-ppc64le:M:0:\x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x15\x00:\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\x00:`pwd`/ppc64.sh:" > /proc/sys/fs/binfmt_misc/register'
        echo '#!/bin/sh' > ppc64.sh
        echo '/usr/bin/qemu-ppc64le -p 65536 $@' >> ppc64.sh
        chmod +x ppc64.sh
    - name: Configure
      env:
        SNMALLOC_CI_CLANG_VERSION: ${{ (matrix.arch.host-os == 'ubuntu-latest') && 14 || 13 }}
        RTLD_NAME: ${{ matrix.arch.rtld }}
        ARCH: ${{ matrix.arch.system-processor }}
        TRIPLE: ${{ matrix.arch.triple}}
      run: >
        cmake
        -B ${{github.workspace}}/build
        -DCMAKE_BUILD_TYPE=${{matrix.build-type}}
        -G Ninja
        -DSNMALLOC_CI_BUILD=ON
        -DSNMALLOC_QEMU_WORKAROUND=ON
        -DSNMALLOC_STATIC_LIBRARY=OFF
        -DCMAKE_TOOLCHAIN_FILE=ci/Toolchain.cmake
        -DSNMALLOC_LINKER=${{matrix.arch.ld}}
        -DSNMALLOC_LINKER_FLAVOUR=${{matrix.arch.ld-flavour}}
    - name: Build
      working-directory: ${{github.workspace}}/build
      run: NINJA_STATUS="%p [%f:%s/%t] %o/s, %es" ninja
    # For debugging: verify that we've actually cross-compiled.
    - name: Run `file` for inspection
      working-directory: ${{github.workspace}}/build
      run: file func*
    # Run the tests, skipping the -malloc and perf- tests (perf doesn't make
    # sense in an emulator and the pass-through malloc is slightly flaky in
    # QEMU)
    - name: Test
      working-directory: ${{github.workspace}}/build
      run: ctest -j 2 --output-on-failure -E '(perf-.*)|(.*-malloc$)' --timeout 400
      timeout-minutes: 30

  windows:
    strategy:
      matrix:
        # Build each combination of OS and release/debug variants
        os: [ windows-2019 ]
        build-type: [ Release, Debug ]
        arch: [ Win32, x64 ]
        toolchain: [ "", "-T ClangCL" ]
        extra-cmake-flags: [ "" ]
        # Add an extra check for the Windows 8 compatible PAL
        include:
          - os: windows-2019
            build-type: Release
            arch: x64
            toolchain: ""
            extra-cmake-flags: -DWIN8COMPAT=TRUE
            variant: Windows 8 compatible
          - os: windows-2022
            build-type: Release
            arch: Win32
            toolchain: ""
          - os: windows-2022
            build-type: Debug
            arch: Win32
            toolchain: ""
          - os: windows-2022
            build-type: Release
            arch: x64
            toolchain: ""
          - os: windows-2022
            build-type: Debug
            arch: x64
            toolchain: ""
        
      # Don't abort runners if a single one fails
      fail-fast: false
    runs-on: ${{ matrix.os }}
    name: ${{ matrix.os }} ${{ matrix.arch }} ${{ matrix.build-type }} ${{ matrix.toolchain }} ${{ matrix.variant }}
    steps:
    - uses: actions/checkout@v3
    - name: Configure CMake
      run: |
        cmake -B ${{github.workspace}}/build -A ${{ matrix.arch }} ${{ matrix.toolchain }} ${{ matrix.extra-cmake-flags }} -DSNMALLOC_CI_BUILD=On -DSNMALLOC_RUST_SUPPORT=On
      # Build with whatever version of msbuild was configured, for a single build configuration.
    - name: Build
      run: cmake --build ${{github.workspace}}/build -- /m /p:Configuration=${{ matrix.build-type }}
      # Run the tests.
    - name: Test
      working-directory: ${{ github.workspace }}/build
      run: ctest -j 2 --interactive-debug-mode 0 --output-on-failure -C ${{ matrix.build-type }} --timeout 400
      timeout-minutes: 20


  # Job to run clang-format and report errors
  format:
    runs-on: ubuntu-18.04
    # We don't need to do the build for this job, but we need to configure it to get the clang-format target
    steps:
    - uses: actions/checkout@v3
    - name: Configure CMake
      run: cmake -B ${{github.workspace}}/build -DSNMALLOC_USE_CXX17=ON
    - name: Install clang-tidy
      run: sudo apt install clang-tidy-9
    # Run the clang-format check and error if it generates a diff
    - name: Run clang-format
      working-directory: ${{github.workspace}}/build
      run: |
        set -eo pipefail
        make clangformat
        git diff --exit-code
    - name: Run clang-tidy
      run: |
        clang-tidy-9  src/snmalloc/override/malloc.cc  -header-filter="`pwd`/*" -warnings-as-errors='*' -export-fixes=tidy.fail -- -std=c++17 -mcx16 -DSNMALLOC_PLATFORM_HAS_GETENTROPY=0
        if [ -f tidy.fail ] ; then
          cat tidy.fail
          exit 1
        fi

  all-checks:
    needs: [linux, freebsd, qemu-crossbuild, windows, format, sanitizer]
    runs-on: ubuntu-latest
    steps:
    - name: Dummy step
      run: true