aboutsummaryrefslogtreecommitdiff
path: root/src/zig_llvm.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-09-14 21:58:22 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-09-14 21:58:22 -0700
commit0395b35cee8d4082cc40b0dcd0298f797f42309d (patch)
treec4592f4e4cdb555836bb422d485b2c134e3f7547 /src/zig_llvm.cpp
parent5d14590ed15ce23e7ef8032f8075dcfe76ba9dd8 (diff)
downloadzig-0395b35cee8d4082cc40b0dcd0298f797f42309d.tar.gz
zig-0395b35cee8d4082cc40b0dcd0298f797f42309d.zip
stage2: implement cmpxchg and improve comptime eval
* Implement Sema for `@cmpxchgWeak` and `@cmpxchgStrong`. Both runtime and comptime codepaths are implement. * Implement Codegen for LLVM backend and C backend. * Add LazySrcLoc.node_offset_builtin_call_argX 3...5 * Sema: rework comptime control flow. - `error.ComptimeReturn` is used to signal that a comptime function call has returned a result (stored in the Inlining struct). `analyzeCall` notices this and handles the result. - The ZIR instructions `break_inline`, `block_inline`, `condbr_inline` are now redundant and can be deleted. `break`, `block`, and `condbr` function equivalently inside a comptime scope. - The ZIR instructions `loop` and `repeat` also are modified to directly perform comptime control flow inside a comptime scope, skipping an unnecessary mechanism for analysis of runtime code. This makes Zig perform closer to an interpreter when evaluating comptime code. * Sema: zirRetErrValue looks at Sema.ret_fn_ty rather than sema.func for adding to the inferred error set. This fixes a bug for inlined/comptime function calls. * Implement ZIR printing for cmpxchg. * stage1: make cmpxchg respect --single-threaded - Our LLVM C++ API wrapper failed to expose this boolean flag before. * Fix AIR printing for struct fields showing incorrect liveness data.
Diffstat (limited to 'src/zig_llvm.cpp')
-rw-r--r--src/zig_llvm.cpp23
1 files changed, 6 insertions, 17 deletions
diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp
index 2089092c7c..e1ab74f423 100644
--- a/src/zig_llvm.cpp
+++ b/src/zig_llvm.cpp
@@ -1087,10 +1087,12 @@ static AtomicOrdering mapFromLLVMOrdering(LLVMAtomicOrdering Ordering) {
LLVMValueRef ZigLLVMBuildCmpXchg(LLVMBuilderRef builder, LLVMValueRef ptr, LLVMValueRef cmp,
LLVMValueRef new_val, LLVMAtomicOrdering success_ordering,
- LLVMAtomicOrdering failure_ordering, bool is_weak)
+ LLVMAtomicOrdering failure_ordering, bool is_weak, bool is_single_threaded)
{
- AtomicCmpXchgInst *inst = unwrap(builder)->CreateAtomicCmpXchg(unwrap(ptr), unwrap(cmp),
- unwrap(new_val), mapFromLLVMOrdering(success_ordering), mapFromLLVMOrdering(failure_ordering));
+ AtomicCmpXchgInst *inst = unwrap(builder)->CreateAtomicCmpXchg(unwrap(ptr),
+ unwrap(cmp), unwrap(new_val),
+ mapFromLLVMOrdering(success_ordering), mapFromLLVMOrdering(failure_ordering),
+ is_single_threaded ? SyncScope::SingleThread : SyncScope::System);
inst->setWeak(is_weak);
return wrap(inst);
}
@@ -1308,19 +1310,6 @@ static AtomicRMWInst::BinOp toLLVMRMWBinOp(enum ZigLLVM_AtomicRMWBinOp BinOp) {
}
}
-static AtomicOrdering toLLVMOrdering(LLVMAtomicOrdering Ordering) {
- switch (Ordering) {
- default:
- case LLVMAtomicOrderingNotAtomic: return AtomicOrdering::NotAtomic;
- case LLVMAtomicOrderingUnordered: return AtomicOrdering::Unordered;
- case LLVMAtomicOrderingMonotonic: return AtomicOrdering::Monotonic;
- case LLVMAtomicOrderingAcquire: return AtomicOrdering::Acquire;
- case LLVMAtomicOrderingRelease: return AtomicOrdering::Release;
- case LLVMAtomicOrderingAcquireRelease: return AtomicOrdering::AcquireRelease;
- case LLVMAtomicOrderingSequentiallyConsistent: return AtomicOrdering::SequentiallyConsistent;
- }
-}
-
inline LLVMAttributeRef wrap(Attribute Attr) {
return reinterpret_cast<LLVMAttributeRef>(Attr.getRawPointer());
}
@@ -1335,7 +1324,7 @@ LLVMValueRef ZigLLVMBuildAtomicRMW(LLVMBuilderRef B, enum ZigLLVM_AtomicRMWBinOp
{
AtomicRMWInst::BinOp intop = toLLVMRMWBinOp(op);
return wrap(unwrap(B)->CreateAtomicRMW(intop, unwrap(PTR),
- unwrap(Val), toLLVMOrdering(ordering),
+ unwrap(Val), mapFromLLVMOrdering(ordering),
singleThread ? SyncScope::SingleThread : SyncScope::System));
}