r369715 - [clang][ifs] New interface stubs format (llvm triple based).

Puyan Lotfi via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 22 16:29:22 PDT 2019


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>();




More information about the cfe-commits mailing list