Skip to content

Commit

Permalink
[clang][ifs] Dropping older experimental interface stub formats.
Browse files Browse the repository at this point in the history
I've been working on a new tool, llvm-ifs, for merging interface stub files
generated by clang and I've iterated on my derivative format of TBE to a newer
format. llvm-ifs will only support the new format, so I am going to drop the
older experimental interface stubs formats in this commit to make things
simpler.

Differential Revision: https://reviews.llvm.org/D66573

llvm-svn: 369719
  • Loading branch information
plotfi committed Aug 22, 2019
1 parent 83f5333 commit 926f4f7
Show file tree
Hide file tree
Showing 17 changed files with 104 additions and 227 deletions.
13 changes: 0 additions & 13 deletions clang/include/clang/Frontend/FrontendActions.h
Expand Up @@ -126,19 +126,6 @@ class GenerateInterfaceStubAction : public ASTFrontendAction {
bool hasASTFileSupport() const override { return false; }
};

// Support different interface stub formats this way:
class GenerateInterfaceYAMLExpV1Action : public GenerateInterfaceStubAction {
protected:
std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
StringRef InFile) override;
};

class GenerateInterfaceTBEExpV1Action : public GenerateInterfaceStubAction {
protected:
std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
StringRef InFile) override;
};

class GenerateInterfaceIfsExpV1Action : public GenerateInterfaceStubAction {
protected:
std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
Expand Down
2 changes: 0 additions & 2 deletions clang/include/clang/Frontend/FrontendOptions.h
Expand Up @@ -90,8 +90,6 @@ enum ActionKind {
GeneratePCH,

/// Generate Interface Stub Files.
GenerateInterfaceYAMLExpV1,
GenerateInterfaceTBEExpV1,
GenerateInterfaceIfsExpV1,

/// Only execute frontend initialization.
Expand Down
27 changes: 16 additions & 11 deletions clang/lib/Driver/ToolChains/Clang.cpp
Expand Up @@ -3631,22 +3631,27 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
JA.getType() == types::TY_LTO_BC) {
CmdArgs.push_back("-emit-llvm-bc");
} else if (JA.getType() == types::TY_IFS) {
StringRef ArgStr =
Args.hasArg(options::OPT_iterface_stub_version_EQ)
? Args.getLastArgValue(options::OPT_iterface_stub_version_EQ)
: "";
StringRef StubFormat =
llvm::StringSwitch<StringRef>(
Args.hasArg(options::OPT_iterface_stub_version_EQ)
? Args.getLastArgValue(options::OPT_iterface_stub_version_EQ)
: "")
.Case("experimental-yaml-elf-v1", "experimental-yaml-elf-v1")
.Case("experimental-tapi-elf-v1", "experimental-tapi-elf-v1")
llvm::StringSwitch<StringRef>(ArgStr)
.Case("experimental-ifs-v1", "experimental-ifs-v1")
.Default("");

if (StubFormat.empty())
if (StubFormat.empty()) {
std::string ErrorMessage =
"Invalid interface stub format: " + ArgStr.str() +
((ArgStr == "experimental-yaml-elf-v1" ||
ArgStr == "experimental-tapi-elf-v1")
? " is deprecated."
: ".");
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>";
<< "Must specify a valid interface stub format type, ie: "
"-interface-stub-version=experimental-ifs-v1"
<< ErrorMessage;
}

CmdArgs.push_back("-emit-interface-stubs");
CmdArgs.push_back(
Expand Down
37 changes: 19 additions & 18 deletions clang/lib/Frontend/CompilerInvocation.cpp
Expand Up @@ -1728,25 +1728,28 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
case OPT_emit_pch:
Opts.ProgramAction = frontend::GeneratePCH; break;
case OPT_emit_iterface_stubs: {
StringRef ArgStr =
Args.hasArg(OPT_iterface_stub_version_EQ)
? Args.getLastArgValue(OPT_iterface_stub_version_EQ)
: "";
llvm::Optional<frontend::ActionKind> ProgramAction =
llvm::StringSwitch<llvm::Optional<frontend::ActionKind>>(
Args.hasArg(OPT_iterface_stub_version_EQ)
? Args.getLastArgValue(OPT_iterface_stub_version_EQ)
: "")
.Case("experimental-yaml-elf-v1",
frontend::GenerateInterfaceYAMLExpV1)
.Case("experimental-tapi-elf-v1",
frontend::GenerateInterfaceTBEExpV1)
.Case("experimental-ifs-v1",
frontend::GenerateInterfaceIfsExpV1)
llvm::StringSwitch<llvm::Optional<frontend::ActionKind>>(ArgStr)
.Case("experimental-ifs-v1", frontend::GenerateInterfaceIfsExpV1)
.Default(llvm::None);
if (!ProgramAction)
if (!ProgramAction) {
std::string ErrorMessage =
"Invalid interface stub format: " + ArgStr.str() +
((ArgStr == "experimental-yaml-elf-v1" ||
ArgStr == "experimental-tapi-elf-v1")
? " is deprecated."
: ".");
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;
<< "Must specify a valid interface stub format type, ie: "
"-interface-stub-version=experimental-ifs-v1"
<< ErrorMessage;
} else {
Opts.ProgramAction = *ProgramAction;
}
break;
}
case OPT_init_only:
Expand Down Expand Up @@ -3186,8 +3189,6 @@ static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) {
case frontend::GenerateModuleInterface:
case frontend::GenerateHeaderModule:
case frontend::GeneratePCH:
case frontend::GenerateInterfaceYAMLExpV1:
case frontend::GenerateInterfaceTBEExpV1:
case frontend::GenerateInterfaceIfsExpV1:
case frontend::ParseSyntaxOnly:
case frontend::ModuleFileInfo:
Expand Down
133 changes: 2 additions & 131 deletions clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp
Expand Up @@ -246,114 +246,6 @@ class InterfaceStubFunctionsConsumer : public ASTConsumer {
for (const NamedDecl *ND : v.NamedDecls)
HandleNamedDecl(ND, Symbols, FromTU);

auto writeIfoYaml = [this](const llvm::Triple &T,
const MangledSymbols &Symbols,
const ASTContext &context, StringRef Format,
raw_ostream &OS) -> void {
OS << "--- !" << Format << "\n";
OS << "FileHeader:\n";
OS << " Class: ELFCLASS";
OS << (T.isArch64Bit() ? "64" : "32");
OS << "\n";
OS << " Data: ELFDATA2";
OS << (T.isLittleEndian() ? "LSB" : "MSB");
OS << "\n";
OS << " Type: ET_REL\n";
OS << " Machine: "
<< llvm::StringSwitch<llvm::StringRef>(T.getArchName())
.Case("x86_64", "EM_X86_64")
.Case("i386", "EM_386")
.Case("i686", "EM_386")
.Case("aarch64", "EM_AARCH64")
.Case("amdgcn", "EM_AMDGPU")
.Case("r600", "EM_AMDGPU")
.Case("arm", "EM_ARM")
.Case("thumb", "EM_ARM")
.Case("avr", "EM_AVR")
.Case("mips", "EM_MIPS")
.Case("mipsel", "EM_MIPS")
.Case("mips64", "EM_MIPS")
.Case("mips64el", "EM_MIPS")
.Case("msp430", "EM_MSP430")
.Case("ppc", "EM_PPC")
.Case("ppc64", "EM_PPC64")
.Case("ppc64le", "EM_PPC64")
.Case("x86", T.isOSIAMCU() ? "EM_IAMCU" : "EM_386")
.Case("x86_64", "EM_X86_64")
.Default("EM_NONE")
<< "\nSymbols:\n";
for (const auto &E : Symbols) {
const MangledSymbol &Symbol = E.second;
for (auto Name : Symbol.Names) {
OS << " - Name: "
<< (Symbol.ParentName.empty() || Instance.getLangOpts().CPlusPlus
? ""
: (Symbol.ParentName + "."))
<< Name << "\n"
<< " Type: STT_";
switch (Symbol.Type) {
default:
case llvm::ELF::STT_NOTYPE:
OS << "NOTYPE";
break;
case llvm::ELF::STT_OBJECT:
OS << "OBJECT";
break;
case llvm::ELF::STT_FUNC:
OS << "FUNC";
break;
}
OS << "\n Binding: STB_"
<< ((Symbol.Binding == llvm::ELF::STB_WEAK) ? "WEAK" : "GLOBAL")
<< "\n";
}
}
OS << "...\n";
OS.flush();
};

auto writeIfoElfAbiYaml =
[this](const llvm::Triple &T, const MangledSymbols &Symbols,
const ASTContext &context, StringRef Format,
raw_ostream &OS) -> void {
OS << "--- !" << Format << "\n";
OS << "TbeVersion: 1.0\n";
OS << "Arch: " << T.getArchName() << "\n";
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();
};

auto writeIfsV1 =
[this](const llvm::Triple &T, const MangledSymbols &Symbols,
const ASTContext &context, StringRef Format,
Expand Down Expand Up @@ -397,32 +289,11 @@ class InterfaceStubFunctionsConsumer : public ASTConsumer {
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);
assert(Format == "experimental-ifs-v1" && "Unexpected IFS Format.");
writeIfsV1(Instance.getTarget().getTriple(), Symbols, context, Format, *OS);
}
};

std::unique_ptr<ASTConsumer>
GenerateInterfaceYAMLExpV1Action::CreateASTConsumer(CompilerInstance &CI,
StringRef InFile) {
return std::make_unique<InterfaceStubFunctionsConsumer>(
CI, InFile, "experimental-yaml-elf-v1");
}

std::unique_ptr<ASTConsumer>
GenerateInterfaceTBEExpV1Action::CreateASTConsumer(CompilerInstance &CI,
StringRef InFile) {
return std::make_unique<InterfaceStubFunctionsConsumer>(
CI, InFile, "experimental-tapi-elf-v1");
}

std::unique_ptr<ASTConsumer>
GenerateInterfaceIfsExpV1Action::CreateASTConsumer(CompilerInstance &CI,
StringRef InFile) {
Expand Down
4 changes: 0 additions & 4 deletions clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
Expand Up @@ -64,10 +64,6 @@ CreateFrontendBaseAction(CompilerInstance &CI) {
case GenerateHeaderModule:
return std::make_unique<GenerateHeaderModuleAction>();
case GeneratePCH: return std::make_unique<GeneratePCHAction>();
case GenerateInterfaceYAMLExpV1:
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>();
Expand Down
37 changes: 34 additions & 3 deletions clang/test/InterfaceStubs/bad-format.cpp
Expand Up @@ -2,7 +2,38 @@
// RUN: not %clang -target x86_64-linux-gnu -o - -emit-interface-stubs \
// RUN: -interface-stub-version=bar-format %s 2>&1 | FileCheck %s

// RUN: not %clang -target x86_64-linux-gnu -o - -emit-interface-stubs \
// RUN: -interface-stub-version=experimental-tapi-elf-v1 %s 2>&1 | \
// RUN: FileCheck -check-prefix=CHECK-TAPI-DEPRECATED %s

// RUN: not %clang -target x86_64-linux-gnu -o - -emit-interface-stubs \
// RUN: -interface-stub-version=experimental-yaml-elf-v1 %s 2>&1 | \
// RUN: FileCheck -check-prefix=CHECK-YAML-DEPRECATED %s

// RUN: not %clang_cc1 -target x86_64-linux-gnu -o - -emit-interface-stubs \
// RUN: -interface-stub-version=bar-format %s 2>&1 | FileCheck %s

// RUN: not %clang_cc1 -target x86_64-linux-gnu -o - -emit-interface-stubs \
// RUN: -interface-stub-version=experimental-tapi-elf-v1 %s 2>&1 | \
// RUN: FileCheck -check-prefix=CHECK-TAPI-DEPRECATED %s

// RUN: not %clang_cc1 -target x86_64-linux-gnu -o - -emit-interface-stubs \
// RUN: -interface-stub-version=experimental-yaml-elf-v1 %s 2>&1 | \
// RUN: FileCheck -check-prefix=CHECK-YAML-DEPRECATED %s

// CHECK: error: invalid value
// CHECK: '-interface-stub-version=<experimental-tapi-elf-v1 |
// CHECK: experimental-yaml-elf-v1>' in 'Must specify a valid interface
// CHECK: stub format type using
// CHECK: 'Invalid interface stub format: bar-format.' in 'Must specify a
// CHECK: valid interface stub format type, ie:
// CHECK: -interface-stub-version=experimental-ifs-v1'

// CHECK-TAPI-DEPRECATED: error: invalid value
// CHECK-TAPI-DEPRECATED: 'Invalid interface stub format:
// CHECK-TAPI-DEPRECATED: experimental-tapi-elf-v1 is deprecated.' in 'Must
// CHECK-TAPI-DEPRECATED: specify a valid interface stub format type, ie:
// CHECK-TAPI-DEPRECATED: -interface-stub-version=experimental-ifs-v1'

// CHECK-YAML-DEPRECATED: error: invalid value
// CHECK-YAML-DEPRECATED: 'Invalid interface stub format:
// CHECK-YAML-DEPRECATED: experimental-yaml-elf-v1 is deprecated.' in 'Must
// CHECK-YAML-DEPRECATED: specify a valid interface stub format type, ie:
// CHECK-YAML-DEPRECATED: -interface-stub-version=experimental-ifs-v1'
4 changes: 2 additions & 2 deletions clang/test/InterfaceStubs/class-template-specialization.cpp
@@ -1,10 +1,10 @@
// REQUIRES: x86-registered-target
// RUN: %clang -target x86_64-unknown-linux-gnu -o - -emit-interface-stubs \
// RUN: -interface-stub-version=experimental-tapi-elf-v1 %s | \
// RUN: -interface-stub-version=experimental-ifs-v1 %s | \
// RUN: FileCheck -check-prefix=CHECK-TAPI %s

// RUN: %clang -target x86_64-unknown-linux-gnu -o - -emit-interface-stubs \
// RUN: -interface-stub-version=experimental-tapi-elf-v1 %s | \
// RUN: -interface-stub-version=experimental-ifs-v1 %s | \
// RUN: FileCheck -check-prefix=CHECK-TAPI2 %s
// RUN: %clang -target x86_64-unknown-linux-gnu -o - -c %s | \
// RUN: llvm-readelf -s - 2>&1 | \
Expand Down
6 changes: 3 additions & 3 deletions clang/test/InterfaceStubs/externstatic.c
@@ -1,21 +1,21 @@
// REQUIRES: x86-registered-target
// RUN: %clang -DSTORAGE="extern" -target x86_64-unknown-linux-gnu -o - \
// RUN: -emit-interface-stubs \
// RUN: -interface-stub-version=experimental-yaml-elf-v1 -std=c99 -xc %s | \
// RUN: -interface-stub-version=experimental-ifs-v1 -std=c99 -xc %s | \
// RUN: FileCheck -check-prefix=CHECK-EXTERN %s
// RUN: %clang -DSTORAGE="extern" -target x86_64-linux-gnu -O0 -o - -c -std=c99 \
// RUN: -xc %s | llvm-nm - 2>&1 | FileCheck -check-prefix=CHECK-EXTERN %s

// RUN: %clang -DSTORAGE="extern" -target x86_64-unknown-linux-gnu -o - \
// RUN: -emit-interface-stubs \
// RUN: -interface-stub-version=experimental-yaml-elf-v1 -std=c99 -xc %s | \
// RUN: -interface-stub-version=experimental-ifs-v1 -std=c99 -xc %s | \
// RUN: FileCheck -check-prefix=CHECK-EXTERN2 %s
// RUN: %clang -DSTORAGE="extern" -target x86_64-linux-gnu -O0 -o - -c -std=c99 \
// RUN: -xc %s | llvm-nm - 2>&1 | FileCheck -check-prefix=CHECK-EXTERN2 %s

// RUN: %clang -DSTORAGE="static" -target x86_64-unknown-linux-gnu -o - \
// RUN: -emit-interface-stubs \
// RUN: -interface-stub-version=experimental-yaml-elf-v1 -std=c99 -xc %s | \
// RUN: -interface-stub-version=experimental-ifs-v1 -std=c99 -xc %s | \
// RUN: FileCheck -check-prefix=CHECK-STATIC %s
// RUN: %clang -DSTORAGE="static" -target x86_64-linux-gnu -O0 -o - -c -std=c99 \
// RUN: -xc %s | llvm-nm - 2>&1 | FileCheck -check-prefix=CHECK-STATIC %s
Expand Down
@@ -1,14 +1,14 @@
// REQUIRES: x86-registered-target
// RUN: %clang -target x86_64-unknown-linux-gnu -o - -emit-interface-stubs \
// RUN: -interface-stub-version=experimental-tapi-elf-v1 %s | FileCheck %s
// RUN: -interface-stub-version=experimental-ifs-v1 %s | FileCheck %s

// RUN: %clang -target x86_64-unknown-linux-gnu -o - -emit-interface-stubs \
// RUN: -interface-stub-version=experimental-tapi-elf-v1 \
// RUN: -interface-stub-version=experimental-ifs-v1 \
// RUN: -DUSE_TEMPLATE_FUNCTION=1 %s | \
// RUN: FileCheck -check-prefix=CHECK-USES-TEMPLATE-FUNCTION %s

// RUN: %clang -target x86_64-unknown-linux-gnu -o - -emit-interface-stubs \
// RUN: -interface-stub-version=experimental-tapi-elf-v1 \
// RUN: -interface-stub-version=experimental-ifs-v1 \
// RUN: -DSPECIALIZE_TEMPLATE_FUNCTION=1 %s | \
// RUN: FileCheck -check-prefix=CHECK-SPECIALIZES-TEMPLATE-FUNCTION %s

Expand Down

0 comments on commit 926f4f7

Please sign in to comment.