aboutsummaryrefslogtreecommitdiff
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Frontend/FrontendActions.h6
-rw-r--r--clang/include/clang/Frontend/FrontendOptions.h1
-rw-r--r--clang/lib/Driver/ToolChains/Clang.cpp2
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp4
-rw-r--r--clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp53
-rw-r--r--clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp2
6 files changed, 68 insertions, 0 deletions
diff --git a/clang/include/clang/Frontend/FrontendActions.h b/clang/include/clang/Frontend/FrontendActions.h
index 6c7bc60..911d820 100644
--- a/clang/include/clang/Frontend/FrontendActions.h
+++ b/clang/include/clang/Frontend/FrontendActions.h
@@ -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;
diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h
index d9d961c..adee473 100644
--- a/clang/include/clang/Frontend/FrontendOptions.h
+++ b/clang/include/clang/Frontend/FrontendOptions.h
@@ -92,6 +92,7 @@ enum ActionKind {
/// Generate Interface Stub Files.
GenerateInterfaceYAMLExpV1,
GenerateInterfaceTBEExpV1,
+ GenerateInterfaceIfsExpV1,
/// Only execute frontend initialization.
InitOnly,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 690d4fa..7e420da 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -3638,12 +3638,14 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
: "")
.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");
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index 66684e5..c0539cd 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -1737,11 +1737,14 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
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(frontend::ActionKind Action) {
case frontend::GeneratePCH:
case frontend::GenerateInterfaceYAMLExpV1:
case frontend::GenerateInterfaceTBEExpV1:
+ case frontend::GenerateInterfaceIfsExpV1:
case frontend::ParseSyntaxOnly:
case frontend::ModuleFileInfo:
case frontend::VerifyPCH:
diff --git a/clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp b/clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp
index 970f885..cb597c4 100644
--- a/clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp
+++ b/clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp
@@ -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::CreateASTConsumer(CompilerInstance &CI,
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");
+}
diff --git a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
index 9cbfe70..f966750 100644
--- a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
+++ b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
@@ -68,6 +68,8 @@ CreateFrontendBaseAction(CompilerInstance &CI) {
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>();