include/swift/ClangImporter コードリーディング(全体)

概要

swift/include/swift/ClangImporter at 4b727e5813246d4029e7c4269bba317db9b012d3 · apple/swift · GitHub

BuiltinMappedTypes.def

ClangImporter.h

SWIFT_MAX_IMPORTED_SIMD_ELEMENTS

= 4

importしようとしているSIMDベクトル要素の最大数

ClangTypeKind

clang :: Sema :: LookupKindの簡略版定義

definition desc
Typedef
ObjCClass
Tag /// Structs, enums, and unions.
ObjCProtocol

ClangImporter

super class

ClangModuleLoader

friend class

ClangModuleUnit

create

ClangImporter.cpp - ClangImporter::create

 static std::unique_ptr<ClangImporter>
 create(ASTContext &ctx,
        const ClangImporterOptions &importerOpts,
        std::string swiftPCHHash = "",
        DependencyTracker *tracker = nullptr);

指定されたASTContextに適切なClangモジュールをimportできる新しいClangImporterを作成する

params

  • ctx
    • モジュールをimportする対象のASTContext
    • ASTContextのSearchPathOptionsはClangImporterに使用される
  • importerOpts
    • ClangImporterに使用するオプション
  • swiftPCHHash
    • hashはコンパイラの呼び出しによって要求された場合に一意のBridging PCHを作成するために使用される
  • tracker

returns

  • 新しいClangモジュールのimporterを返す
  • エラーが発生した場合はnull(診断あり)を返す

createDependencyCollector

ClangImporterDependencyCollector

ClangImporterの特定の用途に合わせてカスタマイズされた新しいclang::DependencyCollectorを作成する

static std::shared_ptr<clang::DependencyCollector>
createDependencyCollector();

canImportModule

指定した名前のモジュールをimportingしなくてもimportできるかどうか確認する

このチェックが成功したとしてもモジュールが一杯に読み込まれてた場合はエラーが発生する可能性があることに注意

virtual bool canImportModule(std::pair<Identifier, SourceLoc> named) override;

loadModule

指定したモジュールパスを持つモジュールをimportする

ClangモジュールはObjective-C ARCの方言を使用してimportされ、全ての警告は無効になる

virtual ModuleDecl *loadModule(
                      SourceLoc importLoc,
                      ArrayRef<std::pair<Identifier, SourceLoc>> path)
                    override;

lookupValue

与えられた名前に関する宣言を検索する

void lookupValue(DeclName name, VisibleDeclConsumer &consumer);

lookupTypeDecl

型宣言をClangの名前で検索する

void lookupTypeDecl(StringRef clangName, ClangTypeKind kind,
                    llvm::function_ref<void(TypeDecl*)> receiver);

lookupRelatedEntity

related entity kindを使用してClangImporter自体によって合成された宣言を検索し、どの型にするかを決定する

例えば、NS_ERROR_ENUMの合成エラー構造体を見つけるのに使用できる

void lookupRelatedEntity(StringRef clangName, ClangTypeKind kind,
                         StringRef relatedEntityKind,
                         llvm::function_ref<void(TypeDecl*)> receiver);

lookupBridgingHeaderDecls

BridgingHeaderからのテキスト付きの宣言を検索する

void lookupBridgingHeaderDecls(llvm::function_ref<bool(ClangNode)> filter,
                              llvm::function_ref<void(Decl*)> receiver) const;

lookupDeclsFromHeader

特定のヘッダーからの宣言を検索する

ヘッダーはClangモジュールの一部であってもよいし、BridgingHeaderから含まれても良い

bool lookupDeclsFromHeader(StringRef filename,
                           llvm::function_ref<bool(ClangNode)> filter,
                           llvm::function_ref<void(Decl*)> receiver) const;

loadExtensions

与えられたnominal typeにextensionをロードする

void loadExtensions(NominalTypeDecl *nominal, unsigned previousGeneration);

loadObjCMethods

  • classDecl
  • selector
  • isInstanceMethod
  • previousGeneration
  • methods
virtual void loadObjCMethods(
               ClassDecl *classDecl,
               ObjCSelector selector,
               bool isInstanceMethod,
               unsigned previousGeneration,
               llvm::TinyPtrVector<AbstractFunctionDecl *> &methods) override;

addSearchPath

存在してない場合に限り、SearchPathOptsに検索パスを追加する

