Skip to content

Commit 8390199

Browse files
committed
Port for PS4
Add support for the PS4 OS. Update the standard library and add a target unit test.
1 parent 9d76ce9 commit 8390199

File tree

25 files changed

+128
-46
lines changed

25 files changed

+128
-46
lines changed

include/swift/Basic/LangOptions.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,7 @@ namespace swift {
184184
Target.getOSVersion(major, minor, revision);
185185
} else if (Target.isOSLinux() || Target.isOSFreeBSD() ||
186186
Target.isAndroid() || Target.isOSWindows() ||
187-
Target.getTriple().empty())
188-
{
187+
Target.isPS4() || Target.getTriple().empty()) {
189188
major = minor = revision = 0;
190189
} else {
191190
llvm_unreachable("Unsupported target OS");

lib/Basic/LangOptions.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ static const StringRef SupportedConditionalCompilationOSs[] = {
3131
"Linux",
3232
"FreeBSD",
3333
"Windows",
34-
"Android"
34+
"Android",
35+
"PS4",
3536
};
3637

3738
static const StringRef SupportedConditionalCompilationArches[] = {
@@ -128,9 +129,10 @@ std::pair<bool, bool> LangOptions::setTarget(llvm::Triple triple) {
128129
addPlatformConditionValue("os", "FreeBSD");
129130
else if (triple.isOSWindows())
130131
addPlatformConditionValue("os", "Windows");
131-
else {
132+
else if (triple.isPS4())
133+
addPlatformConditionValue("os", "PS4");
134+
else
132135
UnsupportedOS = true;
133-
}
134136

135137
bool UnsupportedArch = false;
136138

lib/Basic/Platform.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ StringRef swift::getPlatformNameForTriple(const llvm::Triple &triple) {
105105
case llvm::Triple::CUDA:
106106
case llvm::Triple::NVCL:
107107
case llvm::Triple::AMDHSA:
108-
case llvm::Triple::PS4:
109108
case llvm::Triple::ELFIAMCU:
110109
return "";
111110
case llvm::Triple::Darwin:
@@ -120,6 +119,8 @@ StringRef swift::getPlatformNameForTriple(const llvm::Triple &triple) {
120119
return "freebsd";
121120
case llvm::Triple::Win32:
122121
return "windows";
122+
case llvm::Triple::PS4:
123+
return "ps4";
123124
}
124125
llvm_unreachable("unsupported OS");
125126
}

lib/IRGen/IRGenModule.cpp

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,15 @@ llvm::SmallString<32> getTargetDependentLibraryOption(const llvm::Triple &T,
796796
buffer += ".lib";
797797
if (quote)
798798
buffer += '"';
799+
} else if (T.isPS4()) {
800+
bool quote = library.find(' ') != StringRef::npos;
801+
802+
buffer += "\01";
803+
if (quote)
804+
buffer += '"';
805+
buffer += library;
806+
if (quote)
807+
buffer += '"';
799808
} else {
800809
buffer += "-l";
801810
buffer += library;
@@ -897,11 +906,9 @@ void IRGenModule::emitAutolinkInfo() {
897906
}),
898907
AutolinkEntries.end());
899908

900-
switch (TargetInfo.OutputObjectFormat) {
901-
case llvm::Triple::UnknownObjectFormat:
902-
llvm_unreachable("unknown object format");
903-
case llvm::Triple::COFF:
904-
case llvm::Triple::MachO: {
909+
if (TargetInfo.OutputObjectFormat == llvm::Triple::COFF ||
910+
TargetInfo.OutputObjectFormat == llvm::Triple::MachO ||
911+
Triple.isPS4()) {
905912
llvm::LLVMContext &ctx = Module.getContext();
906913

907914
if (!LinkerOptions) {
@@ -917,9 +924,10 @@ void IRGenModule::emitAutolinkInfo() {
917924
(void)FoundOldEntry;
918925
assert(FoundOldEntry && "Could not replace old linker options entry?");
919926
}
920-
break;
921-
}
922-
case llvm::Triple::ELF: {
927+
} else {
928+
assert(TargetInfo.OutputObjectFormat == llvm::Triple::ELF &&
929+
"expected ELF output format");
930+
923931
// Merge the entries into null-separated string.
924932
llvm::SmallString<64> EntriesString;
925933
for (auto &EntryNode : AutolinkEntries) {
@@ -931,19 +939,16 @@ void IRGenModule::emitAutolinkInfo() {
931939
}
932940
}
933941
auto EntriesConstant = llvm::ConstantDataArray::getString(
934-
LLVMContext, EntriesString, /*AddNull=*/false);
942+
LLVMContext, EntriesString, /*AddNull=*/false);
935943

936-
auto var = new llvm::GlobalVariable(*getModule(),
937-
EntriesConstant->getType(), true,
938-
llvm::GlobalValue::PrivateLinkage,
939-
EntriesConstant,
940-
"_swift1_autolink_entries");
944+
auto var =
945+
new llvm::GlobalVariable(*getModule(), EntriesConstant->getType(), true,
946+
llvm::GlobalValue::PrivateLinkage,
947+
EntriesConstant, "_swift1_autolink_entries");
941948
var->setSection(".swift1_autolink_entries");
942949
var->setAlignment(getPointerAlignment().getValue());
943950

944951
addUsedGlobal(var);
945-
break;
946-
}
947952
}
948953

949954
if (!IRGen.Opts.ForceLoadSymbolName.empty()) {

stdlib/private/StdlibUnittest/RaceTest.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import SwiftPrivate
4040
import SwiftPrivatePthreadExtras
4141
#if os(OSX) || os(iOS)
4242
import Darwin
43-
#elseif os(Linux) || os(FreeBSD) || os(Android)
43+
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android)
4444
import Glibc
4545
#endif
4646

stdlib/private/StdlibUnittest/StdlibCoreExtras.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import SwiftPrivate
1414
import SwiftPrivateLibcExtras
1515
#if os(OSX) || os(iOS)
1616
import Darwin
17-
#elseif os(Linux) || os(FreeBSD) || os(Android)
17+
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android)
1818
import Glibc
1919
#endif
2020

stdlib/private/StdlibUnittest/StdlibUnittest.swift.gyb

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import SwiftPrivateLibcExtras
2020

2121
#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS)
2222
import Darwin
23-
#elseif os(Linux) || os(FreeBSD) || os(Android)
23+
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android)
2424
import Glibc
2525
#endif
2626

@@ -1406,6 +1406,7 @@ public enum OSVersion : CustomStringConvertible {
14061406
case linux
14071407
case freeBSD
14081408
case android
1409+
case ps4
14091410

14101411
public var description: String {
14111412
switch self {
@@ -1427,6 +1428,8 @@ public enum OSVersion : CustomStringConvertible {
14271428
return "Linux"
14281429
case .freeBSD:
14291430
return "FreeBSD"
1431+
case .ps4:
1432+
return "PS4"
14301433
case .android:
14311434
return "Android"
14321435
}
@@ -1463,6 +1466,8 @@ func _getOSVersion() -> OSVersion {
14631466
return .linux
14641467
#elseif os(FreeBSD)
14651468
return .freeBSD
1469+
#elseif os(PS4)
1470+
return .ps4
14661471
#elseif os(Android)
14671472
return .android
14681473
#else
@@ -1539,6 +1544,8 @@ public enum TestRunPredicate : CustomStringConvertible {
15391544

15401545
case freeBSDAny(reason: String)
15411546

1547+
case ps4Any(reason: String)
1548+
15421549
case androidAny(reason: String)
15431550

15441551
case objCRuntime(/*reason:*/ String)
@@ -1624,6 +1631,9 @@ public enum TestRunPredicate : CustomStringConvertible {
16241631
case .freeBSDAny(reason: let reason):
16251632
return "freeBSDAny(*, reason: \(reason))"
16261633

1634+
case .ps4Any(reason: let reason):
1635+
return "ps4Any(*, reason: \(reason))"
1636+
16271637
case .objCRuntime(let reason):
16281638
return "Objective-C runtime, reason: \(reason))"
16291639
case .nativeRuntime(let reason):
@@ -1881,6 +1891,14 @@ public enum TestRunPredicate : CustomStringConvertible {
18811891
return false
18821892
}
18831893

1894+
case .ps4Any:
1895+
switch _getRunningOSVersion() {
1896+
case .ps4:
1897+
return true
1898+
default:
1899+
return false
1900+
}
1901+
18841902
case .objCRuntime:
18851903
#if _runtime(_ObjC)
18861904
return true

stdlib/private/SwiftPrivateLibcExtras/Subprocess.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import SwiftPrivate
1414
#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS)
1515
import Darwin
16-
#elseif os(Linux) || os(FreeBSD) || os(Android)
16+
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android)
1717
import Glibc
1818
#endif
1919

@@ -284,7 +284,9 @@ internal func _getEnviron() -> UnsafeMutablePointer<UnsafeMutablePointer<CChar>?
284284
#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS)
285285
return _NSGetEnviron().pointee
286286
#elseif os(FreeBSD)
287-
return environ;
287+
return environ
288+
#elseif os(PS4)
289+
return environ
288290
#elseif os(Android)
289291
return environ
290292
#else

stdlib/private/SwiftPrivateLibcExtras/SwiftPrivateLibcExtras.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import SwiftPrivate
1414
#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS)
1515
import Darwin
16-
#elseif os(Linux) || os(FreeBSD) || os(Android)
16+
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android)
1717
import Glibc
1818
#endif
1919

stdlib/private/SwiftPrivatePthreadExtras/PthreadBarriers.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS)
1414
import Darwin
15-
#elseif os(Linux) || os(FreeBSD) || os(Android)
15+
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android)
1616
import Glibc
1717
#endif
1818

0 commit comments

Comments
 (0)