Author: zer0 Date: Thu Aug 22 16:29:22 2019 New Revision: 369715 URL: http://llvm.org/viewvc/llvm-project?rev=369715&view=rev Log: [clang][ifs] New interface stubs format (llvm triple based).
After posting llvm-ifs on phabricator, I made some progress in hardening up how I think the format for Interface Stubs should look. There are a number of things I think the TBE format was missing (no endianness, no info about the Object Format because it assumes ELF), so I have added those and broken off from being as similar to the TBE schema. In a subsequent commit I can drop the other formats. An example of how The format will look is as follows: --- !experimental-ifs-v1 IfsVersion: 1.0 Triple: x86_64-unknown-linux-gnu ObjectFileFormat: ELF Symbols: _Z9nothiddenv: { Type: Func } _Z10cmdVisiblev: { Type: Func } ... The format is still marked experimental. Differential Revision: https://reviews.llvm.org/D66446 Modified: cfe/trunk/include/clang/Frontend/FrontendActions.h cfe/trunk/include/clang/Frontend/FrontendOptions.h cfe/trunk/lib/Driver/ToolChains/Clang.cpp cfe/trunk/lib/Frontend/CompilerInvocation.cpp cfe/trunk/lib/Frontend/InterfaceStubFunctionsConsumer.cpp cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp Modified: cfe/trunk/include/clang/Frontend/FrontendActions.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendActions.h?rev=369715&r1=369714&r2=369715&view=diff ============================================================================== --- cfe/trunk/include/clang/Frontend/FrontendActions.h (original) +++ cfe/trunk/include/clang/Frontend/FrontendActions.h Thu Aug 22 16:29:22 2019 @@ -139,6 +139,12 @@ protected: StringRef InFile) override; }; +class GenerateInterfaceIfsExpV1Action : public GenerateInterfaceStubAction { +protected: + std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, + StringRef InFile) override; +}; + class GenerateModuleFromModuleMapAction : public GenerateModuleAction { private: bool BeginSourceFileAction(CompilerInstance &CI) override; Modified: cfe/trunk/include/clang/Frontend/FrontendOptions.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendOptions.h?rev=369715&r1=369714&r2=369715&view=diff ============================================================================== --- cfe/trunk/include/clang/Frontend/FrontendOptions.h (original) +++ cfe/trunk/include/clang/Frontend/FrontendOptions.h Thu Aug 22 16:29:22 2019 @@ -92,6 +92,7 @@ enum ActionKind { /// Generate Interface Stub Files. GenerateInterfaceYAMLExpV1, GenerateInterfaceTBEExpV1, + GenerateInterfaceIfsExpV1, /// Only execute frontend initialization. InitOnly, Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=369715&r1=369714&r2=369715&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Thu Aug 22 16:29:22 2019 @@ -3638,12 +3638,14 @@ void Clang::ConstructJob(Compilation &C, : "") .Case("experimental-yaml-elf-v1", "experimental-yaml-elf-v1") .Case("experimental-tapi-elf-v1", "experimental-tapi-elf-v1") + .Case("experimental-ifs-v1", "experimental-ifs-v1") .Default(""); if (StubFormat.empty()) D.Diag(diag::err_drv_invalid_value) << "Must specify a valid interface stub format type using " << "-interface-stub-version=<experimental-tapi-elf-v1 | " + "experimental-ifs-v1 | " "experimental-yaml-elf-v1>"; CmdArgs.push_back("-emit-interface-stubs"); Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=369715&r1=369714&r2=369715&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Thu Aug 22 16:29:22 2019 @@ -1737,11 +1737,14 @@ static InputKind ParseFrontendArgs(Front frontend::GenerateInterfaceYAMLExpV1) .Case("experimental-tapi-elf-v1", frontend::GenerateInterfaceTBEExpV1) + .Case("experimental-ifs-v1", + frontend::GenerateInterfaceIfsExpV1) .Default(llvm::None); if (!ProgramAction) Diags.Report(diag::err_drv_invalid_value) << "Must specify a valid interface stub format type using " << "-interface-stub-version=<experimental-tapi-elf-v1 | " + "experimental-ifs-v1 | " "experimental-yaml-elf-v1>"; Opts.ProgramAction = *ProgramAction; break; @@ -3185,6 +3188,7 @@ static bool isStrictlyPreprocessorAction case frontend::GeneratePCH: case frontend::GenerateInterfaceYAMLExpV1: case frontend::GenerateInterfaceTBEExpV1: + case frontend::GenerateInterfaceIfsExpV1: case frontend::ParseSyntaxOnly: case frontend::ModuleFileInfo: case frontend::VerifyPCH: Modified: cfe/trunk/lib/Frontend/InterfaceStubFunctionsConsumer.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InterfaceStubFunctionsConsumer.cpp?rev=369715&r1=369714&r2=369715&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/InterfaceStubFunctionsConsumer.cpp (original) +++ cfe/trunk/lib/Frontend/InterfaceStubFunctionsConsumer.cpp Thu Aug 22 16:29:22 2019 @@ -354,9 +354,55 @@ public: OS.flush(); }; + auto writeIfsV1 = + [this](const llvm::Triple &T, const MangledSymbols &Symbols, + const ASTContext &context, StringRef Format, + raw_ostream &OS) -> void { + OS << "--- !" << Format << "\n"; + OS << "IfsVersion: 1.0\n"; + OS << "Triple: " << T.str() << "\n"; + OS << "ObjectFileFormat: " << "ELF" << "\n"; // TODO: For now, just ELF. + OS << "Symbols:\n"; + for (const auto &E : Symbols) { + const MangledSymbol &Symbol = E.second; + for (auto Name : Symbol.Names) { + OS << " " + << (Symbol.ParentName.empty() || Instance.getLangOpts().CPlusPlus + ? "" + : (Symbol.ParentName + ".")) + << Name << ": { Type: "; + switch (Symbol.Type) { + default: + llvm_unreachable( + "clang -emit-iterface-stubs: Unexpected symbol type."); + case llvm::ELF::STT_NOTYPE: + OS << "NoType"; + break; + case llvm::ELF::STT_OBJECT: { + auto VD = cast<ValueDecl>(E.first)->getType(); + OS << "Object, Size: " + << context.getTypeSizeInChars(VD).getQuantity(); + break; + } + case llvm::ELF::STT_FUNC: + OS << "Func"; + break; + } + if (Symbol.Binding == llvm::ELF::STB_WEAK) + OS << ", Weak: true"; + OS << " }\n"; + } + } + OS << "...\n"; + OS.flush(); + }; + if (Format == "experimental-yaml-elf-v1") writeIfoYaml(Instance.getTarget().getTriple(), Symbols, context, Format, *OS); + else if (Format == "experimental-ifs-v1") + writeIfsV1(Instance.getTarget().getTriple(), Symbols, context, Format, + *OS); else writeIfoElfAbiYaml(Instance.getTarget().getTriple(), Symbols, context, Format, *OS); @@ -376,3 +422,10 @@ GenerateInterfaceTBEExpV1Action::CreateA return std::make_unique<InterfaceStubFunctionsConsumer>( CI, InFile, "experimental-tapi-elf-v1"); } + +std::unique_ptr<ASTConsumer> +GenerateInterfaceIfsExpV1Action::CreateASTConsumer(CompilerInstance &CI, + StringRef InFile) { + return std::make_unique<InterfaceStubFunctionsConsumer>( + CI, InFile, "experimental-ifs-v1"); +} Modified: cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp?rev=369715&r1=369714&r2=369715&view=diff ============================================================================== --- cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp (original) +++ cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp Thu Aug 22 16:29:22 2019 @@ -68,6 +68,8 @@ CreateFrontendBaseAction(CompilerInstanc return std::make_unique<GenerateInterfaceYAMLExpV1Action>(); case GenerateInterfaceTBEExpV1: return std::make_unique<GenerateInterfaceTBEExpV1Action>(); + case GenerateInterfaceIfsExpV1: + return std::make_unique<GenerateInterfaceIfsExpV1Action>(); case InitOnly: return std::make_unique<InitOnlyAction>(); case ParseSyntaxOnly: return std::make_unique<SyntaxOnlyAction>(); case ModuleFileInfo: return std::make_unique<DumpModuleInfoAction>(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits