$ swift -Xfrontend -emit-ir -Xllvm -debug a.swift
-Xllvm -debug
をつけると、 LLVM_DEBUG
で吐かれてるいろんなデバッグ情報が、出てくるんですね。Guaranteed Optimization
無しでコンパイルするオプションみたいなの無いですか?protocol P { associatedtype T func f(_ g: @escaping (T) -> Void) } class C<S>: P { typealias T = S private let _f: ((S) -> Void) -> Void init<Q: P>(q: Q) where Q.T == T { // Error: cannot assign value of type '((S) -> Void) -> Void' to type '((S) -> Void) -> Void' self._f = { g -> Void in q.f(g) } } func f(_ g: @escaping (S) -> Void) { self._f(g) } }
でエラーメッセージが不親切な件の原因を探している過程で、意図のわからないコードがあったので質問させてください // Try to simplify irrelevant details of function types. For example, if // someone passes a "() -> Float" function to a "() throws -> Int" // parameter, then uttering the "throws" may confuse them into thinking that // that is the problem, even though there is a clear subtype relation. if (auto srcFT = exprType->getAs<FunctionType>()) if (auto destFT = contextualType->getAs<FunctionType>()) { auto destExtInfo = destFT->getExtInfo(); if (!srcFT->isNoEscape()) destExtInfo = destExtInfo.withNoEscape(false); // 👈
ですが、これコメントの通り関数の型の不一致に escaping とか throws とか混ぜるとややこしいので出さない的な意図であってそうでしょうか? https://github.com/apple/swift/blob/5e7da0e3dcf13c603233c1f2aad1f1aded8821df/lib/Sema/CSDiag.cpp#L3250AnyFunctionType exprType
が構成された時点でもう発生していて[omochi@omochi-iMac-PC43 warn]$ swift aaa.swift aaa.swift:16:9: error: cannot assign value of type '(@escaping (Int) -> Void) -> Void' to type '((Int) -> Void) -> Void' f = { (g) -> Void in ^~~~~~~~~~~~~~~~
@escaping
が暗黙に確定しているんだけど@escaping
が、明示された形で表示されるようになってしまう副作用が出てきた・・・[&]
なラムダ式ってことでいいんでしょか?Type Solution::simplifyType(Type type) const { if (!type->hasTypeVariable()) return type; // Map type variables to fixed types from bindings. return simplifyTypeImpl( getConstraintSystem(), type, [&](TypeVariableType *tvt) -> Type { auto known = typeBindings.find(tvt); assert(known != typeBindings.end()); return known->second; }); }
[&]
でのthisの暗黙ミュータブルキャプチャですね、fr variable
だと思うので、ちょっと違うんですよねーFunctionType
の入力が TupleType/ParenType
だったのを FunctionType
にパラメータリストを持たせるようにしていく過渡期なので、ここに手をだすのは危険だったかもしれないですね。// RefBox.value.modify sil hidden [transparent] @$S1a6RefBoxC5valuexvM : $@yield_once @convention(method) <T> (@guaranteed RefBox<T>) -> @yields @inout T { // %0 // users: %2, %1 bb0(%0 : $RefBox<T>): debug_value %0 : $RefBox<T>, let, name "self", argno 1 // id: %1 %2 = ref_element_addr %0 : $RefBox<T>, #RefBox.value // user: %3 %3 = begin_access [modify] [dynamic] %2 : $*T // users: %5, %8, %4 yield %3 : $*T, resume bb1, unwind bb2 // id: %4 bb1: // Preds: bb0 end_access %3 : $*T // id: %5 %6 = tuple () // user: %7 return %6 : $() // id: %7 bb2: // Preds: bb0 end_access %3 : $*T // id: %8 unwind // id: %9 } // end sil function '$S1a6RefBoxC5valuexvM'
modify(&x.b)
で modify
内で結局書き換わらなかったときかな?struct IntBox { var value: Int = 3 } func mod(_ value: inout Int) { value *= 2 } var box = IntBox() mod(&box.value)
protocol HasInt { var intValue : Int {get set} } func mod(_ val: inout Int) throws {} func testing<T: HasInt>(x: inout T) throws { try mod(&x.intValue) }
// testing<A>(x:) sil hidden @$S4test7testing1xyxz_tKAA6HasIntRzlF : $@convention(thin) <T where T : HasInt> (@inout T) -> @error Error { // %0 // users: %3, %1 bb0(%0 : $*T): %3 = begin_access [modify] [static] %0 : $*T // users: %11, %16, %5 %4 = witness_method $T, #HasInt.intValue!modify.1 : <Self where Self : HasInt> (inout Self) -> () -> () : $@yield_once @convention(witness_method: HasInt) <τ_0_0 where τ_0_0 : HasInt> (@inout τ_0_0) -> @yields @inout Int // user: %5 (%5, %6) = begin_apply %4<T>(%3) : $@yield_once @convention(witness_method: HasInt) <τ_0_0 where τ_0_0 : HasInt> (@inout τ_0_0) -> @yields @inout Int // users: %8, %10, %15 // function_ref mod(_:) %7 = function_ref @$S4test3modyySizKF : $@convention(thin) (@inout Int) -> @error Error // user: %8 try_apply %7(%5) : $@convention(thin) (@inout Int) -> @error Error, normal bb1, error bb2 // id: %8 bb1(%9 : $()): // Preds: bb0 end_apply %6 // id: %10 end_access %3 : $*T // id: %11 %12 = tuple () // user: %13 return %12 : $() // id: %13 // %14 // user: %17 bb2(%14 : $Error): // Preds: bb0 abort_apply %6 // id: %15 end_access %3 : $*T // id: %16 throw %14 : $Error // id: %17 } // end sil function '$S4test7testing1xyxz_tKAA6HasIntRzlF'
なので、アクセス中に throw したときみたいです。struct Stone { var _x: Int = 3 var x: Int { get { return _x } _modify { yield &_x } } } func mod(_ x: inout Int) { x = 8 } func main() { var a = Stone() mod(&a.x) }
define hidden swiftcc void @"$S1a4mainyyF"() #0 { entry: %a = alloca %T1a5StoneV, align 8 %0 = bitcast %T1a5StoneV* %a to %swift.opaque** store %swift.opaque* null, %swift.opaque** %0, align 8 %1 = alloca [32 x i8], align 8 %2 = bitcast %T1a5StoneV* %a to i8* call void @llvm.lifetime.start.p0i8(i64 8, i8* %2) %3 = call swiftcc i64 @"$S1a5StoneVACycfC"() %a._x = getelementptr inbounds %T1a5StoneV, %T1a5StoneV* %a, i32 0, i32 0 %a._x._value = getelementptr inbounds %TSi, %TSi* %a._x, i32 0, i32 0 store i64 %3, i64* %a._x._value, align 8 %4 = getelementptr inbounds [32 x i8], [32 x i8]* %1, i32 0, i32 0 call void @llvm.lifetime.start.p0i8(i64 32, i8* %4) %5 = call swiftcc { i8*, %TSi* } @"$S1a5StoneV1xSivM"(i8* noalias dereferenceable(32) %4, %T1a5StoneV* nocapture swiftself dereferenceable(8) %a) %6 = extractvalue { i8*, %TSi* } %5, 0 %7 = extractvalue { i8*, %TSi* } %5, 1 call swiftcc void @"$S1a3modyySizF"(%TSi* nocapture dereferenceable(8) %7) %8 = bitcast i8* %6 to void (i8*, i1)* call swiftcc void %8(i8* noalias dereferenceable(32) %4, i1 false) call void @llvm.lifetime.end.p0i8(i64 32, i8* %4) %9 = bitcast %T1a5StoneV* %a to i8* call void @llvm.lifetime.end.p0i8(i64 8, i8* %9) ret void }
define hidden swiftcc { i8*, %TSi* } @"$S1a5StoneV1xSivM"(i8* noalias dereferenceable(32), %T1a5StoneV* nocapture swiftself dereferenceable(8)) #1 { entry: %._x = getelementptr inbounds %T1a5StoneV, %T1a5StoneV* %1, i32 0, i32 0 %2 = insertvalue { i8*, %TSi* } { i8* bitcast (void (i8*, i1)* @"$S1a5StoneV1xSivM.resume.0" to i8*), %TSi* undef }, %TSi* %._x, 1 ret { i8*, %TSi* } %2 } define internal swiftcc void @"$S1a5StoneV1xSivM.resume.0"(i8* noalias nonnull dereferenceable(32), i1) #0 { entryresume.0: %FramePtr = bitcast i8* %0 to %"$S1a5StoneV1xSivM.Frame"* %vFrame = bitcast %"$S1a5StoneV1xSivM.Frame"* %FramePtr to i8* ret void }
_modify
でもうお試しできるとわかったstruct Stone { var x: Int { get { return 1 } _modify { var x: Int = 3 yield &x y = x } } var y: Int = 0 } func mod(_ x: inout Int) { x = 8 } func main() { var a = Stone() mod(&a.x) print(a.y) } main()
/Users/hiragram/Development/swift-source/swift/stdlib/public/SDK/Intents/INIntent.swift:25:19: error: value of type 'INIntent' has no member '__setImage'; did you mean 'setImage'? (self as! INIntent).__setImage(image, forParameterNamed: keyPathString) ~~~~~~^~~~~~~~~~~~~ ~~~~~~~~~~ setImage Intents.INIntent:10:15: note: 'setImage' declared here open func setImage(_ image: INImage?, forParameterNamed parameterName: String) ^ /Users/hiragram/Development/swift-source/swift/stdlib/public/SDK/Intents/INIntent.swift:23:17: note: 'setImage' declared here public func setImage<Value>(_ image: INImage?, forParameterNamed parameterName: KeyPath<Self, Value>) { ^ /Users/hiragram/Development/swift-source/swift/stdlib/public/SDK/Intents/INIntent.swift:32:26: error: value of type 'INIntent' has no member '__image'; did you mean 'image'? return (self as! INIntent).__image(forParameterNamed: keyPathString) ~~~~~~^~~~~~~~~~~~~ ~~~~~~~ image Intents.INIntent:12:15: note: 'image' declared here open func image(forParameterNamed parameterName: String) -> INImage? ^ /Users/hiragram/Development/swift-source/swift/stdlib/public/SDK/Intents/INIntent.swift:30:17: note: 'image' declared here public func image<Value>(forParameterNamed parameterName: KeyPath<Self, Value>) -> INImage? { ^ [973/1575] Compiling /Users/hiragram/Development/swift-source/build/Ninja-ReleaseAssert/swift-macosx-x86_64/stdlib/public/SDK/Foundation/macosx/x86_64/Foundation.o ninja: build stopped: subcommand failed. utils/build-script: fatal error: command terminated with a non-zero exit status 1, aborting
utils/build-script -Rt
これでこうなるVersion 10.0 beta (10L176w)
error: value of type 'INIntent' has no member '__image'
こういうのは並列関係なさそうな気がするけどそういうもん?$ xcode-select -p
の出力は?$ xcode-select -p /Applications/Xcode-beta.app/Contents/Developer
-Rt
だったなら、 releaseビルドだから、 XcodeでビルドするときはXcodeのconfigurationをreleaseにしないといけないよmutableAddressWithNativeOwner
から_modify
へ https://github.com/apple/swift/pull/19154@sil_name(hoge)
みたいな、「SIL上に現れる名前はこっちにする」的なやつなかったでしたっけ(前にどっかで見たような気がするけど見つけられない)@_silgen_name("hoge") func f() {}
sil_stage canonical import Builtin import Swift import SwiftShims @_silgen_name("hoge") func f() // main sil @main : $@convention(c) (Int32, UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>) -> Int32 { bb0(%0 : $Int32, %1 : $UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>): %2 = integer_literal $Builtin.Int32, 0 // user: %3 %3 = struct $Int32 (%2 : $Builtin.Int32) // user: %4 return %3 : $Int32 // id: %4 } // end sil function 'main' // hoge sil hidden @hoge : $@convention(thin) () -> () { bb0: %0 = tuple () // user: %1 return %0 : $() // id: %1 } // end sil function 'hoge'
@_silgen_name("hoge.storage")
したらおかしくならないかな〜と思ってやりたくなったけど型のプロパティに対して付けられなかったstruct A { var b: Int = 1 @_silgen_name("_T04hoge1AV1bSivg") func itazura() -> Int { return 2 } }
struct A { var b: Int = 1 @_silgen_name("_T04hoge1AV1bSivg") func itazura() -> Int { return 2 } }
struct A { var b: Int { return 1 } @_silgen_name("_T04hoge1AV1bSivg") func itazura() -> Int { return 2 } } print(A().b) print(A().itazura())
struct A { var b: Int { return 1 } @_silgen_name("_T04hoge1AV1bSivg") func itazura() -> Int { return 2 } } print(A().b) print(A().itazura())
no such file or directory: '/Users/hiragram/Development/swift-source/build/Xcode-RelWithDebInfoAssert/cmark-macosx-x86_64/src/Release/libcmark.a'
utils/build-script --xcode --release-debuginfo
がこういう死に方するの何だろう Assertion failed: (FD >= 0 && "File not yet open!"), function preferred_buffer_size, file /Users/hiragram/Development/swift-source/llvm/lib/Support/raw_ostream.cpp, line 701.
/usr/local/bin/python /Users/omochi/work/swift-source/swift/utils/line-directive \ @/Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/stdlib/public/core/WkKut.txt -- \ /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./bin/swiftc -c \ -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk \ -target x86_64-apple-macosx10.9 \ -resource-dir /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./lib/swift \ -F /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/../../../Developer/Library/Frameworks \ -Onone -g -D INTERNAL_CHECKS_ENABLED -D SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS \ -I /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./lib/swift/macosx/x86_64 \ -module-cache-path /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./module-cache -no-link-objc-runtime \ -Xfrontend -enable-resilience -nostdimport -parse-stdlib -module-name Swift \ -Xfrontend -group-info-path -Xfrontend /Users/omochi/work/swift-source/swift/stdlib/public/core/GroupInfo.json \ -swift-version 5 -warn-swift3-objc-inference-complete -Xfrontend -verify-syntax-tree \ -Xllvm -sil-inline-generics -Xllvm -sil-partial-specialization -Xfrontend -enable-sil-ownership \ -Xcc -DswiftCore_EXPORTS -warn-implicit-overrides -module-link-name swiftCore -force-single-frontend-invocation \ -Xcc -D__SWIFT_CURRENT_DYLIB=swiftCore -parse-as-library \ -o Swift.o \ @/Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/stdlib/public/core/WkKut.txt
(edited)#0 0x00000001033edfaa in swift::sys::Task::execute() at /Users/omochi/work/swift-source/swift/lib/Basic/Unix/TaskQueue.inc:198 #1 0x00000001033f0301 in TaskMonitor::beginExecutingATask(swift::sys::Task&) at /Users/omochi/work/swift-source/swift/lib/Basic/Unix/TaskQueue.inc:504 #2 0x00000001033eebf3 in TaskMonitor::startUpSomeTasks() at /Users/omochi/work/swift-source/swift/lib/Basic/Unix/TaskQueue.inc:477 #3 0x00000001033ee7a3 in TaskMonitor::executeTasks() at /Users/omochi/work/swift-source/swift/lib/Basic/Unix/TaskQueue.inc:451 #4 0x00000001033f106f in swift::sys::TaskQueue::execute(std::__1::function<void (int, void*)>, std::__1::function<swift::sys::TaskFinishedResponse (int, int, llvm::StringRef, llvm::StringRef, swift::sys::TaskProcessInformation, void*)>, std::__1::function<swift::sys::TaskFinishedResponse (int, llvm::StringRef, llvm::StringRef, llvm::StringRef, void*, llvm::Optional<int>, swift::sys::TaskProcessInformation)>) at /Users/omochi/work/swift-source/swift/lib/Basic/Unix/TaskQueue.inc:678 #5 0x000000010036431a in swift::driver::PerformJobsState::runTaskQueueToCompletion() at /Users/omochi/work/swift-source/swift/lib/Driver/Compilation.cpp:1089 #6 0x0000000100361333 in swift::driver::Compilation::performJobsImpl(bool&, std::__1::unique_ptr<swift::sys::TaskQueue, std::__1::default_delete<swift::sys::TaskQueue> >&&) at /Users/omochi/work/swift-source/swift/lib/Driver/Compilation.cpp:1388 #7 0x00000001003675ec in swift::driver::Compilation::performJobs(std::__1::unique_ptr<swift::sys::TaskQueue, std::__1::default_delete<swift::sys::TaskQueue> >&&) at /Users/omochi/work/swift-source/swift/lib/Driver/Compilation.cpp:1501 #8 0x0000000100334d61 in run_driver(llvm::StringRef, llvm::ArrayRef<char const*>) at /Users/omochi/work/swift-source/swift/tools/driver/driver.cpp:176 #9 0x0000000100332632 in main at /Users/omochi/work/swift-source/swift/tools/driver/driver.cpp:246
// Spawn the subtask. int spawnErr = posix_spawn(&Pid, ExecPath, &FileActions, nullptr, const_cast<char **>(argvp), const_cast<char **>(envp));
int Compilation::performJobs(std::unique_ptr<TaskQueue> &&TQ) {
において、冒頭のperformSingleCommandに突入するif文をすり抜けるのが/Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/bin/swift -frontend -c -filelist /var/folders/1v/_s33fkpj07g9y3zvdfs9cz9m0000gn/T/sources-ffe05d -supplementary-output-file-map /var/folders/1v/_s33fkpj07g9y3zvdfs9cz9m0000gn/T/supplementaryOutputs-7c1c06 -disable-objc-attr-requires-foundation-module -target x86_64-apple-macosx10.9 -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -I /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./lib/swift/macosx/x86_64 -F /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/../../../Developer/Library/Frameworks -warn-swift3-objc-inference-complete -warn-implicit-overrides -g -module-cache-path /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./module-cache -module-link-name swiftCore -nostdimport -parse-stdlib -resource-dir /Users/omochi/work/swift-source/build/Ninja-DebugAssert/swift-macosx-x86_64/./lib/swift -swift-version 5 -Onone -D INTERNAL_CHECKS_ENABLED -D SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS -enable-resilience -group-info-path /Users/omochi/work/swift-source/swift/stdlib/public/core/GroupInfo.json -verify-syntax-tree -enable-sil-ownership -Xllvm -sil-inline-generics -Xllvm -sil-partial-specialization -Xcc -DswiftCore_EXPORTS -Xcc -D__SWIFT_CURRENT_DYLIB=swiftCore -parse-as-library -module-name Swift -o Swift.o
$S
から $s
に!int swift::Demangle::getManglingPrefixLength(llvm::StringRef mangledName) { if (mangledName.empty()) return 0; llvm::StringRef prefixes[] = { /*Swift 4*/ "_T0", /*Swift 4.x*/ "$S", "_$S", /*Swift 5+*/ "$s", "_$s"}; // Look for any of the known prefixes for (auto prefix : prefixes) { if (mangledName.startswith(prefix)) return prefix.size(); } return 0; }
bool swift::Demangle::isOldFunctionTypeMangling(llvm::StringRef mangledName) { return mangledName.startswith("_T"); }
_T
, _T0
, $S
, $s
の 4つがこれまでにあるっぽい$s
から代わる事は今後無いと・・・#define MANGLING_PREFIX $s
になるってことはDemangling for $S1a3CatC4nameSSvg kind=Global kind=Getter kind=Variable kind=Class kind=Module, text="a" kind=Identifier, text="Cat" kind=Identifier, text="name" kind=Type kind=Structure kind=Module, text="Swift" kind=Identifier, text="String" $S1a3CatC4nameSSvg ---> a.Cat.name.getter : Swift.String
is
とかisa
って使えますか?protocol SomeProtocol{ // required method func r() // optional method func o() } extension SomeProtocol { // optional methods func o() { print("o() in SomeProtocol") } func p() { print("p() in SomeProtocol") } } class SomeClass: SomeProtocol { func r() { print("r() in SomeClass") } func o() { print("o() in SomeClass") } func p() { print("p() in SomeClass") } } let sc: SomeClass = SomeClass() sc.r() // 出力 "r() in SomeClass" sc.o() // 出力 "o() in SomeClass" sc.p() // 出力 "p() in SomeClass" let sp: SomeProtocol = sc sp.r() // 出力 "r() in SomeClass" sp.o() // 出力 "o() in SomeClass" sp.p() // 出力 "p() in SomeProtocol"
r() in SomeClass o() in SomeClass p() in SomeClass r() in SomeClass o() in SomeClass p() in SomeProtocol
func r()
と func o()
は、プロトコル定義にエントリがあるからfunc p()
はプロトコル定義にエントリがないからlet sc: SomeClass = SomeClass() sc.r() // 出力 "r() in SomeClass" ただのSomeClassのメソッド呼び出し sc.o() // 出力 "o() in SomeClass" ただのSomeClassのメソッド呼び出し sc.p() // 出力 "p() in SomeClass" ただのSomeClassのメソッド呼び出し let sp: SomeProtocol = sc sp.r() // 出力 "r() in SomeClass" 動的、SomeClass.rがテーブルから出てくる sp.o() // 出力 "o() in SomeClass" 動的、SomeClass.oがテーブルから出てくる sp.p() // 出力 "p() in SomeProtocol" 静的、式がSomeProtocolなのでSomeProtocol.pになる
(edited)protocol P { func a() -> String func b() -> String } extension P { func a() -> String { return "P" } func b() -> String { return "P" } } class C: P { func a() -> String { return "C" } } class SC: C { override func a() -> String { return "SC" } func b() -> String { return "SC" } } let sc: SC = SC() print(sc.a()) // SC print(sc.b()) // SC let c: C = sc print(c.a()) // SC print(c.b()) // P
SC SC SC P
c.b()
はwitness tableを見にいくけどb()がcから取り出せず、静的DispatchでP.bになる。(あってます?) c.a()
は実体はSCのインスタンスなので、SCのvTableを見にいって、SC.a()になる(あってます?) (edited)b
は SC
の VTable にはあるけど C
の VTable にはなくて、 C
として呼ばれたときには SC
の b
とは同名同型の別の関数として静的ディスパッチされる、だと思います。/usr/local/Cellar/llvm/HEAD-3898e47/include/c++/v1/stdlib.h:94:15: fatal error: 'stdlib.h' file not found #include_next <stdlib.h>
llvmのチュートリアルのコンパイルができない・・・・前はできたのに・・・・. brewでllvmインストールして,コンパイルしてたのだが・・・・・# Compile clang++ -g -O3 toy.cpp `llvm-config --cxxflags` # Run ./a.out
これをやると,stdlib.hが見つからないって言われて,あるのに・・・・って格闘中・・・・. LLVMチュートリアルのソースコードのコンパイルはこうすればいいよーってのがあったら教えてください・・・・・. ちょっと前までできてたのに・・・・・. (edited)brew link
あたりで修復してみるとか。/use/include
はある?Command Line Toolsを入れてもMojave標準だと存在しません。/use/include
が存在するのが前提で作られてるモノのために、別途インストールできる様になっています。DEVELOPMENT-SNAPSHOT-2018-11-01-a
のデバッガアタッチできましたswiftc
を指定してAttachしてから、TOOLCHAINS=org.swift.4220181113a swiftc
で起動したらアタッチできました。xcrun --toolchain org.swift.4220181113a swiftc
だとデバッガが見つけてくれなかった。swiftc
?util/build-script --debug --xcode --skip-build-benchmarks
でビルドしたswift, swiftc/Library/Developer/Toolchains/
にインストールしたツールチェインのswiftc
でもアタッチ出来るから、自前ビルドでも何か手順がありそうだけど… (edited)TOOLCHAINS=org.swift.42120181030a xcrun swift
使って起動したswift
にアタッチ出来た。/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift
で起動してもアタッチ出来るから、自分でビルドしたものもいけそう。$ swift --version
とかを、wait for executable... で引っ掛けるのができないです。Driver::MainLoop
にシンボリックブレークポイント置いてちゃんと止まりました。 (edited)main
にシンボリックブレークポイント置いて、/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift --version
で止まりました。getSwiftFullVersion
にシンボリックブレークポイントもいけました。swift
にしてる。xcscheme
ファイルを見ると/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift
と記述されてる。 <BuildableProductRunnable runnableDebuggingMode = "0"> <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "C6F405DB688E4209BE9944BB" BuildableName = "swift" BlueprintName = "swift" ReferencedContainer = "container:../build/Xcode-DebugAssert/swift-macosx-x86_64/Swift.xcodeproj"> </BuildableReference> </BuildableProductRunnable>
<PathRunnable runnableDebuggingMode = "0" FilePath = "/Users/omochi/work/swift-source/build/Xcode-DebugAssert/swift-macosx-x86_64/Debug/bin/swift"> </PathRunnable>
直指定したらこうなったけど駄目でした、反応無し・・・/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift
にアタッチ出来るかどうかで、ツールチェインとしてインストールしているかどうかの違いが原因か判るはず。/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift
Could not attach to name : “swift” Problems with launching via XPC. XPC error : Connection invalid
Swift 4.2.1 Release 2018-10-30 (a)
を選択してても、問題なく/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift
にアタッチ出来る。Wait for…もDebug Process As rootすればアタッチ出来るのも変わらず。 (edited)swift
を設定して試してた。 (edited)swift
にして試してみて欲しいかも。None
にしてデバッガを実行すると動く。 (edited)None
は、プロジェクトを閉じて再度開くと、None
からSchemeのターゲットに戻ってしまう。Yams.xcodeproj
は、ここに過去存在して今は存在しないターゲットが設定されたままになってるため、None
に戻らない。/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift
/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift -version
実行
/Library/Developer/Toolchains/swift-4.2.1-RELEASE.xctoolchain/usr/bin/swift
をアタッチする手順dummy
追加 2. メインのschemeのBuildアクションにdummy
を追加。 3. RunアクションのExpand Variables Base Onをdummy
に。 4. dummyターゲット削除、Buildアクションにはdummy (missing)
が残り、Expand Variables Base Onもdummy (missing)
のままになり、プロジェクトを再度開いてもそのまま残る。swift
にアタッチ出来ない問題も、このExpand Variables Base Onの影響を受けているのならば、missingで回避出来るかも?${SRCROOT}
などを使う時に、元となる設定をどのターゲットから持ってくるか、を設定するものかと。root
で、Stopping due to fatal error: DllNotFoundException: libc.dylibStopping due to fatal error: DllNotFoundException: libc.dylib
が出て,プロセスにアタッチできない・・・・.誰か,同じような現象にあったことがある方いらっしゃいませんか?text
がinternalじゃなくてpublicだと嬉しいんですが、なにか困ることありますか? https://github.com/apple/swift-syntax/blob/master/Sources/SwiftSyntax/TokenKind.swift.gyb#L35StringLiteralExprSyntax
の値が空文字かどうか判定するのに下記のコード書く時にstringQuote
やmultilineStringQuote
のtext
使いたかったです。まあ無くても別に問題ないのであったら良いなぐらいですね。 public override func visit(_ node: StringLiteralExprSyntax) { let value = node.stringLiteral.text guard value != "\"\"", value != "\"\"\"\"\"\"" else { return } ... }
(edited)Syntax.swift
に関する変更は入らないのか... https://github.com/apple/swift-syntax/pull/94/files#define DEBUG_TYPE "sil-inliner"
ってタグの定義がついてて$ swiftc -emit-sil -Xllvm -debug-only=sil-inliner
ってやると.swiftmodule
と.swiftdoc
の中身を見たりダンプするコマンドってありますか?llvm-bcanalyzer -dump
で llvm ビットコード全般ダンプできるんですが、Swift向けに作られているわけでは無く、独自のコンテナの中身は見られないので、あまり参考にはならないです。 (edited)<BLOCKINFO_BLOCK/> <MODULE_DOC_BLOCK NumWords=813176 BlockCodeSize=2> <CONTROL_BLOCK NumWords=32 BlockCodeSize=3> <METADATA abbrevid=5 op0=1 op1=1 op2=0 op3=0/> blob data = 'Swift version 5.0-dev (LLVM 06f1615069, Swift edb924f743)' <MODULE_NAME abbrevid=4/> blob data = 'Swift' <TARGET abbrevid=6/> blob data = 'x86_64-apple-macosx10.9' </CONTROL_BLOCK> <COMMENT_BLOCK NumWords=813139 BlockCodeSize=4> <DECL_COMMENTS abbrevid=4 op0=3181980/> blob data = unprintable, 3247524 bytes. <GROUP_NAMES abbrevid=5/> blob data = unprintable, 5004 bytes. </COMMENT_BLOCK> </MODULE_DOC_BLOCK>
BLOCKINFO#0 { } BLOCKINFO#0 MODULE_BLOCK#8 { CONTROL_BLOCK#9 { MODULE_NAME#2 METADATA#1 TARGET#3 OPTIONS_BLOCK#16 { IS_SIB#3 IS_TESTABLE#4 SDK_PATH#1 XCC#2 XCC#2 } OPTIONS_BLOCK#16 } CONTROL_BLOCK#9 ...
import Foundation let interface = try! String(contentsOfFile: "/usr/lib/swift/linux/x86_64/Swift.swiftinterface") print(interface)
// swift-interface-format-version: 1.0 // swift-tools-version: Swift version 5.0-dev (LLVM 06f1615069, Swift 844d4df31a) // swift-module-flags: -disable-objc-attr-requires-foundation-module -target x86_64-unknown-linux-gnu -disable-objc-interop -enable-library-evolution -module-link-name swiftCore -parse-stdlib -swift-version 5 -O -enforce-exclusivity=unchecked -module-name Swift import SwiftShims @inlinable public func min<T>(_ x: T, _ y: T) -> T where T : Swift.Comparable { // In case `x == y` we pick `x`. // This preserves any pre-existing order in case `T` has identity, // which is important for e.g. the stability of sorting algorithms. // `(min(x, y), max(x, y))` should return `(x, y)` in case `x == y`. return y < x ? y : x } @inlinable public func min<T>(_ x: T, _ y: T, _ z: T, _ rest: T...) -> T where T : Swift.Comparable { var minValue = min(min(x, y), z) // In case `value == minValue`, we pick `minValue`. See min(_:_:). for value in rest where value < minValue { minValue = value } return minValue } @inlinable public func max<T>(_ x: T, _ y: T) -> T where T : Swift.Comparable { // In case `x == y`, we pick `y`. See min(_:_:). return y >= x ? y : x } @inlinable public func max<T>(_ x: T, _ y: T, _ z: T, _ rest: T...) -> T where T : Swift.Comparable { var maxValue = max(max(x, y), z) // In case `value == maxValue`, we pick `value`. See min(_:_:). for value in rest where value >= maxValue { maxValue = value } return maxValue } @_fixed_layout public struct EnumeratedSequence<Base> where Base : Swift.Sequence { @usableFromInline internal var _base: Base @inlinable internal init(_base: Base) { self._base = _base } } extension EnumeratedSequence { @_fixed_layout public struct Iterator { @usableFromInline internal var _base: Base.Iterator @usableFromInline internal var _count: Int @inlinable internal init(_base: Base.Iterator) { self._base = _base self._count = 0 } }
.swiftinterface
入ってるのか。-dump-ast
のParserの部分を独立させて、現行の環境で動くようにしました。よかったら参考にしてください。 https://github.com/kishikawakatsumi/SwiftAST 使い方は swift-ast parse [FILE_PATH_TO_PARSE] -buildCommand [BUILD_COMMAND_TO_BUILD_THE_PROJECT]
例えば path/to/swift-ast parse "./Framework/Sources/SpreadsheetView.swift" -buildCommand xcodebuild -scheme SpreadsheetView
や、 path/to/swift-ast parse ./Lib/KeychainAccess/Keychain.swift -buildCommand xcodebuild -scheme KeychainAccess -sdk iphonesimulator -destination "name=iPhone Xs,OS=12.2"
です。 以下、思い出したことを書きます。 (edited)swift -dump-ast
produces - kishikawakatsumi/SwiftAST-dump-ast
は全ての型が解決しているので原則としてコンパイルが成功する必要があります。簡単な(依存関係がない)ファイルなら簡単ですが、他のファイルやモジュールを参照している場合は同じモジュールのファイルの場合はそれを一緒に渡す、別モジュールの場合はそれを先にビルドする必要があります。 なので、時間は余計にかかるのですが、 https://github.com/kishikawakatsumi/SwiftAST/blob/master/Sources/SwiftAST/XcodebuildTool.swift#L37-L42 のように swift -dump-ast
を実行する前にまずビルドしています。 ビルドエラーが起こる状態で swift -dump-ast
を実行した場合、単に失敗するか不完全なASTが出力されます。 swift -dump-ast
の出力自体が謎であるのにさらに不完全なASTを相手にするのは無理なので、最初のキモは確実にビルドできるパラメータを組み立てることです。 (edited)swift -dump-ast
produces - kishikawakatsumi/SwiftASTconstructor_decl
や brace_stmt
assign_expr
といったノードの種類がよくわからないことと、それぞれがどういう属性を持っているかが当然Undocumentedでよくわからないところで、Parse自体はそれほど難しくないはず(目的にもよりますが)です。private func process(sourceFile: URL, verbose: Bool = false) throws -> AST { let arguments = buildArguments(source: sourceFile) let rawAST = try dumpAST(arguments: arguments) let tokens = tokenize(rawAST: rawAST) let node = lex(tokens: tokens) let root = parse(node: node) return root }
dumpAST(arguments:)
はswift -dump-ast
を実行します。 得られたテキストをtokenize(rawAST:)
でトークンに分割して、lex(tokens:)
でツリー構造を作ります。 最後にparse(node:)
でツリー構造のデータに意味を持たせます。swift -dump-ast
produces - kishikawakatsumi/SwiftAST-dump-ast
の出力はS式のように見えるのでカッコを頼りにしたくなりますが、別の意味のカッコが普通に("
や'
に囲まれることなく)出てくるのでそれは難しいです。 代わりに行とインデントを使います。func tokenize(source: String) -> [ASTToken] { var lines = [String]() for line in source.split(separator: "\n", omittingEmptySubsequences: false) { let trimmed = line.trimmingCharacters(in: .whitespaces) if trimmed.hasPrefix("(inherited_conformance") || trimmed.hasPrefix("(normal_conformance") || trimmed.hasPrefix("(abstract_conformance") || trimmed.hasPrefix("(specialized_conformance") || trimmed.hasPrefix("(assoc_type") || trimmed.hasPrefix("(value req") || !trimmed.hasPrefix("(") { continue } lines.append(String(line)) } ...
-dump-ast
の出力をまず行ごとに分割します。このとき、いくつかのプロジェクトでノイズになる行(実行コードには関係なく見える上にインデントがおかしい)が発見されたのでそれを取り除いています。indent
(先頭の空白)、symbol
(シングルクオートで囲まれた文字列)、string
(ダブルクオートで囲まれた文字列)、token
(それ以外の文字列や記号)に分類しました。 class ASTToken { enum TokenType { case token case symbol case string case indent(Int) }
▿ 1498 elements ▿ 0 : ( ▿ 1 : source_file ▿ 2 : "/Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift" ▿ 3 : __ ▿ 4 : ( ▿ 5 : struct_decl ▿ 6 : range ▿ 7 : = ▿ 8 : /Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift:1:8 - line:17:1 ▿ 9 : "Country" ▿ 10 : interface ▿ 11 : type ▿ 12 : = ▿ 13 : 'Country.Type' ...
ASTLexer
がこのトークンの配列をツリー構造にします。Lexerといってますが、ツリー構造に変換するだけです。[(, source_file, "/Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift"] [(, struct_decl, range, =, /Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift:1:8 - line:17:1, "Country", interface, type, =, 'Country.Type', access, =, public, non-resilient] [(, pattern_binding_decl, range, =, /Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift:2:12 - line:2:22] [(, pattern_typed, type, =, 'String'] [(, pattern_named, type, =, 'String', 'code', )] [(, type_ident] [(, component, id, =, 'String', bind, =, Swift.(file).String))))] [(, var_decl, range, =, /Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift:2:16 - line:2:16, "code", type, =, 'String', interface, type, =, 'String', access, =, public, let, readImpl, =, stored, immutable] [(, accessor_decl, implicit, range, =, /Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift:2:16 - line:2:16, 'anonname=0x10a8205a8', interface, type, =, '(Country) -> () -> String', access, =, public, get_for, =, code] [(, parameter, "self", interface, type, =, 'Country', )] [(, parameter_list, )] [(, brace_stmt, implicit, range, =, /Users/katsumi/Documents/XcodeProjects/SwiftPowerAssert/Fixtures/Atlas/Sources/Atlas/Atlas.swift:2:16 - line:2:16] [(, return_stmt, implicit] ...
こんな感じです。これでツリー構造とノードの種別や属性情報がプログラムから扱える形になりました。struct_decl
とかvar_decl
、call_expr
、member_ref_expr
、dot_syntax_call_expr
などです。それ以外に膨大な種類のノードがあるので、全部に対応するのはとても大変なので、必要に応じてノードをフィルタして使っていく、というのが良いかと私は考えています。private func parseSourceFileNode(node sourceFileNode: ASTNode<[ASTToken]>) -> AST { var declarations = [Declaration]() for node in sourceFileNode.children { for token in node.value { switch (token.type, token.value) { case (.token, "top_level_code_decl"): declarations.append(.topLevelCode(parseTopLevelCodeDeclarationNode(node: node))) case (.token, "import_decl"): declarations.append(.import(parseImportDeclarationNode(node: node))) case (.token, "struct_decl"): declarations.append(.struct(parseStructDeclarationNode(node: node))) case (.token, "class_decl"): declarations.append(.class(parseClassDeclarationNode(node: node))) case (.token, "enum_decl"): declarations.append(.enum(parseEnumDeclarationNode(node: node))) case (.token, "extension_decl"): declarations.append(.extension(parseExtensionDeclarationNode(node: node))) case (.token, "func_decl"): declarations.append(.function(parseFunctionDeclarationNode(node: node))) default: break } } } return AST(declarations: declarations) }
のようにまずStructやClass宣言を拾って、そのあと例えば関数だったらprivate func parseFunctionDeclarationNode(node: ASTNode<[ASTToken]>) -> FunctionDeclaration { let tokens = node.value let name = parseString(tokens: tokens) ?? parseSymbol(tokens: tokens) let accessLevel = parseAccessLevel(tokens: tokens) var parameters = [Parameter]() var body = [Statement]() for node in node.children { for token in node.value { switch (token.type, token.value) { case (.token, "parameter_list"): parameters.append(contentsOf: parseParameterListNode(node: node)) case (.token, "brace_stmt"): body.append(.expression(parseExpressionNode(node: node))) default: break } } } return FunctionDeclaration(accessLevel: accessLevel, name: name!, parameters: parameters, body: body) }
パラメータやステートメントをさらに拾っていく、としています。 一番大変なのがこのParser部分を作っていくところだと思います。ここは自分が利用する情報を探しながらトライアルアンドエラーで書いていくことになります。swift-ast
をいくつかのプロジェクトで試しましたが、clangモジュールのインポートをするためのパラメータが足りていない様です。 output: <unknown>:0: error: missing required module 'clibc'
あと、-showBuildSettings
の出力は-json
を使うとパースが簡単になると思います。 (edited)(parameter_list (parameter "i" interface type='Int') range=[foo.swift:1:17 - line:1:17])
https://github.com/kateinoigakukun/TouchTypist/blob/master/Sources/TypeCheckedAST/Parser/CanonicalTransformer.swift#L22-L29 (edited)(constructor_decl range=[/Users/katsumi/Documents/XcodeProjects/KeychainAccess/Lib/KeychainAccess/Keychain.swift:229:12 - line:231:5] "init(rawValue:)" interface type='(AuthenticationPolicy.Type) -> (UInt) -> AuthenticationPolicy' access=public designated (parameter "self" interface type='AuthenticationPolicy' inout) (parameter_list (parameter "rawValue" apiName=rawValue interface type='UInt') range=[/Users/katsumi/Documents/XcodeProjects/KeychainAccess/Lib/KeychainAccess/Keychain.swift:229:16 - line:229:31])
問題なさそうに見えますけど、どういう風に違いますか?xcodebuild -showBuildSettings -json -scheme KeychainAccess
みたいに書けるんですね。。。(parameter_list range=[foo.swift:1:17 - line:1:17] (parameter "i" interface type='Int'))
(parameter_list (parameter "i" interface type='Int') range=[foo.swift:1:17 - line:1:17]) // ここまでparameterの要素としてパースされる
(edited)XcodebuildTool.constructSwiftOptions(xcodebuildLog:)
で-fmodule-map-file=
も使う必要がある。
swiftc
へ渡されてるパラメータに含まれていますよ。 (edited)swift package generate-xcodeproj
してswift run swift-ast parse Sources/SwiftAST/main.swift -buildCommand xcodebuild -scheme SwiftAST
で言われます。$ swift package generate-xcodeproj warning: invalid duplicate target dependency declaration 'swift-build' in target 'FunctionalPerformanceTests' warning: invalid duplicate target dependency declaration 'swift-package' in target 'FunctionalPerformanceTests' generated: ./SwiftAST.xcodeproj $ swift run swift-ast parse Sources/SwiftAST/main.swift -buildCommand xcodebuild -scheme SwiftAST warning: invalid duplicate target dependency declaration 'swift-build' in target 'FunctionalPerformanceTests' warning: invalid duplicate target dependency declaration 'swift-package' in target 'FunctionalPerformanceTests' Reading project settings... Building dependencies... Parsing... failed to run the following command: '/usr/bin/xcrun swift -frontend -suppress-warnings -dump-ast -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -F /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/../../../Developer/Library/Frameworks -target x86_64-apple-macosx10.10 -I /Users/norio/Library/Developer/Xcode/DerivedData/SwiftAST-gglvpwfxcdqcbehkwkywmelahzns/Build/Products/Debug -F /Users/norio/Library/Developer/Xcode/DerivedData/SwiftAST-gglvpwfxcdqcbehkwkywmelahzns/Build/Products/Debug -F /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks -primary-file /Users/norio/github/SwiftAST/Sources/SwiftAST/main.swift /Users/norio/github/SwiftAST/Sources/SwiftAST/Errors.swift /Users/norio/github/SwiftAST/Sources/SwiftAST/ParseTool.swift /Users/norio/github/SwiftAST/Sources/SwiftAST/SwiftASTTool.swift /Users/norio/github/SwiftAST/Sources/SwiftAST/SwiftBuildTool.swift /Users/norio/github/SwiftAST/Sources/SwiftAST/XcodebuildTool.swift' output: <unknown>:0: error: missing required module 'clibc'
swiftc
パラメータの構築をやっていて、 swiftc
へ渡されるパラメータを取得DerivedData
内に作成するllbuildマニフェストから取得debug.yml
から取得llbuildSwift
とか使えるのかな? https://github.com/jpsim/SourceKitten/blob/67b93b83bafa83306fbb9dd201d4dfd22661a53a/Source/SourceKittenFramework/Xcode.swift#L287-L322Cloning 'sourcekit-lsp' Cloning 'libcxx' Cloning 'indexstore-db' Cloning 'swift-stress-tester' Cloning 'swift-syntax' Cloning 'clang-tools-extra'
def CC_X86_64_C : CallingConv<[ // Pass SwiftSelf in a callee saved register. CCIfSwiftSelf<CCIfType<[i64], CCAssignToReg<[R13]>>>, // A SwiftError is passed in R12. CCIfSwiftError<CCIfType<[i64], CCAssignToReg<[R12]>>>,
// build/Xcode-DebugAssert/llvm-macosx-x86_64/lib/Target/X86/X86GenCallingConv.inc static bool CC_X86_64_C(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, CCState &State) { if (ArgFlags.isSwiftSelf()) { if (LocVT == MVT::i64) { if (unsigned Reg = State.AllocateReg(X86::R13)) { State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); return false; } } } if (ArgFlags.isSwiftError()) { if (LocVT == MVT::i64) { if (unsigned Reg = State.AllocateReg(X86::R12)) { State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); return false; } } } }
SyntaxParseActions
を HiddenLibSyntaxAction
でラップする感じ。SyntaxParsingContext
だけでも最初は意味不明だしASTContext
とそこまでやってること違わない気はする。SyntaxParsingContext
-> Syntax Tree ASTContext
-> AST objectsSyntaxParsingContext
と ASTContext
への値注入を同じ場所でやってるのが今回のモチベーションのはず1 + 2 * 3
みたいな式が演算子の優先度関係なくフラットになっちゃってるんだけど、これを階層付けするのってparserで解析したoperator precedenceだけでできるから、parserのlibASTで組み替えてるのかな?var body: some view {}
をSwiftSyntaxに渡すと意図してないようなシンタックスで返ってきます。たぶんswiftc側の修正が必要? some view
が someView
になってしまう。 ▿ typeAnnotation : Optional<TypeAnnotationSyntax> ▿ some : SwiftSyntax.TypeAnnotationSyntax ▿ colon : SwiftSyntax.TokenSyntax - text : ":" ▿ leadingTrivia : Trivia - pieces : 0 elements ▿ trailingTrivia : Trivia ▿ pieces : 1 element ▿ 0 : TriviaPiece - spaces : 1 - tokenKind : SwiftSyntax.TokenKind.colon ▿ type : SwiftSyntax.SimpleTypeIdentifierSyntax ▿ name : SwiftSyntax.TokenSyntax - text : "someView" ▿ leadingTrivia : Trivia - pieces : 0 elements ▿ trailingTrivia : Trivia ▿ pieces : 1 element ▿ 0 : TriviaPiece - spaces : 1 ▿ tokenKind : TokenKind - identifier : "someView" - genericArgumentClause : nil - initializer : nil
SomeTypeSyntax
になってるのを確認しました。+
とか-
。 そもそもlexerではそこまで判定する必要ないのかな https://github.com/apple/swift/blob/master/utils/gyb_syntax_support/Token.py (edited)Qol
ってなんだろうIn file included from /Users/omochi/work/swift-source/llvm/include/llvm/ADT/STLExtras.h:20: /Users/omochi/work/swift-source/llvm/include/llvm/ADT/Optional.h:141:3: error: unknown type name 'constexpr' constexpr Optional() {} ^ /Users/omochi/work/swift-source/llvm/include/llvm/ADT/Optional.h:141:13: error: constructor cannot have a return type constexpr Optional() {} ^~~~~~~~
$ brew upgrade cmake
で解決しました。-- The C compiler identification is unknown -- The CXX compiler identification is unknown
↑こんなメッセージが出ていた-std=c+11
が追加されてるわ。CMake Error in cmake/modules/CMakeLists.txt: export called with target "swiftSwiftLang-macosx-x86_64" which requires target "sourcekitd" that is not in any export set.
(edited)1.7G ./Ninja-ReleaseAssert/swift-linux-x86_64 3.9M ./Ninja-ReleaseAssert/cmark-linux-x86_64 2.2G ./Ninja-ReleaseAssert/llvm-linux-x86_64 3.9G ./Ninja-ReleaseAssert 27G ./Ninja-DebugAssert/swift-linux-x86_64 5.1M ./Ninja-DebugAssert/cmark-linux-x86_64 42G ./Ninja-DebugAssert/llvm-linux-x86_64 68G ./Ninja-DebugAssert
-###
って何の機能ですかclang
にはそのオプションがあるみたいですね。 $ clang -help OVERVIEW: clang LLVM compiler USAGE: clang [options] file... OPTIONS: -### Print (but do not run) the commands to run for this compilation
swift/utils/update-checkout
で取得できるリポジトリ達を置くディレクトリ全体で検索するのがポイントですかね。 (edited)swift/utils/update-checkout
はLLVM monorepo transitionを自動で処理してくれるのかな? https://forums.swift.org/t/llvm-monorepo-transition-happening-on-thursday-the-17th-of-october/29674llvm-project
をクローンしてclang
, clang-tools-extra
, compiler-rt
, libcxx
, lldb
, llvm
を削除してからswift/utils/update-checkout --scheme master
を実行したら、削除したモノ達と同名のシンボリックリンク達が作られた。 (edited)utils/update-checkout --scheme master
したらシンボリックリンクが作られたと記憶。 (edited)./clang -> /Users/norio/github/swift-dev/llvm-project/clang ./clang-tools-extra -> /Users/norio/github/swift-dev/llvm-project/clang-tools-extra ./compiler-rt -> /Users/norio/github/swift-dev/llvm-project/compiler-rt ./libcxx -> /Users/norio/github/swift-dev/llvm-project/libcxx ./lldb -> /Users/norio/github/swift-dev/llvm-project/lldb ./llvm -> /Users/norio/github/swift-dev/llvm-project/llvm
swift/utils/update_checkout/update_checkout/update_checkout.py
はsymlink作る処理入ってない。 (edited)--scheme master
だとその処理に行く前に、--tag swift-5.1.2-RELEASE
?(cd swift; git checkout swift-5.1.2-RELEASE)
swift/utils/update-checkout --tag swift-5.1.2-RELEASE
で良いのでは。swift-5.1.2-RELEASE
はswift-5.1-branch
からではなくswift-5.1-branch-08-28-2019
から作られたのだろう。swift-5.1-branch
に入ってて、swift-5.1.2-RELEASE
に入ってない変更たくさんある。 https://github.com/apple/swift/compare/swift-5.1.2-RELEASE...swift-5.1-branch[5.1]
ってつけて別PRなんですね。swift-5.1.2-RELEASE
タグ、付け直されてる… https://github.com/apple/swift/commits/swift-5.1.2-RELEASEswift-5.1.2-RELEASE
までと違い、swift-5.1.3-RELEASE
は ちゃんとswift-5.1-branch
から作られてた。 https://github.com/apple/swift/compare/swift-5.1-branch...swift-5.1.3-RELEASEswiftc
コマンドにソースファイルを引数として与える場合に、 トップレベルに実行文が書けるモードになるのって、 「引数が1ファイルの場合」または「ファイル名がmain.swift」 っぽく読めるんですけど、そうなん? (edited)__start_<section>
と __stop_<section>
というシンボルを生成する。__attribute__((__constructor__))
を付けた関数を定義しておくことで、 イメージがロードされた時にこれが呼び出され・・・ (edited)#define DECLARE_SWIFT_SECTION(name) \ __asm__("\t.section " #name ",\"a\"\n"); \ __attribute__((__visibility__("hidden"),__aligned__(1))) extern const char __start_##name; \ __attribute__((__visibility__("hidden"),__aligned__(1))) extern const char __stop_##name; extern "C" { DECLARE_SWIFT_SECTION(swift5_protocols)
__start_section
と __stop_section
のシンボルをリンクさせて・・・ (edited)#define SWIFT_SECTION_RANGE(name) \ { reinterpret_cast<uintptr_t>(&__start_##name), \ static_cast<uintptr_t>(&__stop_##name - &__start_##name) } ... SWIFT_SECTION_RANGE(swift5_protocols),
__start
__stop
はLLVMが出力するんじゃなくて lldが全てのオブジェクトファイルをリンクするときに作りますnamespace { static const swift::MetadataSections *registered = nullptr; void record(const swift::MetadataSections *sections) { if (registered == nullptr) { registered = sections; sections->next = sections->prev = sections; } else { registered->prev->next = sections; sections->next = registered; sections->prev = registered->prev; registered->prev = sections; } } }
これでリンクリストに追加してた。 (edited)swift::MetadataSections * swift::(anon ns)::registered
が __attribute__((__visibility__("hidden"),__aligned__(1))) extern const char __start_##name;
swift_image_constructor
は同じobjectの中だからこれが見えて、スタートシンボルが取れて、その場でグローバルに登録しちゃうけど