Skip to content

Commit 7cd3541

Browse files
authored
Merge pull request #41656 from MillerTechnologyPeru/feature/ppc32
[stdlib] Added PowerPC 32-bit support
2 parents 7d9d798 + 0ab3eec commit 7cd3541

File tree

18 files changed

+50
-15
lines changed

18 files changed

+50
-15
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,8 @@ else()
737737
endif()
738738
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64")
739739
set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64")
740+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc")
741+
set(SWIFT_HOST_VARIANT_ARCH_default "powerpc")
740742
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64le")
741743
set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64le")
742744
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "s390x")

cmake/modules/SwiftConfigureSDK.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ macro(configure_sdk_unix name architectures)
327327
set(SWIFT_SDK_LINUX_ARCH_${arch}_TRIPLE "${arch}-unknown-linux-gnueabi")
328328
elseif(arch MATCHES "(armv6|armv7)")
329329
set(SWIFT_SDK_LINUX_ARCH_${arch}_TRIPLE "${arch}-unknown-linux-gnueabihf")
330-
elseif(arch MATCHES "(aarch64|i686|powerpc64|powerpc64le|s390x|x86_64)")
330+
elseif(arch MATCHES "(aarch64|i686|powerpc|powerpc64|powerpc64le|s390x|x86_64)")
331331
set(SWIFT_SDK_LINUX_ARCH_${arch}_TRIPLE "${arch}-unknown-linux-gnu")
332332
else()
333333
message(FATAL_ERROR "unknown arch for ${prefix}: ${arch}")

