Skip to content

Commit 7ad5a06

Browse files
authored
Backports for 1.12.0-rc3 (or 1.12.0) (#59556)
2 parents 72cbf01 + 0c76f54 commit 7ad5a06

File tree

18 files changed

+207
-92
lines changed

18 files changed

+207
-92
lines changed

base/c.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,6 @@ macro ccall(exprs...)
451451
return ccall_macro_lower((:ccall), ccall_macro_parse(exprs)...)
452452
end
453453

454-
macro ccall_effects(effects::UInt16, expr)
455-
return ccall_macro_lower((:ccall, effects), ccall_macro_parse(expr)...)
454+
macro ccall_effects(effects::UInt16, exprs...)
455+
return ccall_macro_lower((:ccall, effects), ccall_macro_parse(exprs)...)
456456
end

deps/checksums/Pkg-474c628764d6562453709bff686f7fc65dd23535.tar.gz/md5

Lines changed: 0 additions & 1 deletion
This file was deleted.

deps/checksums/Pkg-474c628764d6562453709bff686f7fc65dd23535.tar.gz/sha512

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
6e3a44c3870f135953b325a155fecd65
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
565bdb1a4e8bda374d08a49b2ba70130762ca06004cc50d07ca58ca9a3741195977f563bc990bd627735b6464162a15a7bfb08570e812abf2f22151713de2210

src/codegen.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2838,10 +2838,9 @@ static void visitLine(jl_codectx_t &ctx, uint64_t *ptr, Value *addend, const cha
28382838
Value *pv = ConstantExpr::getIntToPtr(
28392839
ConstantInt::get(ctx.types().T_size, (uintptr_t)ptr),
28402840
getPointerTy(ctx.builder.getContext()));
2841-
Value *v = ctx.builder.CreateLoad(getInt64Ty(ctx.builder.getContext()), pv, true, name);
2842-
v = ctx.builder.CreateAdd(v, addend);
2843-
ctx.builder.CreateStore(v, pv, true); // volatile, not atomic, so this might be an underestimate,
2844-
// but it's faster this way
2841+
ctx.builder.CreateAtomicRMW(AtomicRMWInst::Add, pv,
2842+
addend, MaybeAlign(),
2843+
AtomicOrdering::Monotonic);
28452844
}
28462845

28472846
// Code coverage

src/coverage.cpp

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// This file is a part of Julia. License is MIT: https://julialang.org/license
22

3+
#include <cstdint>
4+
#include <pthread.h>
35
#include <string>
46
#include <fstream>
57
#include <map>
@@ -15,7 +17,7 @@
1517

1618
using namespace llvm;
1719

18-
static int codegen_imaging_mode(void)
20+
static int codegen_imaging_mode(void) JL_NOTSAFEPOINT
1921
{
2022
return jl_options.image_codegen || (jl_generating_output() && jl_options.use_pkgimages);
2123
}
@@ -26,7 +28,9 @@ const int logdata_blocksize = 32; // target getting nearby lines in the same gen
2628
typedef uint64_t logdata_block[logdata_blocksize];
2729
typedef StringMap< SmallVector<logdata_block*, 0> > logdata_t;
2830

29-
static uint64_t *allocLine(SmallVector<logdata_block*, 0> &vec, int line)
31+
pthread_mutex_t coverage_lock = PTHREAD_MUTEX_INITIALIZER;
32+
33+
static uint64_t *allocLine(SmallVector<logdata_block*, 0> &vec, int line) JL_NOTSAFEPOINT
3034
{
3135
unsigned block = line / logdata_blocksize;
3236
line = line % logdata_blocksize;
@@ -45,39 +49,49 @@ static uint64_t *allocLine(SmallVector<logdata_block*, 0> &vec, int line)
4549

4650
static logdata_t coverageData;
4751

48-
JL_DLLEXPORT void jl_coverage_alloc_line(StringRef filename, int line)
52+
JL_DLLEXPORT void jl_coverage_alloc_line(StringRef filename, int line) JL_NOTSAFEPOINT
4953
{
5054
assert(!codegen_imaging_mode());
5155
if (filename == "" || filename == "none" || filename == "no file" || filename == "<missing>" || line < 0)
5256
return;
57+
pthread_mutex_lock(&coverage_lock);
5358
allocLine(coverageData[filename], line);
59+
pthread_mutex_unlock(&coverage_lock);
5460
}
5561

56-
JL_DLLEXPORT uint64_t *jl_coverage_data_pointer(StringRef filename, int line)
62+
JL_DLLEXPORT uint64_t *jl_coverage_data_pointer(StringRef filename, int line) JL_NOTSAFEPOINT
5763
{
58-
return allocLine(coverageData[filename], line);
64+
pthread_mutex_lock(&coverage_lock);
65+
uint64_t* ret = allocLine(coverageData[filename], line);
66+
pthread_mutex_unlock(&coverage_lock);
67+
return ret;
5968
}
6069

61-
extern "C" JL_DLLEXPORT void jl_coverage_visit_line(const char *filename_, size_t len_filename, int line)
70+
extern "C" JL_DLLEXPORT void jl_coverage_visit_line(const char *filename_, size_t len_filename, int line) JL_NOTSAFEPOINT
6271
{
6372
StringRef filename = StringRef(filename_, len_filename);
6473
if (codegen_imaging_mode() || filename == "" || filename == "none" || filename == "no file" || filename == "<missing>" || line < 0)
6574
return;
75+
pthread_mutex_lock(&coverage_lock);
6676
SmallVector<logdata_block*, 0> &vec = coverageData[filename];
6777
uint64_t *ptr = allocLine(vec, line);
6878
(*ptr)++;
79+
pthread_mutex_unlock(&coverage_lock);
6980
}
7081

7182
// Memory allocation log (malloc_log)
7283

7384
static logdata_t mallocData;
7485

75-
JL_DLLEXPORT uint64_t *jl_malloc_data_pointer(StringRef filename, int line)
86+
JL_DLLEXPORT uint64_t *jl_malloc_data_pointer(StringRef filename, int line) JL_NOTSAFEPOINT
7687
{
77-
return allocLine(mallocData[filename], line);
88+
pthread_mutex_lock(&coverage_lock);
89+
uint64_t* ret = allocLine(mallocData[filename], line);
90+
pthread_mutex_unlock(&coverage_lock);
91+
return ret;
7892
}
7993

80-
static void clear_log_data(logdata_t &logData, int resetValue)
94+
static void clear_log_data(logdata_t &logData, int resetValue) JL_NOTSAFEPOINT
8195
{
8296
logdata_t::iterator it = logData.begin();
8397
for (; it != logData.end(); it++) {
@@ -97,18 +111,22 @@ static void clear_log_data(logdata_t &logData, int resetValue)
97111
}
98112

99113
// Resets the malloc counts.
100-
extern "C" JL_DLLEXPORT void jl_clear_malloc_data(void)
114+
extern "C" JL_DLLEXPORT void jl_clear_malloc_data(void) JL_NOTSAFEPOINT
101115
{
116+
pthread_mutex_lock(&coverage_lock);
102117
clear_log_data(mallocData, 1);
118+
pthread_mutex_unlock(&coverage_lock);
103119
}
104120

105121
// Resets the code coverage
106-
extern "C" JL_DLLEXPORT void jl_clear_coverage_data(void)
122+
extern "C" JL_DLLEXPORT void jl_clear_coverage_data(void) JL_NOTSAFEPOINT
107123
{
124+
pthread_mutex_lock(&coverage_lock);
108125
clear_log_data(coverageData, 0);
126+
pthread_mutex_unlock(&coverage_lock);
109127
}
110128

111-
static void write_log_data(logdata_t &logData, const char *extension)
129+
static void write_log_data(logdata_t &logData, const char *extension) JL_NOTSAFEPOINT
112130
{
113131
std::string base = std::string(jl_options.julia_bindir);
114132
base = base + "/../share/julia/base/";
@@ -163,7 +181,7 @@ static void write_log_data(logdata_t &logData, const char *extension)
163181
}
164182
}
165183

166-
static void write_lcov_data(logdata_t &logData, const std::string &outfile)
184+
static void write_lcov_data(logdata_t &logData, const std::string &outfile) JL_NOTSAFEPOINT
167185
{
168186
std::ofstream outf(outfile.c_str(), std::ofstream::ate | std::ofstream::out | std::ofstream::binary);
169187
//std::string base = std::string(jl_options.julia_bindir);
@@ -203,8 +221,9 @@ static void write_lcov_data(logdata_t &logData, const std::string &outfile)
203221
outf.close();
204222
}
205223

206-
extern "C" JL_DLLEXPORT void jl_write_coverage_data(const char *output)
224+
extern "C" JL_DLLEXPORT void jl_write_coverage_data(const char *output) JL_NOTSAFEPOINT
207225
{
226+
pthread_mutex_lock(&coverage_lock);
208227
if (output) {
209228
StringRef output_pattern(output);
210229
if (output_pattern.ends_with(".info"))
@@ -215,11 +234,14 @@ extern "C" JL_DLLEXPORT void jl_write_coverage_data(const char *output)
215234
raw_string_ostream(stm) << "." << uv_os_getpid() << ".cov";
216235
write_log_data(coverageData, stm.c_str());
217236
}
237+
pthread_mutex_unlock(&coverage_lock);
218238
}
219239

220-
extern "C" void jl_write_malloc_log(void)
240+
extern "C" void jl_write_malloc_log(void) JL_NOTSAFEPOINT
221241
{
242+
pthread_mutex_lock(&coverage_lock);
222243
std::string stm;
223244
raw_string_ostream(stm) << "." << uv_os_getpid() << ".mem";
224245
write_log_data(mallocData, stm.c_str());
246+
pthread_mutex_unlock(&coverage_lock);
225247
}

src/gf.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ static int8_t jl_cachearg_offset(void)
124124
/// ----- Insertion logic for special entries ----- ///
125125

126126

127-
static uint_t speccache_hash(size_t idx, jl_value_t *data)
127+
uint_t speccache_hash(size_t idx, jl_value_t *data)
128128
{
129129
jl_method_instance_t *ml = (jl_method_instance_t*)jl_svecref(data, idx); // This must always happen inside the lock
130130
jl_value_t *sig = ml->specTypes;
@@ -150,7 +150,7 @@ static int speccache_eq(size_t idx, const void *ty, jl_value_t *data, uint_t hv)
150150
// get or create the MethodInstance for a specialization
151151
static jl_method_instance_t *jl_specializations_get_linfo_(jl_method_t *m JL_PROPAGATES_ROOT, jl_value_t *type, jl_svec_t *sparams, jl_method_instance_t *mi_insert)
152152
{
153-
if (m->sig == (jl_value_t*)jl_anytuple_type && jl_atomic_load_relaxed(&m->unspecialized) != NULL && m != jl_opaque_closure_method && !m->is_for_opaque_closure)
153+
if (m->source == NULL && m->generator == NULL && jl_atomic_load_relaxed(&m->unspecialized) != NULL && m != jl_opaque_closure_method && !m->is_for_opaque_closure)
154154
return jl_atomic_load_relaxed(&m->unspecialized); // handle builtin methods
155155
jl_value_t *ut = jl_is_unionall(type) ? jl_unwrap_unionall(type) : type;
156156
JL_TYPECHK(specializations, datatype, ut);
@@ -3980,7 +3980,8 @@ STATIC_INLINE jl_value_t *_jl_invoke(jl_value_t *F, jl_value_t **args, uint32_t
39803980
// manually inlined copy of jl_method_compiled
39813981
jl_code_instance_t *codeinst = jl_atomic_load_relaxed(&mfunc->cache);
39823982
while (codeinst) {
3983-
if (jl_atomic_load_relaxed(&codeinst->min_world) <= world && world <= jl_atomic_load_relaxed(&codeinst->max_world)) {
3983+
if (jl_atomic_load_relaxed(&codeinst->min_world) <= world && world <= jl_atomic_load_relaxed(&codeinst->max_world)
3984+
&& codeinst->owner == jl_nothing) {
39843985
jl_callptr_t invoke = jl_atomic_load_acquire(&codeinst->invoke);
39853986
if (invoke != NULL) {
39863987
jl_value_t *res = invoke(F, args, nargs, codeinst);

src/julia.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2620,7 +2620,7 @@ JL_DLLEXPORT ssize_t jl_sizeof_jl_options(void);
26202620
// Parse an argc/argv pair to extract general julia options, passing back out
26212621
// any arguments that should be passed on to the script.
26222622
JL_DLLEXPORT void jl_parse_opts(int *argcp, char ***argvp);
2623-
JL_DLLEXPORT char *jl_format_filename(const char *output_pattern);
2623+
JL_DLLEXPORT char *jl_format_filename(const char *output_pattern) JL_NOTSAFEPOINT;
26242624

26252625
uint64_t parse_heap_size_hint(const char *optarg, const char *option_name);
26262626

src/runtime_ccall.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ jl_value_t *jl_get_JIT(void)
106106
// %L The local hostname.
107107
// %l The local hostname, including the domain name.
108108
// %u The local username.
109-
std::string jl_format_filename(StringRef output_pattern)
109+
std::string jl_format_filename(StringRef output_pattern) JL_NOTSAFEPOINT
110110
{
111111
std::string buf;
112112
raw_string_ostream outfile(buf);
@@ -168,7 +168,7 @@ std::string jl_format_filename(StringRef output_pattern)
168168
return outfile.str();
169169
}
170170

171-
extern "C" JL_DLLEXPORT char *jl_format_filename(const char *output_pattern)
171+
extern "C" JL_DLLEXPORT char *jl_format_filename(const char *output_pattern) JL_NOTSAFEPOINT
172172
{
173173
return strdup(jl_format_filename(StringRef(output_pattern)).c_str());
174174
}

0 commit comments

Comments
 (0)