Skip to content

Commit a6d0cca

Browse files
[IRGen] Add hack to handle _Atomic(_Bool) correctly.
1 parent 56f9c89 commit a6d0cca

File tree

2 files changed

+13
-5
lines changed

2 files changed

+13
-5
lines changed

lib/IRGen/GenCall.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4158,7 +4158,10 @@ Explosion NativeConventionSchema::mapFromNative(IRGenModule &IGM,
41584158
if (explosionTy != elt->getType()) {
41594159
if (isa<llvm::IntegerType>(explosionTy) &&
41604160
isa<llvm::IntegerType>(elt->getType())) {
4161-
elt = IGF.Builder.CreateTrunc(elt, explosionTy);
4161+
// [HACK: Atomic-Bool-IRGen] In the case of _Atomic(_Bool), Clang
4162+
// treats it as i8 whereas Swift works with i1, so we need to zext
4163+
// in that case.
4164+
elt = IGF.Builder.CreateZExtOrTrunc(elt, explosionTy);
41624165
} else {
41634166
elt = IGF.coerceValue(elt, explosionTy, DataLayout);
41644167
}
@@ -4290,10 +4293,14 @@ Explosion NativeConventionSchema::mapIntoNative(IRGenModule &IGM,
42904293
auto *elt = fromNonNative.claimNext();
42914294
if (nativeTy != elt->getType()) {
42924295
if (isa<llvm::IntegerType>(nativeTy) &&
4293-
isa<llvm::IntegerType>(elt->getType()))
4294-
elt = IGF.Builder.CreateZExt(elt, nativeTy);
4295-
else
4296+
isa<llvm::IntegerType>(elt->getType())) {
4297+
// [HACK: Atomic-Bool-IRGen] In the case of _Atomic(_Bool), Clang
4298+
// treats it as i8 whereas Swift works with i1, so we need to trunc
4299+
// in that case.
4300+
elt = IGF.Builder.CreateZExtOrTrunc(elt, nativeTy);
4301+
} else {
42964302
elt = IGF.coerceValue(elt, nativeTy, DataLayout);
4303+
}
42974304
}
42984305
nativeExplosion.add(elt);
42994306
return nativeExplosion;

test/IRGen/atomic_bool.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
// RUN: not --crash %target-swift-emit-ir %s -I %S/Inputs
1+
// Check that IRGen doesn't crash. rdar://72999296
2+
// RUN: %target-swift-emit-ir %s -I %S/Inputs
23

34
import AtomicBoolModule
45

0 commit comments

Comments
 (0)