全てのModuleLoaderを最新の状態に保つための適切な記録を行う

void addSearchPath(StringRef searchPath, bool isFramework, bool isSystem);

importHeader

Objective-Cヘッダーファイルを共有importされたヘッダーのモジュールにimportする

bool importHeader(StringRef header, ModuleDecl *adapter, off_t expectedSize,
                  time_t expectedModTime, StringRef cachedContents,
                  SourceLoc diagLoc);

importBridgingHeader

Objective-Cヘッダーファイルを共有importされたヘッダーのモジュールにimportする

bool importBridgingHeader(StringRef header, ModuleDecl *adapter,
                          SourceLoc diagLoc = {},
                          bool trackParsedSymbols = false,
                          bool implicitImport = false);

getImportedHeaderModule

読み込まれた全てのObjective-Cヘッダーファイルからのimportと宣言を含むモジュールを返す

ModuleDecl *getImportedHeaderModule() const override;

getBridgingHeaderContents

emitBridgingPCH

ClangImporterのCompileInstanceの一時的なレプリカを作成し、Objective-Cヘッダーファイルをレプリカに読み込み、その内容のPCHファイルを出力する。

bool emitBridgingPCH(StringRef headerPath,
                     StringRef outputPCHPath);

canReadPCH

現在のオプションが存在すると仮定して、CompilerInstanceがPCHで正常に読み込める場合はtrueを返す

これはあとで再利用するためにPCHを保持する必要があるかどうかを調べるために使用できる

bool canReadPCH(StringRef PCHFilename);

ClangImporterOptions.h

ClangImporterOptions

ModuleCachePath

ClangImporterが使用するモジュールのキャッシュパス

std::string ModuleCachePath;

ExtraArgs

ClangImporterに渡すべき余分な引数群

std::vector<std::string> ExtraArgs;

OverrideResourceDir

Clangのリソースディレクトリを上書きするためのディレクト

std::string OverrideResourceDir;

TargetCPU

コンパイル対象のCPU

Clangの -mcpu と同等

例えば、-mcpu=cortex-a53、-mcpu=cortex-a57、-mcpu=cortex-a15

std::string IndexStorePath;

IndexStorePath

indexを格納する必要がある場合のパス

std::string IndexStorePath;

BridgingHeader

importされるbridging header、またはPCH

std::string BridgingHeader;

PrecompiledHeaderOutputDir

bridging headerからプリコンパイル済みのヘッダーを自動生成する場合の指定ディレクト

std::string PrecompiledHeaderOutputDir;

Optimization

最適化の設定、通常のimportに関して問題はないがClang IRの生成に影響を与える

std::string Optimization;

PCHDisableValidation

永続的なPCHの検証を無効にする

std::string Optimization;

Modes

definition desc
Normal モジュールをSwiftにimportし、SwiftのコードからIRを生成するためのClangを設定
EmbedBitcode バックエンドのコンパイル用にのみClangを設定

Mode

Clangの初期設定モード、Normalを指定

Modes Mode = Modes::Normal;

DetailedPreprocessingRecord

設定すると、インポート時に多くの情報が保持される

また、オブジェクトファイルの生成にのみ必要な情報は無効にする

bool DetailedPreprocessingRecord = false;

DumpClangDiagnostics

trueの場合、Clangの診断用プリンタを用いてstderrにダンプされSwiftの診断エンジンに渡される

bool DumpClangDiagnostics = false;

ImportForwardDeclarations

trueの場合、前方宣言は可能であれば完全に削除される代わりに使用できない型をimportする

bool ImportForwardDeclarations = false;

InferImportAsMember

メンバの推論システムとしてimportするかどうか

When importing a global, try to infer whether we can import it as a member of some type instead. This includes inits, computed properties, and methods.

bool InferImportAsMember = false;

DisableSwiftBridgeAttr

/// If true ignore the swift bridged attribute.

bool DisableSwiftBridgeAttr = false;

/// When set, don't validate module system headers. If a header is modified /// and this is not set, clang will rebuild the module. bool DisableModulesValidateSystemHeaders = false;

/// When set, don't look for or load adapter modules. bool DisableAdapterModules = false;

/// When set, don't enforce warnings with -Werror. bool DebuggerSupport = false;

ClangModule.h

SIMDMappedTypes.def