forked from OSchip/llvm-project
[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 llvm-svn: 369715
This commit is contained in:
parent
d6c1c7bfb6
commit
d24184591f
|
@ -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;
|
||||
|
|
|
@ -92,6 +92,7 @@ enum ActionKind {
|
|||
/// Generate Interface Stub Files.
|
||||
GenerateInterfaceYAMLExpV1,
|
||||
GenerateInterfaceTBEExpV1,
|
||||
GenerateInterfaceIfsExpV1,
|
||||
|
||||
/// Only execute frontend initialization.
|
||||
InitOnly,
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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>();
|
||||
|
|
Loading…
Reference in New Issue