mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
cgen: parallelize (#10844)
This commit is contained in:
100
thirdparty/stdatomic/nix/atomic.h
vendored
100
thirdparty/stdatomic/nix/atomic.h
vendored
@@ -275,160 +275,160 @@ static inline unsigned char atomic_fetch_xor_byte(unsigned char* x, unsigned cha
|
||||
// Since V might be confused with "generic" C functions either we provide special versions
|
||||
// for gcc/clang, too
|
||||
static inline unsigned long long atomic_load_u64(unsigned long long* x) {
|
||||
return atomic_load_explicit((_Atomic unsigned long long*)x, memory_order_seq_cst);
|
||||
return atomic_load_explicit((_Atomic (unsigned long long)*)x, memory_order_seq_cst);
|
||||
}
|
||||
static inline void atomic_store_u64(unsigned long long* x, unsigned long long y) {
|
||||
atomic_store_explicit((_Atomic unsigned long long*)x, y, memory_order_seq_cst);
|
||||
atomic_store_explicit((_Atomic(unsigned long long)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline int atomic_compare_exchange_weak_u64(unsigned long long* x, unsigned long long* expected, unsigned long long y) {
|
||||
return (int)atomic_compare_exchange_weak_explicit((_Atomic unsigned long long*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
return (int)atomic_compare_exchange_weak_explicit((_Atomic(unsigned long long)*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
}
|
||||
static inline int atomic_compare_exchange_strong_u64(unsigned long long* x, unsigned long long* expected, unsigned long long y) {
|
||||
return (int)atomic_compare_exchange_strong_explicit((_Atomic unsigned long long*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
return (int)atomic_compare_exchange_strong_explicit((_Atomic(unsigned long long)*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned long long atomic_exchange_u64(unsigned long long* x, unsigned long long y) {
|
||||
return atomic_exchange_explicit((_Atomic unsigned long long*)x, y, memory_order_seq_cst);
|
||||
return atomic_exchange_explicit((_Atomic(unsigned long long)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned long long atomic_fetch_add_u64(unsigned long long* x, unsigned long long y) {
|
||||
return atomic_fetch_add_explicit((_Atomic unsigned long long*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_add_explicit((_Atomic(unsigned long long)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned long long atomic_fetch_sub_u64(unsigned long long* x, unsigned long long y) {
|
||||
return atomic_fetch_sub_explicit((_Atomic unsigned long long*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_sub_explicit((_Atomic(unsigned long long)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned long long atomic_fetch_and_u64(unsigned long long* x, unsigned long long y) {
|
||||
return atomic_fetch_and_explicit((_Atomic unsigned long long*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_and_explicit((_Atomic(unsigned long long)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned long long atomic_fetch_or_u64(unsigned long long* x, unsigned long long y) {
|
||||
return atomic_fetch_or_explicit((_Atomic unsigned long long*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_or_explicit((_Atomic(unsigned long long)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned long long atomic_fetch_xor_u64(unsigned long long* x, unsigned long long y) {
|
||||
return atomic_fetch_xor_explicit((_Atomic unsigned long long*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_xor_explicit((_Atomic(unsigned long long)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
|
||||
|
||||
static inline void* atomic_load_ptr(void** x) {
|
||||
return (void*)atomic_load_explicit((_Atomic uintptr_t*)x, memory_order_seq_cst);
|
||||
return (void*)atomic_load_explicit((_Atomic(uintptr_t)*)x, memory_order_seq_cst);
|
||||
}
|
||||
static inline void atomic_store_ptr(void** x, void* y) {
|
||||
atomic_store_explicit((_Atomic uintptr_t*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
atomic_store_explicit((_Atomic(uintptr_t)*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
}
|
||||
static inline int atomic_compare_exchange_weak_ptr(void** x, void** expected, void* y) {
|
||||
return (int)atomic_compare_exchange_weak_explicit((_Atomic uintptr_t*)x, (unsigned long *)expected, (uintptr_t)y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
return (int)atomic_compare_exchange_weak_explicit((_Atomic(uintptr_t)*)x, (unsigned long *)expected, (uintptr_t)y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
}
|
||||
static inline int atomic_compare_exchange_strong_ptr(void** x, void** expected, void* y) {
|
||||
return (int)atomic_compare_exchange_strong_explicit((_Atomic uintptr_t*)x, (unsigned long *)expected, (uintptr_t)y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
return (int)atomic_compare_exchange_strong_explicit((_Atomic(uintptr_t)*)x, (unsigned long *)expected, (uintptr_t)y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
}
|
||||
static inline void* atomic_exchange_ptr(void** x, void* y) {
|
||||
return (void*)atomic_exchange_explicit((_Atomic uintptr_t*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
return (void*)atomic_exchange_explicit((_Atomic(uintptr_t)*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
}
|
||||
static inline void* atomic_fetch_add_ptr(void** x, void* y) {
|
||||
return (void*)atomic_fetch_add_explicit((_Atomic uintptr_t*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
return (void*)atomic_fetch_add_explicit((_Atomic(uintptr_t)*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
}
|
||||
static inline void* atomic_fetch_sub_ptr(void** x, void* y) {
|
||||
return (void*)atomic_fetch_sub_explicit((_Atomic uintptr_t*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
return (void*)atomic_fetch_sub_explicit((_Atomic(uintptr_t)*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
}
|
||||
static inline void* atomic_fetch_and_ptr(void** x, void* y) {
|
||||
return (void*)atomic_fetch_and_explicit((_Atomic uintptr_t*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
return (void*)atomic_fetch_and_explicit((_Atomic(uintptr_t)*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
}
|
||||
static inline void* atomic_fetch_or_ptr(void** x, void* y) {
|
||||
return (void*)atomic_fetch_or_explicit((_Atomic uintptr_t*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
return (void*)atomic_fetch_or_explicit((_Atomic(uintptr_t)*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
}
|
||||
static inline void* atomic_fetch_xor_ptr(void** x, void* y) {
|
||||
return (void*)atomic_fetch_xor_explicit((_Atomic uintptr_t*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
return (void*)atomic_fetch_xor_explicit((_Atomic(uintptr_t)*)x, (uintptr_t)y, memory_order_seq_cst);
|
||||
}
|
||||
|
||||
|
||||
static inline unsigned atomic_load_u32(unsigned* x) {
|
||||
return atomic_load_explicit((_Atomic unsigned*)x, memory_order_seq_cst);
|
||||
return atomic_load_explicit((_Atomic(unsigned)*)x, memory_order_seq_cst);
|
||||
}
|
||||
static inline void atomic_store_u32(unsigned* x, unsigned y) {
|
||||
atomic_store_explicit((_Atomic unsigned*)x, y, memory_order_seq_cst);
|
||||
atomic_store_explicit((_Atomic(unsigned)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline int atomic_compare_exchange_weak_u32(unsigned* x, unsigned* expected, unsigned y) {
|
||||
return (int)atomic_compare_exchange_weak_explicit((_Atomic unsigned*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
return (int)atomic_compare_exchange_weak_explicit((_Atomic(unsigned)*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
}
|
||||
static inline int atomic_compare_exchange_strong_u32(unsigned* x, unsigned* expected, unsigned y) {
|
||||
return (int)atomic_compare_exchange_strong_explicit((_Atomic unsigned*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
return (int)atomic_compare_exchange_strong_explicit((_Atomic(unsigned)*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned atomic_exchange_u32(unsigned* x, unsigned y) {
|
||||
return atomic_exchange_explicit((_Atomic unsigned*)x, y, memory_order_seq_cst);
|
||||
return atomic_exchange_explicit((_Atomic(unsigned)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned atomic_fetch_add_u32(unsigned* x, unsigned y) {
|
||||
return atomic_fetch_add_explicit((_Atomic unsigned*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_add_explicit((_Atomic(unsigned)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned atomic_fetch_sub_u32(unsigned* x, unsigned y) {
|
||||
return atomic_fetch_sub_explicit((_Atomic unsigned*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_sub_explicit((_Atomic(unsigned)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned atomic_fetch_and_u32(unsigned* x, unsigned y) {
|
||||
return atomic_fetch_and_explicit((_Atomic unsigned*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_and_explicit((_Atomic(unsigned)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned atomic_fetch_or_u32(unsigned* x, unsigned y) {
|
||||
return atomic_fetch_or_explicit((_Atomic unsigned*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_or_explicit((_Atomic(unsigned)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned atomic_fetch_xor_u32(unsigned* x, unsigned y) {
|
||||
return atomic_fetch_xor_explicit((_Atomic unsigned*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_xor_explicit((_Atomic(unsigned)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
|
||||
static inline unsigned short atomic_load_u16(unsigned short* x) {
|
||||
return atomic_load_explicit((_Atomic unsigned short*)x, memory_order_seq_cst);
|
||||
return atomic_load_explicit((_Atomic(unsigned short)*)x, memory_order_seq_cst);
|
||||
}
|
||||
static inline void atomic_store_u16(void* x, unsigned short y) {
|
||||
atomic_store_explicit((_Atomic unsigned short*)x, y, memory_order_seq_cst);
|
||||
atomic_store_explicit((_Atomic(unsigned short)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline int atomic_compare_exchange_weak_u16(void* x, unsigned short* expected, unsigned short y) {
|
||||
return (int)atomic_compare_exchange_weak_explicit((_Atomic unsigned short*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
return (int)atomic_compare_exchange_weak_explicit((_Atomic(unsigned short)*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
}
|
||||
static inline int atomic_compare_exchange_strong_u16(unsigned short* x, unsigned short* expected, unsigned short y) {
|
||||
return (int)atomic_compare_exchange_strong_explicit((_Atomic unsigned short*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
return (int)atomic_compare_exchange_strong_explicit((_Atomic(unsigned short)*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned short atomic_exchange_u16(unsigned short* x, unsigned short y) {
|
||||
return atomic_exchange_explicit((_Atomic unsigned short*)x, y, memory_order_seq_cst);
|
||||
return atomic_exchange_explicit((_Atomic(unsigned short)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned short atomic_fetch_add_u16(unsigned short* x, unsigned short y) {
|
||||
return atomic_fetch_add_explicit((_Atomic unsigned short*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_add_explicit((_Atomic(unsigned short)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned short atomic_fetch_sub_u16(unsigned short* x, unsigned short y) {
|
||||
return atomic_fetch_sub_explicit((_Atomic unsigned short*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_sub_explicit((_Atomic(unsigned short)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned short atomic_fetch_and_u16(unsigned short* x, unsigned short y) {
|
||||
return atomic_fetch_and_explicit((_Atomic unsigned short*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_and_explicit((_Atomic(unsigned short)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned short atomic_fetch_or_u16(unsigned short* x, unsigned short y) {
|
||||
return atomic_fetch_or_explicit((_Atomic unsigned short*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_or_explicit((_Atomic(unsigned short)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned short atomic_fetch_xor_u16(unsigned short* x, unsigned short y) {
|
||||
return atomic_fetch_xor_explicit((_Atomic unsigned short*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_xor_explicit((_Atomic(unsigned short)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
|
||||
static inline unsigned char atomic_load_byte(unsigned char* x) {
|
||||
return atomic_load_explicit((_Atomic unsigned char*)x, memory_order_seq_cst);
|
||||
return atomic_load_explicit((_Atomic(unsigned char)*)x, memory_order_seq_cst);
|
||||
}
|
||||
static inline void atomic_store_byte(unsigned char* x, unsigned char y) {
|
||||
atomic_store_explicit((_Atomic unsigned char*)x, y, memory_order_seq_cst);
|
||||
atomic_store_explicit((_Atomic(unsigned char)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline int atomic_compare_exchange_weak_byte(unsigned char* x, unsigned char* expected, unsigned char y) {
|
||||
return (int)atomic_compare_exchange_weak_explicit((_Atomic unsigned char*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
return (int)atomic_compare_exchange_weak_explicit((_Atomic(unsigned char)*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
}
|
||||
static inline int atomic_compare_exchange_strong_byte(unsigned char* x, unsigned char* expected, unsigned char y) {
|
||||
return (int)atomic_compare_exchange_strong_explicit((_Atomic unsigned char*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
return (int)atomic_compare_exchange_strong_explicit((_Atomic(unsigned char)*)x, expected, y, memory_order_seq_cst, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned char atomic_exchange_byte(unsigned char* x, unsigned char y) {
|
||||
return atomic_exchange_explicit((_Atomic unsigned char*)x, y, memory_order_seq_cst);
|
||||
return atomic_exchange_explicit((_Atomic(unsigned char)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned char atomic_fetch_add_byte(unsigned char* x, unsigned char y) {
|
||||
return atomic_fetch_add_explicit((_Atomic unsigned char*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_add_explicit((_Atomic(unsigned char)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned char atomic_fetch_sub_byte(unsigned char* x, unsigned char y) {
|
||||
return atomic_fetch_sub_explicit((_Atomic unsigned char*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_sub_explicit((_Atomic(unsigned char)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned char atomic_fetch_and_byte(unsigned char* x, unsigned char y) {
|
||||
return atomic_fetch_and_explicit((_Atomic unsigned char*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_and_explicit((_Atomic(unsigned char)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned char atomic_fetch_or_byte(unsigned char* x, unsigned char y) {
|
||||
return atomic_fetch_or_explicit((_Atomic unsigned char*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_or_explicit((_Atomic(unsigned char)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
static inline unsigned char atomic_fetch_xor_byte(unsigned char* x, unsigned char y) {
|
||||
return atomic_fetch_xor_explicit((_Atomic unsigned char*)x, y, memory_order_seq_cst);
|
||||
return atomic_fetch_xor_explicit((_Atomic(unsigned char)*)x, y, memory_order_seq_cst);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
7
thirdparty/stdatomic/nix/atomic_cpp.h
vendored
7
thirdparty/stdatomic/nix/atomic_cpp.h
vendored
@@ -30,7 +30,7 @@
|
||||
#ifndef _STDATOMIC_H_
|
||||
#define _STDATOMIC_H_
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(__cplusplus) && defined(_USING_LIBCXX)
|
||||
#if defined(__cplusplus)
|
||||
#ifdef __clang__
|
||||
#if __has_feature(cxx_atomic)
|
||||
#define _STDATOMIC_HAVE_ATOMIC
|
||||
@@ -42,8 +42,9 @@
|
||||
#endif
|
||||
#endif
|
||||
#ifdef _STDATOMIC_HAVE_ATOMIC
|
||||
/* We have a usable C++ <atomic>; use it instead. */
|
||||
#include <atomic>
|
||||
|
||||
#include "cpp/atomic.h"
|
||||
|
||||
#undef _Atomic
|
||||
/* Also defined by <atomic> for gcc. But not used in macros. */
|
||||
/* Also a clang intrinsic. */
|
||||
|
||||
99
thirdparty/stdatomic/nix/cpp/gen.v
vendored
Normal file
99
thirdparty/stdatomic/nix/cpp/gen.v
vendored
Normal file
@@ -0,0 +1,99 @@
|
||||
import os
|
||||
|
||||
fn main() {
|
||||
if os.args.len <= 1 {
|
||||
eprintln('please specify a C++ compiler')
|
||||
exit(1)
|
||||
}
|
||||
cc := os.args[1]
|
||||
if os.execute('$cc -v').exit_code != 0 {
|
||||
eprintln('please specify a valid C++ compiler')
|
||||
exit(1)
|
||||
}
|
||||
cc_type, cc_version, cc_os := get_cc_info(cc)
|
||||
triple := '$cc_type-$cc_version-$cc_os'
|
||||
println('compiler: $triple')
|
||||
|
||||
search_paths := get_search_paths(cc)
|
||||
atomic_path := find_file(search_paths, 'atomic') or {
|
||||
eprintln(err)
|
||||
exit(2)
|
||||
}
|
||||
|
||||
bitsatomicbase_path := find_file(search_paths, 'bits/atomic_base.h') or {
|
||||
if cc_os == 'linux' {
|
||||
eprintln(err)
|
||||
exit(2)
|
||||
}
|
||||
'no_file' // bits/atomic_base.h is only used on linux
|
||||
}
|
||||
|
||||
patch_atomic(os.join_path(os.dir(@FILE), 'atomic.h'), atomic_path) or {
|
||||
eprintln(err)
|
||||
exit(2)
|
||||
}
|
||||
|
||||
if bitsatomicbase_path != 'no_file' {
|
||||
patch_bitsatomicbase(os.join_path(os.dir(@FILE), 'bitsatomicbase.h'), bitsatomicbase_path) or {
|
||||
eprintln(err)
|
||||
exit(2)
|
||||
}
|
||||
}
|
||||
|
||||
println('$atomic_path:::$bitsatomicbase_path')
|
||||
}
|
||||
|
||||
fn get_cc_info(cc string) (string, string, string) {
|
||||
cc_type := if cc.contains('clang') {
|
||||
'clang'
|
||||
} else if cc.contains('g') {
|
||||
'gcc'
|
||||
} else {
|
||||
eprintln('only gcc and clang are supported')
|
||||
exit(1)
|
||||
'none'
|
||||
}
|
||||
|
||||
lines := os.execute('$cc -v').output.split('\n')
|
||||
|
||||
// gcc and clang both have the same way way to say what version they have and what the host target triple is
|
||||
cc_version := lines.filter(it.contains('$cc_type version '))[0].all_after('$cc_type version ').all_before('.')
|
||||
|
||||
cc_os := lines.filter(it.starts_with('Target: '))[0].all_after('Target: ').split('-')[2]
|
||||
|
||||
return cc_type, cc_version, if cc_os.contains('darwin') {
|
||||
'darwin' // remove 20.6.0 from darwin20.6.0
|
||||
} else {
|
||||
cc_os
|
||||
}
|
||||
}
|
||||
|
||||
fn get_search_paths(cc string) []string {
|
||||
result := os.execute('$cc -v -x c++ /dev/null').output
|
||||
lines := result.split('\n')
|
||||
search_path := lines[lines.index('#include <...> search starts here:') + 1..lines.index('End of search list.')]
|
||||
return search_path.map(os.real_path(it.all_before('(').trim_space()))
|
||||
}
|
||||
|
||||
fn find_file(search_paths []string, file string) ?string {
|
||||
for search_path in search_paths {
|
||||
if os.exists(os.join_path(search_path, file)) {
|
||||
return os.join_path(search_path, file)
|
||||
}
|
||||
}
|
||||
return error('$file not found')
|
||||
}
|
||||
|
||||
fn patch_atomic(outfile string, infile string) ? {
|
||||
lines := os.read_file(infile) ?.split('\n')
|
||||
outlines := lines.filter(!it.contains('atomic(const atomic&) = delete;'))
|
||||
outtext := outlines.join('\n').replace('#include <bits/atomic_base.h>', '#include "bitsatomicbase.h"')
|
||||
os.write_file(outfile, outtext) ?
|
||||
}
|
||||
|
||||
fn patch_bitsatomicbase(outfile string, infile string) ? {
|
||||
lines := os.read_file(infile) ?.split('\n')
|
||||
outlines := lines.filter(!it.contains('__atomic_base(const __atomic_base&) = delete;'))
|
||||
outtext := outlines.join('\n').replace('#include <bits/atomic_base.h>', '#include "bitsatomicbase.h"')
|
||||
os.write_file(outfile, outtext) ?
|
||||
}
|
||||
Reference in New Issue
Block a user