cmake/modules/SwiftSetIfArchBitness.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ function(set_if_arch_bitness var_name)
1515
"${SIA_ARCH}" STREQUAL "armv7k" OR
1616
"${SIA_ARCH}" STREQUAL "arm64_32" OR
1717
"${SIA_ARCH}" STREQUAL "armv7s" OR
18-
"${SIA_ARCH}" STREQUAL "wasm32")
18+
"${SIA_ARCH}" STREQUAL "wasm32" OR
19+
"${SIA_ARCH}" STREQUAL "powerpc")
1920
set("${var_name}" "${SIA_CASE_32_BIT}" PARENT_SCOPE)
2021
elseif("${SIA_ARCH}" STREQUAL "x86_64" OR
2122
"${SIA_ARCH}" STREQUAL "amd64" OR

lib/Basic/LangOptions.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ static const SupportedConditionalValue SupportedConditionalCompilationArches[] =
6262
"arm64_32",
6363
"i386",
6464
"x86_64",
65+
"powerpc",
6566
"powerpc64",
6667
"powerpc64le",
6768
"s390x",
@@ -312,6 +313,9 @@ std::pair<bool, bool> LangOptions::setTarget(llvm::Triple triple) {
312313
addPlatformConditionValue(PlatformConditionKind::Arch, "arm64");
313314
}
314315
break;
316+
case llvm::Triple::ArchType::ppc:
317+
addPlatformConditionValue(PlatformConditionKind::Arch, "powerpc");
318+
break;
315319
case llvm::Triple::ArchType::ppc64:
316320
addPlatformConditionValue(PlatformConditionKind::Arch, "powerpc64");
317321
break;

lib/IRGen/SwiftTargetInfo.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,13 @@ static void configureARM(IRGenModule &IGM, const llvm::Triple &triple,
144144
setToMask(target.IsObjCPointerBit, 32, SWIFT_ABI_ARM_IS_OBJC_BIT);
145145
}
146146

147+
/// Configures target-specific information for powerpc platforms.
148+
static void configurePowerPC(IRGenModule &IGM, const llvm::Triple &triple,
149+
SwiftTargetInfo &target) {
150+
setToMask(target.PointerSpareBits, 32,
151+
SWIFT_ABI_POWERPC_SWIFT_SPARE_BITS_MASK);
152+
}
153+
147154
/// Configures target-specific information for powerpc64 platforms.
148155
static void configurePowerPC64(IRGenModule &IGM, const llvm::Triple &triple,
149156
SwiftTargetInfo &target) {
@@ -220,6 +227,10 @@ SwiftTargetInfo SwiftTargetInfo::get(IRGenModule &IGM) {
220227
else
221228
configureARM64(IGM, triple, target);
222229
break;
230+
231+
case llvm::Triple::ppc:
232+
configurePowerPC(IGM, triple, target);
233+
break;
223234

224235
case llvm::Triple::ppc64:
225236
case llvm::Triple::ppc64le:

stdlib/public/SwiftShims/HeapObject.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,9 @@ static_assert(alignof(HeapObject) == alignof(void*),
202202
(defined(__arm64__) && (__POINTER_WIDTH__ == 32))
203203
#define _swift_abi_SwiftSpareBitsMask \
204204
(__swift_uintptr_t) SWIFT_ABI_ARM_SWIFT_SPARE_BITS_MASK
205+
#elif defined(__ppc__)
206+
#define _swift_abi_SwiftSpareBitsMask \
207+
(__swift_uintptr_t) SWIFT_ABI_POWERPC_SWIFT_SPARE_BITS_MASK
205208
#else
206209
#define _swift_abi_SwiftSpareBitsMask \
207210
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_SWIFT_SPARE_BITS_MASK

stdlib/public/SwiftShims/RefCount.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1319,7 +1319,12 @@ class HeapObjectSideTableEntry {
13191319

13201320
public:
13211321
HeapObjectSideTableEntry(HeapObject *newObject)
1322-
: object(newObject), refCounts()
1322+
: object(newObject),
1323+
#if __arm__ || __powerpc__ // https://bugs.swift.org/browse/SR-5846
1324+
refCounts(SideTableRefCounts::Initialized)
1325+
#else
1326+
refCounts()
1327+
#endif
13231328
{ }
13241329

13251330
#pragma clang diagnostic push

stdlib/public/SwiftShims/System.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@
173173
#define SWIFT_ABI_ARM64_OBJC_WEAK_REFERENCE_MARKER_VALUE \
174174
(1<<SWIFT_ABI_ARM64_OBJC_NUM_RESERVED_LOW_BITS)
175175

176+
/*********************************** powerpc ********************************/
177+
178+
// Heap objects are pointer-aligned, so the low two bits are unused.
179+
#define SWIFT_ABI_POWERPC_SWIFT_SPARE_BITS_MASK 0x00000003U
180+
176181
/*********************************** powerpc64 ********************************/
177182

178183
// Heap objects are pointer-aligned, so the low three bits are unused.

stdlib/public/core/AtomicInt.swift.gyb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ internal func _swift_stdlib_atomicCompareExchangeStrongInt(
6565
object target: UnsafeMutablePointer<Int>,
6666
expected: UnsafeMutablePointer<Int>,
6767
desired: Int) -> Bool {
68-
#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
68+
#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32) || arch(powerpc)
6969
let (oldValue, won) = Builtin.cmpxchg_seqcst_seqcst_Int32(
7070
target._rawValue, expected.pointee._value, desired._value)
7171
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
@@ -82,7 +82,7 @@ internal func _swift_stdlib_atomicCompareExchangeStrongInt(
8282
public // Existing uses outside stdlib
8383
func _swift_stdlib_atomicLoadInt(
8484
object target: UnsafeMutablePointer<Int>) -> Int {
85-
#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
85+
#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32) || arch(powerpc)
8686
let value = Builtin.atomicload_seqcst_Int32(target._rawValue)
8787
return Int(value)
8888
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
@@ -95,7 +95,7 @@ func _swift_stdlib_atomicLoadInt(
9595
internal func _swift_stdlib_atomicStoreInt(
9696
object target: UnsafeMutablePointer<Int>,
9797
desired: Int) {
98-
#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
98+
#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32) || arch(powerpc)
9999
Builtin.atomicstore_seqcst_Int32(target._rawValue, desired._value)
100100
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
101101
Builtin.atomicstore_seqcst_Int64(target._rawValue, desired._value)
@@ -111,7 +111,7 @@ func _swift_stdlib_atomicFetch${operation}Int(
111111
object target: UnsafeMutablePointer<Int>,
112112
operand: Int) -> Int {
113113
let rawTarget = UnsafeMutableRawPointer(target)
114-
#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
114+
#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32) || arch(powerpc)
115115
let value = _swift_stdlib_atomicFetch${operation}Int32(
116116
object: rawTarget.assumingMemoryBound(to: Int32.self),
117117
operand: Int32(operand))

stdlib/public/core/Builtin.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ internal var _objectPointerLowSpareBitShift: UInt {
394394
}
395395
}
396396

397-
#if arch(i386) || arch(arm) || arch(wasm32) || arch(powerpc64) || arch(
397+
#if arch(i386) || arch(arm) || arch(wasm32) || arch(powerpc) || arch(powerpc64) || arch(
398398
powerpc64le) || arch(s390x) || arch(arm64_32)
399399
@inlinable
400400
internal var _objectPointerIsObjCBit: UInt {

0 commit comments

Comments
 (0)