diff --git a/clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp b/clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp
index cb597c4..cdf4e6b 100644
--- a/clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp
+++ b/clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp
@@ -246,114 +246,6 @@
     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,
@@ -397,33 +289,12 @@
       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) {
   return std::make_unique<InterfaceStubFunctionsConsumer>(
