mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-03 07:38:57 +00:00
[llvm][clang][IFS] Enhancing the llvm-ifs yaml format for symbol lists.
Prior to this change the clang interface stubs format resembled something ending with a symbol list like this: Symbols: a: { Type: Func } This was problematic because we didn't actually want a map format and also because we didn't like that an empty symbol list required "Symbols: {}". That is to say without the empty {} llvm-ifs would crash on an empty list. With this new format it is much more clear which field is the symbol name, and instead the [] that is used to express an empty symbol vector is optional, ie: Symbols: - { Name: a, Type: Func } or Symbols: [] or Symbols: This further diverges the format from existing llvm-elftapi. This is a good thing because although the format originally came from the same place, they are not the same in any way. Differential Revision: https://reviews.llvm.org/D76979
This commit is contained in:
parent
a67cd71acd
commit
e3033c0ce5
@ -119,17 +119,13 @@ protected:
|
||||
bool hasASTFileSupport() const override { return false; }
|
||||
};
|
||||
|
||||
class GenerateInterfaceStubAction : public ASTFrontendAction {
|
||||
protected:
|
||||
TranslationUnitKind getTranslationUnitKind() override { return TU_Module; }
|
||||
|
||||
bool hasASTFileSupport() const override { return false; }
|
||||
};
|
||||
|
||||
class GenerateInterfaceIfsExpV1Action : public GenerateInterfaceStubAction {
|
||||
class GenerateInterfaceStubsAction : public ASTFrontendAction {
|
||||
protected:
|
||||
std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
|
||||
StringRef InFile) override;
|
||||
|
||||
TranslationUnitKind getTranslationUnitKind() override { return TU_Module; }
|
||||
bool hasASTFileSupport() const override { return false; }
|
||||
};
|
||||
|
||||
class GenerateModuleFromModuleMapAction : public GenerateModuleAction {
|
||||
|
@ -90,7 +90,7 @@ enum ActionKind {
|
||||
GeneratePCH,
|
||||
|
||||
/// Generate Interface Stub Files.
|
||||
GenerateInterfaceIfsExpV1,
|
||||
GenerateInterfaceStubs,
|
||||
|
||||
/// Only execute frontend initialization.
|
||||
InitOnly,
|
||||
|
@ -4184,7 +4184,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
StringRef ArgStr =
|
||||
Args.hasArg(options::OPT_interface_stub_version_EQ)
|
||||
? Args.getLastArgValue(options::OPT_interface_stub_version_EQ)
|
||||
: "experimental-ifs-v1";
|
||||
: "experimental-ifs-v2";
|
||||
CmdArgs.push_back("-emit-interface-stubs");
|
||||
CmdArgs.push_back(
|
||||
Args.MakeArgString(Twine("-interface-stub-version=") + ArgStr.str()));
|
||||
|
@ -1780,25 +1780,26 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
|
||||
StringRef ArgStr =
|
||||
Args.hasArg(OPT_interface_stub_version_EQ)
|
||||
? Args.getLastArgValue(OPT_interface_stub_version_EQ)
|
||||
: "experimental-ifs-v1";
|
||||
: "experimental-ifs-v2";
|
||||
if (ArgStr == "experimental-yaml-elf-v1" ||
|
||||
ArgStr == "experimental-ifs-v1" ||
|
||||
ArgStr == "experimental-tapi-elf-v1") {
|
||||
std::string ErrorMessage =
|
||||
"Invalid interface stub format: " + ArgStr.str() +
|
||||
" is deprecated.";
|
||||
Diags.Report(diag::err_drv_invalid_value)
|
||||
<< "Must specify a valid interface stub format type, ie: "
|
||||
"-interface-stub-version=experimental-ifs-v1"
|
||||
"-interface-stub-version=experimental-ifs-v2"
|
||||
<< ErrorMessage;
|
||||
} else if (ArgStr != "experimental-ifs-v1") {
|
||||
} else if (!ArgStr.startswith("experimental-ifs-")) {
|
||||
std::string ErrorMessage =
|
||||
"Invalid interface stub format: " + ArgStr.str() + ".";
|
||||
Diags.Report(diag::err_drv_invalid_value)
|
||||
<< "Must specify a valid interface stub format type, ie: "
|
||||
"-interface-stub-version=experimental-ifs-v1"
|
||||
"-interface-stub-version=experimental-ifs-v2"
|
||||
<< ErrorMessage;
|
||||
} else {
|
||||
Opts.ProgramAction = frontend::GenerateInterfaceIfsExpV1;
|
||||
Opts.ProgramAction = frontend::GenerateInterfaceStubs;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -3367,7 +3368,7 @@ static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) {
|
||||
case frontend::GenerateModuleInterface:
|
||||
case frontend::GenerateHeaderModule:
|
||||
case frontend::GeneratePCH:
|
||||
case frontend::GenerateInterfaceIfsExpV1:
|
||||
case frontend::GenerateInterfaceStubs:
|
||||
case frontend::ParseSyntaxOnly:
|
||||
case frontend::ModuleFileInfo:
|
||||
case frontend::VerifyPCH:
|
||||
|
@ -290,7 +290,7 @@ public:
|
||||
const ASTContext &context, StringRef Format,
|
||||
raw_ostream &OS) -> void {
|
||||
OS << "--- !" << Format << "\n";
|
||||
OS << "IfsVersion: 1.0\n";
|
||||
OS << "IfsVersion: 2.0\n";
|
||||
OS << "Triple: " << T.str() << "\n";
|
||||
OS << "ObjectFileFormat: "
|
||||
<< "ELF"
|
||||
@ -299,11 +299,11 @@ public:
|
||||
for (const auto &E : Symbols) {
|
||||
const MangledSymbol &Symbol = E.second;
|
||||
for (auto Name : Symbol.Names) {
|
||||
OS << " \""
|
||||
OS << " - { Name: \""
|
||||
<< (Symbol.ParentName.empty() || Instance.getLangOpts().CPlusPlus
|
||||
? ""
|
||||
: (Symbol.ParentName + "."))
|
||||
<< Name << "\" : { Type: ";
|
||||
<< Name << "\", Type: ";
|
||||
switch (Symbol.Type) {
|
||||
default:
|
||||
llvm_unreachable(
|
||||
@ -330,15 +330,15 @@ public:
|
||||
OS.flush();
|
||||
};
|
||||
|
||||
assert(Format == "experimental-ifs-v1" && "Unexpected IFS Format.");
|
||||
assert(Format == "experimental-ifs-v2" && "Unexpected IFS Format.");
|
||||
writeIfsV1(Instance.getTarget().getTriple(), Symbols, context, Format, *OS);
|
||||
}
|
||||
};
|
||||
} // namespace
|
||||
|
||||
std::unique_ptr<ASTConsumer>
|
||||
GenerateInterfaceIfsExpV1Action::CreateASTConsumer(CompilerInstance &CI,
|
||||
StringRef InFile) {
|
||||
GenerateInterfaceStubsAction::CreateASTConsumer(CompilerInstance &CI,
|
||||
StringRef InFile) {
|
||||
return std::make_unique<InterfaceStubFunctionsConsumer>(
|
||||
CI, InFile, "experimental-ifs-v1");
|
||||
CI, InFile, "experimental-ifs-v2");
|
||||
}
|
||||
|
@ -65,8 +65,8 @@ CreateFrontendBaseAction(CompilerInstance &CI) {
|
||||
case GenerateHeaderModule:
|
||||
return std::make_unique<GenerateHeaderModuleAction>();
|
||||
case GeneratePCH: return std::make_unique<GeneratePCHAction>();
|
||||
case GenerateInterfaceIfsExpV1:
|
||||
return std::make_unique<GenerateInterfaceIfsExpV1Action>();
|
||||
case GenerateInterfaceStubs:
|
||||
return std::make_unique<GenerateInterfaceStubsAction>();
|
||||
case InitOnly: return std::make_unique<InitOnlyAction>();
|
||||
case ParseSyntaxOnly: return std::make_unique<SyntaxOnlyAction>();
|
||||
case ModuleFileInfo: return std::make_unique<DumpModuleInfoAction>();
|
||||
|
@ -7,6 +7,9 @@
|
||||
// RUN: not %clang -emit-interface-stubs -interface-stub-version=experimental-yaml-elf-v1 %s 2>&1 | \
|
||||
// RUN: FileCheck -check-prefix=CHECK-YAML-DEPRECATED %s
|
||||
|
||||
// RUN: not %clang -emit-interface-stubs -interface-stub-version=experimental-ifs-v1 %s 2>&1 | \
|
||||
// RUN: FileCheck -check-prefix=CHECK-V1-DEPRECATED %s
|
||||
|
||||
// RUN: not %clang -emit-interface-stubs -interface-stub-version=bad-format %s 2>&1 | \
|
||||
// RUN: FileCheck %s
|
||||
|
||||
@ -21,16 +24,22 @@
|
||||
// CHECK: error: invalid value
|
||||
// CHECK: 'Invalid interface stub format: bad-format.' in 'Must specify a
|
||||
// CHECK: valid interface stub format type, ie:
|
||||
// CHECK: -interface-stub-version=experimental-ifs-v1'
|
||||
// CHECK: -interface-stub-version=experimental-ifs-v2'
|
||||
|
||||
// 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-TAPI-DEPRECATED: -interface-stub-version=experimental-ifs-v2'
|
||||
|
||||
// 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'
|
||||
// CHECK-YAML-DEPRECATED: -interface-stub-version=experimental-ifs-v2'
|
||||
|
||||
// CHECK-V1-DEPRECATED: error: invalid value
|
||||
// CHECK-V1-DEPRECATED: 'Invalid interface stub format:
|
||||
// CHECK-V1-DEPRECATED: experimental-ifs-v1 is deprecated.' in 'Must
|
||||
// CHECK-V1-DEPRECATED: specify a valid interface stub format type, ie:
|
||||
// CHECK-V1-DEPRECATED: -interface-stub-version=experimental-ifs-v2'
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -emit-interface-stubs -fblocks -o - %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
|
@ -7,10 +7,10 @@
|
||||
# CHECK-IFS-NEXT: Filename:
|
||||
# CHECK-IFS-NEXT: Type Values: Object Func
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
a: { Type: Object, Size: 1 }
|
||||
- { Name: a, Type: Object, Size: 1 }
|
||||
...
|
||||
|
@ -1,12 +1,12 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
// CHECK-NEXT: ...
|
||||
|
||||
// ConstructorUsingShadowDecl
|
||||
// ConstructorUsingShadowDecl
|
||||
struct Base { Base(int); };
|
||||
struct Derived : public Base { using Base::Base; };
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs -std=c++17 %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
|
@ -8,12 +8,12 @@
|
||||
|
||||
// CHECK-OBJ: bar
|
||||
|
||||
// CHECK-IFS: --- !experimental-ifs-v1
|
||||
// CHECK-IFS: --- !experimental-ifs-v2
|
||||
// CHECK-IFS-NEXT: IfsVersion:
|
||||
// CHECK-IFS-NEXT: Triple:
|
||||
// CHECK-IFS-NEXT: ObjectFileFormat:
|
||||
// CHECK-IFS-NEXT: Symbols:
|
||||
// CHECK-IFS-NEXT: "bar" : { Type: Func }
|
||||
// CHECK-IFS-NEXT: - { Name: "bar", Type: Func }
|
||||
// CHECK-IFS-NEXT: ...
|
||||
|
||||
int bar(int a) { return a; }
|
||||
|
8
clang/test/InterfaceStubs/empty.c
Normal file
8
clang/test/InterfaceStubs/empty.c
Normal file
@ -0,0 +1,8 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat:
|
||||
// CHECK-NEXT: Symbols:
|
||||
// CHECK-NEXT: ...
|
@ -7,13 +7,13 @@
|
||||
# RUN: %clang -emit-interface-stubs -o - %s %s -emit-merged-ifs | \
|
||||
# RUN: FileCheck %s --check-prefixes=CHECK-MERGE-IFS
|
||||
|
||||
# CHECK-IFS: --- !experimental-ifs-v1
|
||||
# CHECK-IFS-NEXT: IfsVersion: 1.0
|
||||
# CHECK-IFS: --- !experimental-ifs-v2
|
||||
# CHECK-IFS-NEXT: IfsVersion: 2.0
|
||||
# CHECK-IFS-NEXT: Triple: x86_64-linux-gnu
|
||||
# CHECK-IFS-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-IFS-NEXT: Symbols:
|
||||
# CHECK-IFS-DAG: a: { Type: Func }
|
||||
# CHECK-IFS-DAG: b: { Type: Object, Size: 4 }
|
||||
# CHECK-IFS-DAG: - { Name: a, Type: Func }
|
||||
# CHECK-IFS-DAG: - { Name: b, Type: Object, Size: 4 }
|
||||
# CHECK-IFS: ...
|
||||
|
||||
# CHECK-ELF: ELF Header:
|
||||
@ -23,18 +23,18 @@
|
||||
# CHECK-ELF: OBJECT GLOBAL DEFAULT 1 b
|
||||
|
||||
# Here we are testing to see if two identical symbols will merge.
|
||||
# CHECK-MERGE-IFS: --- !experimental-ifs-v1
|
||||
# CHECK-MERGE-IFS-NEXT: IfsVersion: 1.0
|
||||
# CHECK-MERGE-IFS: --- !experimental-ifs-v2
|
||||
# CHECK-MERGE-IFS-NEXT: IfsVersion: 2.0
|
||||
# CHECK-MERGE-IFS-NEXT: Triple: x86_64-linux-gnu
|
||||
# CHECK-MERGE-IFS-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-MERGE-IFS-NEXT: Symbols:
|
||||
# CHECK-MERGE-IFS-NEXT: a: { Type: Func }
|
||||
# CHECK-MERGE-IFS-NEXT: - { Name: a, Type: Func }
|
||||
# CHECK-MERGE-IFS-NEXT: ...
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
a: { Type: Func }
|
||||
- { Name: a, Type: Func }
|
||||
...
|
||||
|
@ -14,7 +14,7 @@
|
||||
// RUN: -DPARENT_METHOD_VISIBILITY="" -DCHILD_METHOD_VISIBILITY="" %s | \
|
||||
// RUN: FileCheck -check-prefix=CHECK-HP %s
|
||||
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -o - -emit-interface-stubs \
|
||||
// RUN: -interface-stub-version=experimental-ifs-v1 \
|
||||
// RUN: -interface-stub-version=experimental-ifs-v2 \
|
||||
// RUN: -DPARENT_CLASS_VISIBILITY=HIDDEN -DCHILD_CLASS_VISIBILITY="" \
|
||||
// RUN: -DPARENT_METHOD_VISIBILITY="" -DCHILD_METHOD_VISIBILITY="" %s | \
|
||||
// RUN: FileCheck -check-prefix=CHECK-HP2 %s
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
|
@ -55,8 +55,8 @@ INLINE int foo() {
|
||||
// RUN: -c -std=gnu89 -xc %s | llvm-nm - 2>&1 | \
|
||||
// RUN: FileCheck -check-prefix=CHECK-SYMBOLS %s
|
||||
|
||||
// CHECK-TAPI-DAG: foo" : { Type: Func }
|
||||
// CHECK-TAPI-DAG: foo.var" : { Type: Object, Size: 4 }
|
||||
// CHECK-TAPI-DAG: foo", Type: Func }
|
||||
// CHECK-TAPI-DAG: foo.var", Type: Object, Size: 4 }
|
||||
// CHECK-SYMBOLS-DAG: foo
|
||||
// CHECK-SYMBOLS-DAG: foo.var
|
||||
#include "inline.h"
|
||||
|
@ -1,11 +1,11 @@
|
||||
// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-interface-stubs -o - %s \
|
||||
// RUN: | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
// CHECK-NEXT: f" : { Type: Object, Size: 1 }
|
||||
// CHECK-NEXT: f", Type: Object, Size: 1 }
|
||||
// CHECK-NEXT: ...
|
||||
auto f = [](void* data) { int i; };
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
|
@ -1,6 +1,6 @@
|
||||
// RUN: %clang_cc1 -fvisibility default -o - -emit-interface-stubs %s | FileCheck -check-prefix=CHECK-TAPI %s
|
||||
// RUN: %clang -fvisibility=default -c -o - %s | llvm-nm - 2>&1 | FileCheck -check-prefix=CHECK-SYMBOLS %s
|
||||
|
||||
// CHECK-TAPI: data" : { Type: Object, Size: 4 }
|
||||
// CHECK-TAPI: data", Type: Object, Size: 4 }
|
||||
// CHECK-SYMBOLS: data
|
||||
int data = 42;
|
||||
|
@ -4,12 +4,12 @@
|
||||
# RUN: %clang -emit-interface-stubs -o - %s | llvm-readelf --all | \
|
||||
# RUN: FileCheck %s --check-prefixes=CHECK-ELF
|
||||
|
||||
# CHECK-IFS: --- !experimental-ifs-v1
|
||||
# CHECK-IFS-NEXT: IfsVersion: 1.0
|
||||
# CHECK-IFS: --- !experimental-ifs-v2
|
||||
# CHECK-IFS-NEXT: IfsVersion: 2.0
|
||||
# CHECK-IFS-NEXT: Triple: x86_64-linux-gnu
|
||||
# CHECK-IFS-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-IFS-NEXT: Symbols:
|
||||
# CHECK-IFS-NEXT: b: { Type: Object, Size: 4 }
|
||||
# CHECK-IFS-NEXT: - { Name: b, Type: Object, Size: 4 }
|
||||
# CHECK-IFS-NEXT: ...
|
||||
|
||||
# CHECK-ELF: ELF Header:
|
||||
@ -19,10 +19,10 @@
|
||||
# CHECK-ELF-NOT: FUNC GLOBAL DEFAULT 1 a
|
||||
# CHECK-ELF: OBJECT GLOBAL DEFAULT 1 b
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
b: { Type: Object, Size: 4 }
|
||||
- { Name: b, Type: Object, Size: 4 }
|
||||
...
|
||||
|
@ -4,11 +4,11 @@
|
||||
// RUN: -emit-interface-stubs -emit-merged-ifs -S | \
|
||||
// RUN: FileCheck -check-prefix=CHECK-IFS %s
|
||||
|
||||
// CHECK-IFS: --- !experimental-ifs-v1
|
||||
// CHECK-IFS: IfsVersion: 1.0
|
||||
// CHECK-IFS: Triple: powerpc64le
|
||||
// CHECK-IFS: Symbols:
|
||||
// CHECK-IFS: _Z8helloPPCv: { Type: Func }
|
||||
// CHECK-IFS: ...
|
||||
// CHECK-IFS: --- !experimental-ifs-v2
|
||||
// CHECK-IFS: IfsVersion: 2.0
|
||||
// CHECK-IFS: Triple: powerpc64le
|
||||
// CHECK-IFS: Symbols:
|
||||
// CHECK-IFS: - { Name: _Z8helloPPCv, Type: Func }
|
||||
// CHECK-IFS: ...
|
||||
|
||||
int helloPPC();
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
|
@ -6,10 +6,10 @@
|
||||
// RUN: FileCheck -check-prefix=CHECK-SYMBOLS %s
|
||||
|
||||
// CHECK: Symbols:
|
||||
// CHECK-DAG: "_ZN3qux3barEii" : { Type: Func }
|
||||
// CHECK-DAG: "_ZN3baz3addIiEET_S1_S1_" : { Type: Func }
|
||||
// CHECK-DAG: "_Z4fbarff" : { Type: Func }
|
||||
// CHECK-DAG: "_ZN3baz3addIfEET_S1_S1_" : { Type: Func }
|
||||
// CHECK-DAG: - { Name: "_ZN3qux3barEii", Type: Func }
|
||||
// CHECK-DAG: - { Name: "_ZN3baz3addIiEET_S1_S1_", Type: Func }
|
||||
// CHECK-DAG: - { Name: "_Z4fbarff", Type: Func }
|
||||
// CHECK-DAG: - { Name: "_ZN3baz3addIfEET_S1_S1_", Type: Func }
|
||||
|
||||
// Same symbols just different order.
|
||||
// CHECK-SYMBOLS-DAG: _Z4fbarff
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
|
@ -2,13 +2,12 @@
|
||||
|
||||
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fcxx-exceptions -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
// CHECK-NEXT: "_Z1fv" : { Type: Func }
|
||||
// CHECK-NEXT: - { Name: "_Z1fv", Type: Func }
|
||||
// CHECK-NEXT: ...
|
||||
|
||||
class C5 {};
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
|
@ -1,12 +1,12 @@
|
||||
// REQUIRES: x86-registered-target
|
||||
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -o - -emit-interface-stubs %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK: --- !experimental-ifs-v2
|
||||
// CHECK-NEXT: IfsVersion: 2.0
|
||||
// CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
// CHECK-NEXT: "a" : { Type: Object, Size: 4 }
|
||||
// CHECK-NEXT: - { Name: "a", Type: Object, Size: 4 }
|
||||
// CHECK-NEXT: ...
|
||||
|
||||
template<typename T, T v> struct S9 {
|
||||
|
@ -1,14 +1,14 @@
|
||||
// REQUIRES: x86-registered-target
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -o - -emit-interface-stubs \
|
||||
// RUN: -interface-stub-version=experimental-ifs-v1 %s | \
|
||||
// RUN: -interface-stub-version=experimental-ifs-v2 %s | \
|
||||
// RUN: FileCheck %s
|
||||
|
||||
// RUN: %clang -target x86_64-unknown-linux-gnu -o - -c %s | llvm-nm - 2>&1 | \
|
||||
// RUN: FileCheck -check-prefix=CHECK-SYMBOLS %s
|
||||
|
||||
// CHECK: Symbols:
|
||||
// CHECK-DAG: "_Z8weakFuncv" : { Type: Func, Weak: true }
|
||||
// CHECK-DAG: "_Z10strongFuncv" : { Type: Func }
|
||||
// CHECK-DAG: - { Name: "_Z8weakFuncv", Type: Func, Weak: true }
|
||||
// CHECK-DAG: - { Name: "_Z10strongFuncv", Type: Func }
|
||||
|
||||
// CHECK-SYMBOLS-DAG: _Z10strongFuncv
|
||||
// CHECK-SYMBOLS-DAG: _Z8weakFuncv
|
||||
|
@ -6,11 +6,11 @@
|
||||
// CHECK-CC1: Symbols:
|
||||
// CHECK-CC1-NEXT: ?helloWindowsMsvc@@YAHXZ
|
||||
|
||||
// CHECK-IFS: --- !experimental-ifs-v1
|
||||
// CHECK-IFS: IfsVersion: 1.0
|
||||
// CHECK-IFS: Triple:
|
||||
// CHECK-IFS: Symbols:
|
||||
// CHECK-IFS: ?helloWindowsMsvc@@YAHXZ: { Type: Func }
|
||||
// CHECK-IFS: ...
|
||||
// CHECK-IFS: --- !experimental-ifs-v2
|
||||
// CHECK-IFS: IfsVersion: 2.0
|
||||
// CHECK-IFS: Triple:
|
||||
// CHECK-IFS: Symbols:
|
||||
// CHECK-IFS: - { Name: '?helloWindowsMsvc@@YAHXZ', Type: Func }
|
||||
// CHECK-IFS: ...
|
||||
|
||||
int helloWindowsMsvc();
|
||||
|
@ -1,8 +1,8 @@
|
||||
# NOTE: Used by weak-mismatch.ifs
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
foobar: { Type: Object, Size: 2 }
|
||||
- { Name: foobar, Type: Object, Size: 2 }
|
||||
...
|
||||
|
@ -1,8 +1,8 @@
|
||||
# NOTE: Used by weak-mismatch.ifs
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
foobar: { Type: Func }
|
||||
- { Name: foobar, Type: Func }
|
||||
...
|
||||
|
@ -5,10 +5,10 @@
|
||||
# CHECK-IFS-NEXT: Filenames:
|
||||
# CHECK-IFS-NEXT: ObjectFileFormat Values: TBD ELF
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-apple-unknown
|
||||
ObjectFileFormat: TBD
|
||||
Symbols:
|
||||
a: { Type: Func }
|
||||
- { Name: a, Type: Func }
|
||||
...
|
||||
|
@ -5,10 +5,10 @@
|
||||
# CHECK-IFS-NEXT: Filenames:
|
||||
# CHECK-IFS-NEXT: Triple Values: mips-unknown-linux x86_64-unknown-linux-gnu
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: mips-unknown-linux
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
a: { Type: Func }
|
||||
- { Name: a, Type: Func }
|
||||
...
|
||||
|
@ -5,12 +5,12 @@
|
||||
# RUN: FileCheck %s --check-prefixes=CHECK-IFS2
|
||||
|
||||
# CHECK-IFS: error: Interface Stub: IfsVersion Mismatch.
|
||||
# CHECK-IFS2: error: Interface Stub: Bad IfsVersion: 0.0, llvm-ifs supported version: 1.2.
|
||||
# CHECK-IFS2: error: Interface Stub: Bad IfsVersion: 0.0, llvm-ifs supported version: 2.0.
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 0.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
a: { Type: Func }
|
||||
- { Name: a, Type: Func }
|
||||
...
|
||||
|
@ -7,10 +7,10 @@
|
||||
# CHECK-IFS-NEXT: Filename:
|
||||
# CHECK-IFS-NEXT: Size Values: 1 4
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
b: { Type: Object, Size: 1 }
|
||||
- { Name: b, Type: Object, Size: 1 }
|
||||
...
|
||||
|
@ -7,10 +7,10 @@
|
||||
# CHECK-IFS-NEXT: Filename:
|
||||
# CHECK-IFS-NEXT: Type Values: Object Func
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
a: { Type: Object, Size: 1 }
|
||||
- { Name: a, Type: Object, Size: 1 }
|
||||
...
|
||||
|
@ -2,12 +2,12 @@
|
||||
# RUN: FileCheck %s --check-prefixes=CHECK-IFS
|
||||
|
||||
# CHECK-IFS: Symbols:
|
||||
# CHECK-IFS-NEXT: a: { Type: Func, Weak: true }
|
||||
# CHECK-IFS-NEXT: - { Name: a, Type: Func, Weak: true }
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
a: { Type: Func, Weak: true }
|
||||
- { Name: a, Type: Func, Weak: true }
|
||||
...
|
||||
|
@ -1,25 +1,25 @@
|
||||
# RUN: llvm-ifs -action write-ifs -o - %s | FileCheck --check-prefixes=CHECK-DEFAULT %s
|
||||
# RUN: llvm-ifs -action write-ifs -o - %s %S/weak.ifs | FileCheck --check-prefixes=CHECK-MERGE %s
|
||||
|
||||
# CHECK-DEFAULT: --- !experimental-ifs-v1
|
||||
# CHECK-DEFAULT-NEXT: IfsVersion: 1.2
|
||||
# CHECK-DEFAULT: --- !experimental-ifs-v2
|
||||
# CHECK-DEFAULT-NEXT: IfsVersion: 2.0
|
||||
# CHECK-DEFAULT-NEXT: Triple: ''
|
||||
# CHECK-DEFAULT-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-DEFAULT-NEXT: Symbols: {}
|
||||
# CHECK-DEFAULT-NEXT: Symbols: []
|
||||
# CHECK-DEFAULT-NEXT: ...
|
||||
|
||||
# CHECK-MERGE: --- !experimental-ifs-v1
|
||||
# CHECK-MERGE-NEXT: IfsVersion: 1.0
|
||||
# CHECK-MERGE: --- !experimental-ifs-v2
|
||||
# CHECK-MERGE-NEXT: IfsVersion: 2.0
|
||||
# CHECK-MERGE-NEXT: Triple: x86_64-unknown-linux-gnu
|
||||
# CHECK-MERGE-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-MERGE-NEXT: Symbols:
|
||||
# CHECK-MERGE-DAG: _Z8weakFuncv: { Type: Func, Weak: true }
|
||||
# CHECK-MERGE-DAG: _Z10strongFuncv: { Type: Func }
|
||||
# CHECK-MERGE-DAG: - { Name: _Z8weakFuncv, Type: Func, Weak: true }
|
||||
# CHECK-MERGE-DAG: - { Name: _Z10strongFuncv, Type: Func }
|
||||
# CHECK-MERGE: ...
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.2
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: ''
|
||||
ObjectFileFormat: ELF
|
||||
Symbols: {}
|
||||
Symbols: []
|
||||
...
|
||||
|
15
llvm/test/tools/llvm-ifs/empty1.ifs
Normal file
15
llvm/test/tools/llvm-ifs/empty1.ifs
Normal file
@ -0,0 +1,15 @@
|
||||
# RUN: llvm-ifs -action write-ifs -o - %s | FileCheck %s
|
||||
|
||||
# CHECK: --- !experimental-ifs-v2
|
||||
# CHECK-NEXT: IfsVersion: 2.0
|
||||
# CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
|
||||
# CHECK-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-NEXT: Symbols: []
|
||||
# CHECK: ...
|
||||
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols: []
|
||||
...
|
15
llvm/test/tools/llvm-ifs/empty2.ifs
Normal file
15
llvm/test/tools/llvm-ifs/empty2.ifs
Normal file
@ -0,0 +1,15 @@
|
||||
# RUN: llvm-ifs -action write-ifs -o - %s | FileCheck %s
|
||||
|
||||
# CHECK: --- !experimental-ifs-v2
|
||||
# CHECK-NEXT: IfsVersion: 2.0
|
||||
# CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
|
||||
# CHECK-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-NEXT: Symbols: []
|
||||
# CHECK: ...
|
||||
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
...
|
@ -10,13 +10,13 @@
|
||||
# RUN: llvm-ifs -action write-ifs -o - %s %s | \
|
||||
# RUN: FileCheck %s --check-prefixes=CHECK-MERGE-IFS
|
||||
|
||||
# CHECK-IFS: --- !experimental-ifs-v1
|
||||
# CHECK-IFS-NEXT: IfsVersion: 1.0
|
||||
# CHECK-IFS: --- !experimental-ifs-v2
|
||||
# CHECK-IFS-NEXT: IfsVersion: 2.0
|
||||
# CHECK-IFS-NEXT: Triple: x86_64-unknown-linux-gnu
|
||||
# CHECK-IFS-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-IFS-NEXT: Symbols:
|
||||
# CHECK-IFS-DAG: a: { Type: Func }
|
||||
# CHECK-IFS-DAG: b: { Type: Object, Size: 4 }
|
||||
# CHECK-IFS-DAG: - { Name: a, Type: Func }
|
||||
# CHECK-IFS-DAG: - { Name: b, Type: Object, Size: 4 }
|
||||
# CHECK-IFS: ...
|
||||
|
||||
# CHECK-ELF: ELF Header:
|
||||
@ -39,18 +39,18 @@
|
||||
# CHECK-DARWIN-TBD3-NEXT: ...
|
||||
|
||||
# Here we are testing to see if two identical symbols will merge.
|
||||
# CHECK-MERGE-IFS: --- !experimental-ifs-v1
|
||||
# CHECK-MERGE-IFS-NEXT: IfsVersion: 1.0
|
||||
# CHECK-MERGE-IFS: --- !experimental-ifs-v2
|
||||
# CHECK-MERGE-IFS-NEXT: IfsVersion: 2.0
|
||||
# CHECK-MERGE-IFS-NEXT: Triple: x86_64-unknown-linux-gnu
|
||||
# CHECK-MERGE-IFS-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-MERGE-IFS-NEXT: Symbols:
|
||||
# CHECK-MERGE-IFS-NEXT: a: { Type: Func }
|
||||
# CHECK-MERGE-IFS-NEXT: - { Name: a, Type: Func }
|
||||
# CHECK-MERGE-IFS-NEXT: ...
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
a: { Type: Func }
|
||||
- { Name: a, Type: Func }
|
||||
...
|
||||
|
@ -13,10 +13,10 @@
|
||||
# CHECK-NEXT: symbols: [ __Z3fooi ]
|
||||
# CHECK-NEXT: ...
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: arm64-apple-ios
|
||||
ObjectFileFormat: TBD
|
||||
Symbols:
|
||||
__Z3fooi: { Type: Func }
|
||||
- { Name: __Z3fooi, Type: Func }
|
||||
...
|
||||
|
@ -13,10 +13,10 @@
|
||||
# CHECK-NEXT: symbols: [ __Z3fooi ]
|
||||
# CHECK-NEXT: ...
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: arm64-apple-macosx
|
||||
ObjectFileFormat: TBD
|
||||
Symbols:
|
||||
__Z3fooi: { Type: Func }
|
||||
- { Name: __Z3fooi, Type: Func }
|
||||
...
|
||||
|
@ -4,17 +4,17 @@
|
||||
# RUN: llvm-ifs -action write-bin -o - %s %S/func.ifs %S/object.ifs %S/weak.ifs | \
|
||||
# RUN: llvm-readelf --all | FileCheck %s --check-prefixes=CHECK-ELF
|
||||
|
||||
# CHECK-IFS: --- !experimental-ifs-v1
|
||||
# CHECK-IFS-NEXT: IfsVersion: 1.0
|
||||
# CHECK-IFS: --- !experimental-ifs-v2
|
||||
# CHECK-IFS-NEXT: IfsVersion: 2.0
|
||||
# CHECK-IFS-NEXT: Triple: x86_64-unknown-linux-gnu
|
||||
# CHECK-IFS-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-IFS-NEXT: Symbols:
|
||||
# CHECK-IFS-DAG: e: { Type: Object, Size: 8 }
|
||||
# CHECK-IFS-DAG: a: { Type: Func }
|
||||
# CHECK-IFS-DAG: f: { Type: Object, Size: 2 }
|
||||
# CHECK-IFS-DAG: _Z10strongFuncv: { Type: Func }
|
||||
# CHECK-IFS-DAG: _Z8weakFuncv: { Type: Func, Weak: true }
|
||||
# CHECK-IFS-DAG: b: { Type: Object, Size: 4 }
|
||||
# CHECK-IFS-DAG: - { Name: e, Type: Object, Size: 8 }
|
||||
# CHECK-IFS-DAG: - { Name: a, Type: Func }
|
||||
# CHECK-IFS-DAG: - { Name: f, Type: Object, Size: 2 }
|
||||
# CHECK-IFS-DAG: - { Name: _Z10strongFuncv, Type: Func }
|
||||
# CHECK-IFS-DAG: - { Name: _Z8weakFuncv, Type: Func, Weak: true }
|
||||
# CHECK-IFS-DAG: - { Name: b, Type: Object, Size: 4 }
|
||||
# CHECK-IFS: ...
|
||||
|
||||
# CHECK-ELF: FUNC GLOBAL DEFAULT 1 _Z10strongFuncv
|
||||
@ -24,11 +24,11 @@
|
||||
# CHECK-ELF: OBJECT GLOBAL DEFAULT 1 e
|
||||
# CHECK-ELF: OBJECT GLOBAL DEFAULT 1 f
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
e: { Type: Object, Size: 8 }
|
||||
f: { Type: Object, Size: 2 }
|
||||
- { Name: e, Type: Object, Size: 8 }
|
||||
- { Name: f, Type: Object, Size: 2 }
|
||||
...
|
||||
|
@ -4,12 +4,12 @@
|
||||
# RUN: llvm-ifs -action write-bin -o - %s | \
|
||||
# RUN: llvm-readelf --all | FileCheck %s --check-prefixes=CHECK-ELF
|
||||
|
||||
# CHECK-IFS: --- !experimental-ifs-v1
|
||||
# CHECK-IFS-NEXT: IfsVersion: 1.0
|
||||
# CHECK-IFS: --- !experimental-ifs-v2
|
||||
# CHECK-IFS-NEXT: IfsVersion: 2.0
|
||||
# CHECK-IFS-NEXT: Triple: x86_64-unknown-linux-gnu
|
||||
# CHECK-IFS-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-IFS-NEXT: Symbols:
|
||||
# CHECK-IFS-NEXT: b: { Type: Object, Size: 4 }
|
||||
# CHECK-IFS-NEXT: - { Name: b, Type: Object, Size: 4 }
|
||||
# CHECK-IFS-NEXT: ...
|
||||
|
||||
# CHECK-ELF: ELF Header:
|
||||
@ -19,10 +19,10 @@
|
||||
# CHECK-ELF-NOT: FUNC GLOBAL DEFAULT 1 a
|
||||
# CHECK-ELF: OBJECT GLOBAL DEFAULT 1 b
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
b: { Type: Object, Size: 4 }
|
||||
- { Name: b, Type: Object, Size: 4 }
|
||||
...
|
||||
|
@ -1,17 +1,17 @@
|
||||
# RUN: llvm-ifs -action write-ifs -o - %s %S/strong.ifs | FileCheck %s --check-prefixes=CHECK-IFS
|
||||
|
||||
# CHECK-IFS: --- !experimental-ifs-v1
|
||||
# CHECK-IFS-NEXT: IfsVersion: 1.0
|
||||
# CHECK-IFS: --- !experimental-ifs-v2
|
||||
# CHECK-IFS-NEXT: IfsVersion: 2.0
|
||||
# CHECK-IFS-NEXT: Triple: x86_64-unknown-linux-gnu
|
||||
# CHECK-IFS-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-IFS-NEXT: Symbols:
|
||||
# CHECK-IFS-DAG: _Z8weakFuncv: { Type: Func }
|
||||
# CHECK-IFS-DAG: - { Name: _Z8weakFuncv, Type: Func }
|
||||
# CHECK-IFS: ...
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
_Z8weakFuncv: { Type: Func }
|
||||
- { Name: _Z8weakFuncv, Type: Func }
|
||||
...
|
||||
|
@ -13,10 +13,10 @@
|
||||
# CHECK-NEXT: symbols: [ __Z3fooi ]
|
||||
# CHECK-NEXT: ...
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: arm64-apple-tvos
|
||||
ObjectFileFormat: TBD
|
||||
Symbols:
|
||||
__Z3fooi: { Type: Func }
|
||||
- { Name: __Z3fooi, Type: Func }
|
||||
...
|
||||
|
@ -1,9 +1,9 @@
|
||||
# RUN: llvm-ifs -action write-ifs -o - %s %S/object.ifs
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.1
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
a: { Type: Func }
|
||||
- { Name: a, Type: Func }
|
||||
...
|
||||
|
@ -13,10 +13,10 @@
|
||||
# CHECK-NEXT: symbols: [ __Z3fooi ]
|
||||
# CHECK-NEXT: ...
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: arm64-apple-watchos
|
||||
ObjectFileFormat: TBD
|
||||
Symbols:
|
||||
__Z3fooi: { Type: Func }
|
||||
- { Name: __Z3fooi, Type: Func }
|
||||
...
|
||||
|
@ -10,10 +10,10 @@
|
||||
# CHECK-TYPE-NEXT: Filename:
|
||||
# CHECK-TYPE-NEXT: Type Values: Object Func
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
foobar: { Type: Object, Size: 1, Weak: true }
|
||||
- { Name: foobar, Type: Object, Size: 1, Weak: true }
|
||||
...
|
||||
|
@ -1,19 +1,19 @@
|
||||
# RUN: llvm-ifs -action write-ifs -o - %s | FileCheck %s --check-prefixes=CHECK-IFS
|
||||
|
||||
# CHECK-IFS: --- !experimental-ifs-v1
|
||||
# CHECK-IFS-NEXT: IfsVersion: 1.0
|
||||
# CHECK-IFS: --- !experimental-ifs-v2
|
||||
# CHECK-IFS-NEXT: IfsVersion: 2.0
|
||||
# CHECK-IFS-NEXT: Triple: x86_64-unknown-linux-gnu
|
||||
# CHECK-IFS-NEXT: ObjectFileFormat: ELF
|
||||
# CHECK-IFS-NEXT: Symbols:
|
||||
# CHECK-IFS-DAG: _Z8weakFuncv: { Type: Func, Weak: true }
|
||||
# CHECK-IFS-DAG: _Z10strongFuncv: { Type: Func }
|
||||
# CHECK-IFS-DAG: - { Name: _Z8weakFuncv, Type: Func, Weak: true }
|
||||
# CHECK-IFS-DAG: - { Name: _Z10strongFuncv, Type: Func }
|
||||
# CHECK-IFS: ...
|
||||
|
||||
--- !experimental-ifs-v1
|
||||
IfsVersion: 1.0
|
||||
--- !experimental-ifs-v2
|
||||
IfsVersion: 2.0
|
||||
Triple: x86_64-unknown-linux-gnu
|
||||
ObjectFileFormat: ELF
|
||||
Symbols:
|
||||
_Z8weakFuncv: { Type: Func, Weak: true }
|
||||
_Z10strongFuncv: { Type: Func }
|
||||
- { Name: _Z8weakFuncv, Type: Func, Weak: true }
|
||||
- { Name: _Z10strongFuncv, Type: Func }
|
||||
...
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "llvm/TextAPI/MachO/TextAPIWriter.h"
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
using namespace llvm;
|
||||
using namespace llvm::yaml;
|
||||
@ -34,8 +35,8 @@ using namespace llvm::MachO;
|
||||
#define DEBUG_TYPE "llvm-ifs"
|
||||
|
||||
namespace {
|
||||
const VersionTuple IFSVersionCurrent(1, 2);
|
||||
}
|
||||
const VersionTuple IFSVersionCurrent(2, 0);
|
||||
} // end anonymous namespace
|
||||
|
||||
static cl::opt<std::string> Action("action", cl::desc("<llvm-ifs action>"),
|
||||
cl::value_desc("write-ifs | write-bin"),
|
||||
@ -76,6 +77,7 @@ std::string getTypeName(IFSSymbolType Type) {
|
||||
}
|
||||
|
||||
struct IFSSymbol {
|
||||
IFSSymbol() = default;
|
||||
IFSSymbol(std::string SymbolName) : Name(SymbolName) {}
|
||||
std::string Name;
|
||||
uint64_t Size;
|
||||
@ -85,6 +87,8 @@ struct IFSSymbol {
|
||||
bool operator<(const IFSSymbol &RHS) const { return Name < RHS.Name; }
|
||||
};
|
||||
|
||||
LLVM_YAML_IS_SEQUENCE_VECTOR(IFSSymbol)
|
||||
|
||||
namespace llvm {
|
||||
namespace yaml {
|
||||
/// YAML traits for IFSSymbolType.
|
||||
@ -124,6 +128,7 @@ template <> struct ScalarTraits<VersionTuple> {
|
||||
/// YAML traits for IFSSymbol.
|
||||
template <> struct MappingTraits<IFSSymbol> {
|
||||
static void mapping(IO &IO, IFSSymbol &Symbol) {
|
||||
IO.mapRequired("Name", Symbol.Name);
|
||||
IO.mapRequired("Type", Symbol.Type);
|
||||
// The need for symbol size depends on the symbol type.
|
||||
if (Symbol.Type == IFSSymbolType::NoType)
|
||||
@ -140,20 +145,6 @@ template <> struct MappingTraits<IFSSymbol> {
|
||||
static const bool flow = true;
|
||||
};
|
||||
|
||||
/// YAML traits for set of IFSSymbols.
|
||||
template <> struct CustomMappingTraits<std::set<IFSSymbol>> {
|
||||
static void inputOne(IO &IO, StringRef Key, std::set<IFSSymbol> &Set) {
|
||||
std::string Name = Key.str();
|
||||
IFSSymbol Sym(Name);
|
||||
IO.mapRequired(Name.c_str(), Sym);
|
||||
Set.insert(Sym);
|
||||
}
|
||||
|
||||
static void output(IO &IO, std::set<IFSSymbol> &Set) {
|
||||
for (auto &Sym : Set)
|
||||
IO.mapRequired(Sym.Name.c_str(), const_cast<IFSSymbol &>(Sym));
|
||||
}
|
||||
};
|
||||
} // namespace yaml
|
||||
} // namespace llvm
|
||||
|
||||
@ -167,7 +158,7 @@ public:
|
||||
std::string ObjectFileFormat;
|
||||
Optional<std::string> SOName;
|
||||
std::vector<std::string> NeededLibs;
|
||||
std::set<IFSSymbol> Symbols;
|
||||
std::vector<IFSSymbol> Symbols;
|
||||
|
||||
IFSStub() = default;
|
||||
IFSStub(const IFSStub &Stub)
|
||||
@ -186,14 +177,18 @@ namespace yaml {
|
||||
/// YAML traits for IFSStub objects.
|
||||
template <> struct MappingTraits<IFSStub> {
|
||||
static void mapping(IO &IO, IFSStub &Stub) {
|
||||
if (!IO.mapTag("!experimental-ifs-v1", true))
|
||||
if (!IO.mapTag("!experimental-ifs-v2", true))
|
||||
IO.setError("Not a .ifs YAML file.");
|
||||
|
||||
auto OldContext = IO.getContext();
|
||||
IO.setContext(&Stub);
|
||||
IO.mapRequired("IfsVersion", Stub.IfsVersion);
|
||||
IO.mapOptional("Triple", Stub.Triple);
|
||||
IO.mapOptional("ObjectFileFormat", Stub.ObjectFileFormat);
|
||||
IO.mapOptional("SOName", Stub.SOName);
|
||||
IO.mapOptional("NeededLibs", Stub.NeededLibs);
|
||||
IO.mapRequired("Symbols", Stub.Symbols);
|
||||
IO.setContext(&OldContext);
|
||||
}
|
||||
};
|
||||
} // namespace yaml
|
||||
@ -218,7 +213,7 @@ static Expected<std::unique_ptr<IFSStub>> readInputFile(StringRef FilePath) {
|
||||
return std::move(Stub);
|
||||
}
|
||||
|
||||
int writeTbdStub(const llvm::Triple &T, const std::set<IFSSymbol> &Symbols,
|
||||
int writeTbdStub(const llvm::Triple &T, const std::vector<IFSSymbol> &Symbols,
|
||||
const StringRef Format, raw_ostream &Out) {
|
||||
|
||||
auto PlatformKindOrError =
|
||||
@ -280,7 +275,7 @@ int writeTbdStub(const llvm::Triple &T, const std::set<IFSSymbol> &Symbols,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int writeElfStub(const llvm::Triple &T, const std::set<IFSSymbol> &Symbols,
|
||||
int writeElfStub(const llvm::Triple &T, const std::vector<IFSSymbol> &Symbols,
|
||||
const StringRef Format, raw_ostream &Out) {
|
||||
SmallString<0> Storage;
|
||||
Storage.clear();
|
||||
@ -387,8 +382,8 @@ int writeIfso(const IFSStub &Stub, bool IsWriteIfs, raw_ostream &Out) {
|
||||
|
||||
// TODO: Drop ObjectFileFormat, it can be subsumed from the triple.
|
||||
// New Interface Stubs Yaml Format:
|
||||
// --- !experimental-ifs-v1
|
||||
// IfsVersion: 1.0
|
||||
// --- !experimental-ifs-v2
|
||||
// IfsVersion: 2.0
|
||||
// Triple: <llvm triple>
|
||||
// ObjectFileFormat: <ELF | others not yet supported>
|
||||
// Symbols:
|
||||
@ -517,7 +512,7 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
for (auto &Entry : SymbolMap)
|
||||
Stub.Symbols.insert(Entry.second);
|
||||
Stub.Symbols.push_back(Entry.second);
|
||||
|
||||
std::error_code SysErr;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user