
Match TAPI behavior and allow input headers to be resolved via a passed directory, which is expected to be a library sitting in a build directory.
531 lines
12 KiB
Plaintext
531 lines
12 KiB
Plaintext
// RUN: rm -rf %t
|
|
// RUN: split-file %s %t
|
|
// RUN: sed -e "s|DSTROOT|%/t|g" %t/inputs.json.in > %t/inputs.json
|
|
|
|
// Invoke C++ with no-rtti.
|
|
// RUN: clang-installapi -target arm64-apple-macos13.1 \
|
|
// RUN: -I%t/usr/include -I%t/usr/local/include -x c++ -dynamiclib \
|
|
// RUN: -install_name @rpath/lib/libcpp.dylib -fno-rtti \
|
|
// RUN: %t/inputs.json -o %t/no-rtti.tbd 2>&1 | FileCheck %s --allow-empty
|
|
|
|
// RUN: llvm-readtapi -compare %t/no-rtti.tbd \
|
|
// RUN: %t/expected-no-rtti.tbd 2>&1 | FileCheck %s --allow-empty
|
|
|
|
// Invoke C++ with rtti.
|
|
// RUN: clang-installapi -target arm64-apple-macos13.1 \
|
|
// RUN: -I%t/usr/include -I%t/usr/local/include -x c++ \
|
|
// RUN: -install_name @rpath/lib/libcpp.dylib -frtti -dynamiclib \
|
|
// RUN: %t/inputs.json -o %t/rtti.tbd 2>&1 | FileCheck %s --allow-empty
|
|
// RUN: llvm-readtapi -compare %t/rtti.tbd \
|
|
// RUN: %t/expected-rtti.tbd 2>&1 | FileCheck %s --allow-empty
|
|
|
|
// CHECK-NOT: error:
|
|
// CHECK-NOT: warning:
|
|
|
|
//--- usr/include/basic.h
|
|
#ifndef CPP_H
|
|
#define CPP_H
|
|
|
|
inline int foo(int x) { return x + 1; }
|
|
|
|
extern int bar(int x) { return x + 1; }
|
|
|
|
inline int baz(int x) {
|
|
static const int a[] = {1, 2, 3};
|
|
return a[x];
|
|
}
|
|
|
|
extern "C" {
|
|
int cFunc(const char*);
|
|
}
|
|
|
|
class Bar {
|
|
public:
|
|
static const int x = 0;
|
|
static int y;
|
|
|
|
inline int func1(int x) { return x + 2; }
|
|
inline int func2(int x);
|
|
int func3(int x);
|
|
};
|
|
|
|
class __attribute__((visibility("hidden"))) BarI {
|
|
static const int x = 0;
|
|
static int y;
|
|
|
|
inline int func1(int x) { return x + 2; }
|
|
inline int func2(int x);
|
|
int func3(int x);
|
|
};
|
|
|
|
int Bar::func2(int x) { return x + 3; }
|
|
inline int Bar::func3(int x) { return x + 4; }
|
|
|
|
int BarI::func2(int x) { return x + 3; }
|
|
inline int BarI::func3(int x) { return x + 4; }
|
|
#endif
|
|
|
|
//--- usr/local/include/vtable.h
|
|
// Simple test class with no virtual functions. There should be no vtable or
|
|
// RTTI.
|
|
namespace test1 {
|
|
class Simple {
|
|
public:
|
|
void run();
|
|
};
|
|
} // end namespace test1
|
|
|
|
// Simple test class with virtual function. There should be an external vtable
|
|
// and RTTI.
|
|
namespace test2 {
|
|
class Simple {
|
|
public:
|
|
virtual void run();
|
|
};
|
|
} // end namespace test2
|
|
|
|
// Abstract class with no sub classes. There should be no vtable or RTTI.
|
|
namespace test3 {
|
|
class Abstract {
|
|
public:
|
|
virtual ~Abstract() {}
|
|
virtual void run() = 0;
|
|
};
|
|
} // end namespace test3
|
|
|
|
// Abstract base class with a sub class. There should be weak-def RTTI for the
|
|
// abstract base class.
|
|
// The sub-class should have vtable and RTTI.
|
|
namespace test4 {
|
|
class Base {
|
|
public:
|
|
virtual ~Base() {}
|
|
virtual void run() = 0;
|
|
};
|
|
|
|
class Sub : public Base {
|
|
public:
|
|
void run() override;
|
|
};
|
|
} // end namespace test4
|
|
|
|
// Abstract base class with a sub class. Same as above, but with a user defined
|
|
// inlined destructor.
|
|
namespace test5 {
|
|
class Base {
|
|
public:
|
|
virtual ~Base() {}
|
|
virtual void run() = 0;
|
|
};
|
|
|
|
class Sub : public Base {
|
|
public:
|
|
virtual ~Sub() {}
|
|
void run() override;
|
|
};
|
|
} // end namespace test5
|
|
|
|
// Abstract base class with a sub class. Same as above, but with a different
|
|
// inlined key method.
|
|
namespace test6 {
|
|
class Base {
|
|
public:
|
|
virtual ~Base() {}
|
|
virtual void run() = 0;
|
|
};
|
|
|
|
class Sub : public Base {
|
|
public:
|
|
virtual void foo() {}
|
|
void run() override;
|
|
};
|
|
} // end namespace test6
|
|
|
|
// Abstract base class with a sub class. Overloaded method is implemented
|
|
// inline. No vtable or RTTI.
|
|
namespace test7 {
|
|
class Base {
|
|
public:
|
|
virtual ~Base() {}
|
|
virtual bool run() = 0;
|
|
};
|
|
|
|
class Sub : public Base {
|
|
public:
|
|
bool run() override { return true; }
|
|
};
|
|
} // end namespace test7
|
|
|
|
// Abstract base class with a sub class. Overloaded method has no inline
|
|
// attribute and is recognized as key method,
|
|
// but is later implemented inline. Weak-def RTTI only.
|
|
namespace test8 {
|
|
class Base {
|
|
public:
|
|
virtual ~Base() {}
|
|
virtual void run() = 0;
|
|
};
|
|
|
|
class Sub : public Base {
|
|
public:
|
|
void run() override;
|
|
};
|
|
|
|
inline void Sub::run() {}
|
|
} // end namespace test8
|
|
|
|
namespace test9 {
|
|
class Base {
|
|
public:
|
|
virtual ~Base() {}
|
|
virtual void run1() = 0;
|
|
virtual void run2() = 0;
|
|
};
|
|
|
|
class Sub : public Base {
|
|
public:
|
|
void run1() override {}
|
|
void run2() override;
|
|
};
|
|
|
|
inline void Sub::run2() {}
|
|
} // end namespace test9
|
|
|
|
namespace test10 {
|
|
class Base {
|
|
public:
|
|
virtual ~Base() {}
|
|
virtual void run1() = 0;
|
|
virtual void run2() = 0;
|
|
};
|
|
|
|
class Sub : public Base {
|
|
public:
|
|
void run1() override {}
|
|
inline void run2() override;
|
|
};
|
|
|
|
void Sub::run2() {}
|
|
} // end namespace test10
|
|
|
|
namespace test11 {
|
|
class Base {
|
|
public:
|
|
virtual ~Base() {}
|
|
virtual void run1() = 0;
|
|
virtual void run2() = 0;
|
|
virtual void run3() = 0;
|
|
};
|
|
|
|
class Sub : public Base {
|
|
public:
|
|
void run1() override {}
|
|
void run2() override;
|
|
void run3() override;
|
|
};
|
|
|
|
inline void Sub::run2() {}
|
|
} // end namespace test11
|
|
|
|
namespace test12 {
|
|
template <class T> class Simple {
|
|
public:
|
|
virtual void foo() {}
|
|
};
|
|
extern template class Simple<int>;
|
|
} // end namespace test12
|
|
|
|
namespace test13 {
|
|
class Base {
|
|
public:
|
|
virtual ~Base() {}
|
|
virtual void run1() = 0;
|
|
virtual void run2() {};
|
|
virtual void run3(); // key function.
|
|
};
|
|
|
|
class Sub : public Base {
|
|
public:
|
|
void run1() override {}
|
|
void run2() override {}
|
|
};
|
|
|
|
} // end namespace test13
|
|
|
|
namespace test14 {
|
|
|
|
class __attribute__((visibility("hidden"))) Base
|
|
{
|
|
public:
|
|
Base() {}
|
|
virtual ~Base(); // keyfunction.
|
|
virtual void run1() const = 0;
|
|
};
|
|
|
|
class Sub : public Base
|
|
{
|
|
public:
|
|
Sub();
|
|
virtual ~Sub();
|
|
virtual void run1() const;
|
|
void run2() const {}
|
|
};
|
|
|
|
} // end namespace test14
|
|
|
|
namespace test15 {
|
|
|
|
class Base {
|
|
public:
|
|
virtual ~Base() {}
|
|
virtual void run() {};
|
|
};
|
|
|
|
class Base1 {
|
|
public:
|
|
virtual ~Base1() {}
|
|
virtual void run1() {};
|
|
};
|
|
|
|
class Sub : public Base, public Base1 {
|
|
public:
|
|
Sub() {}
|
|
~Sub();
|
|
void run() override;
|
|
void run1() override;
|
|
};
|
|
|
|
class Sub1 : public Base, public Base1 {
|
|
public:
|
|
Sub1() {}
|
|
~Sub1() = default;
|
|
void run() override;
|
|
void run1() override;
|
|
};
|
|
|
|
} // end namespace test15
|
|
|
|
//--- usr/local/include/templates.h
|
|
#ifndef TEMPLATES_H
|
|
#define TEMPLATES_H
|
|
|
|
namespace templates {
|
|
|
|
// Full specialization.
|
|
template <class T> int foo1(T a) { return 1; }
|
|
template <> int foo1<int>(int a);
|
|
extern template int foo1<short>(short a);
|
|
|
|
template <class T> int foo2(T a);
|
|
|
|
// Partial specialization.
|
|
template <class A, class B> class Partial {
|
|
static int run(A a, B b) { return a + b; }
|
|
};
|
|
|
|
template <class A> class Partial<A, int> {
|
|
static int run(A a, int b) { return a - b; }
|
|
};
|
|
|
|
template <class T> class Foo {
|
|
public:
|
|
Foo();
|
|
~Foo();
|
|
};
|
|
|
|
template <class T> class Bar {
|
|
public:
|
|
Bar();
|
|
~Bar() {}
|
|
|
|
inline int bazinga() { return 7; }
|
|
};
|
|
|
|
extern template class Bar<int>;
|
|
|
|
class Bazz {
|
|
public:
|
|
Bazz() {}
|
|
|
|
template <class T> int buzz(T a);
|
|
|
|
float implicit() const { return foo1(0.0f); }
|
|
};
|
|
|
|
template <class T> int Bazz::buzz(T a) { return sizeof(T); }
|
|
|
|
template <class T> struct S { static int x; };
|
|
|
|
template <class T> int S<T>::x = 0;
|
|
|
|
} // end namespace templates.
|
|
|
|
#endif
|
|
|
|
|
|
//--- inputs.json.in
|
|
{
|
|
"headers": [ {
|
|
"path" : "DSTROOT/usr/include/basic.h",
|
|
"type" : "public"
|
|
},
|
|
{
|
|
"path" : "DSTROOT/usr/local/include/vtable.h",
|
|
"type" : "private"
|
|
},
|
|
{
|
|
"path" : "DSTROOT/usr/local/include/templates.h",
|
|
"type" : "private"
|
|
}
|
|
],
|
|
"version": "3"
|
|
}
|
|
|
|
//--- expected-no-rtti.tbd
|
|
{
|
|
"main_library": {
|
|
"compatibility_versions": [
|
|
{
|
|
"version": "0"
|
|
}
|
|
],
|
|
"current_versions": [
|
|
{
|
|
"version": "0"
|
|
}
|
|
],
|
|
"exported_symbols": [
|
|
{
|
|
"data": {
|
|
"global": [
|
|
"__ZTVN6test143SubE", "__ZTVN6test113SubE", "__ZTVN5test26SimpleE",
|
|
"__ZTVN5test53SubE", "__ZTVN6test154Sub1E", "__ZTVN6test153SubE",
|
|
"__ZN3Bar1yE", "__ZTVN5test43SubE", "__ZTVN5test63SubE",
|
|
"__ZTVN6test134BaseE"
|
|
],
|
|
"weak": [
|
|
"__ZTVN6test126SimpleIiEE"
|
|
]
|
|
},
|
|
"text": {
|
|
"global": [
|
|
"__ZN6test153Sub3runEv", "__ZN6test154Sub13runEv",
|
|
"__Z3bari", "__ZThn8_N6test153SubD1Ev",
|
|
"__ZNK6test143Sub4run1Ev", "__ZN6test154Sub14run1Ev",
|
|
"__ZThn8_N6test153Sub4run1Ev", "__ZN6test143SubD1Ev",
|
|
"__ZN6test134Base4run3Ev", "__ZN5test16Simple3runEv",
|
|
"__ZN5test43Sub3runEv", "__ZN6test113Sub4run3Ev", "__ZN6test153SubD2Ev",
|
|
"__ZN5test53Sub3runEv", "__ZN6test153SubD1Ev", "__ZN6test143SubC1Ev",
|
|
"__ZN9templates4foo1IiEEiT_", "__ZN6test143SubC2Ev", "__ZN5test63Sub3runEv",
|
|
"__ZN5test26Simple3runEv", "__ZN6test153SubD0Ev",
|
|
"__ZN6test143SubD2Ev", "__ZN6test153Sub4run1Ev", "__ZN6test143SubD0Ev",
|
|
"__ZThn8_N6test153SubD0Ev", "__ZThn8_N6test154Sub14run1Ev", "_cFunc"
|
|
],
|
|
"weak": [
|
|
"__ZN9templates3BarIiED2Ev", "__ZN9templates3BarIiEC2Ev",
|
|
"__ZN9templates3BarIiEC1Ev", "__ZN9templates3BarIiED1Ev",
|
|
"__ZN6test126SimpleIiE3fooEv", "__ZN9templates3BarIiE7bazingaEv",
|
|
"__ZN9templates4foo1IsEEiT_"
|
|
]
|
|
}
|
|
}
|
|
],
|
|
"flags": [
|
|
{
|
|
"attributes": [
|
|
"not_app_extension_safe"
|
|
]
|
|
}
|
|
],
|
|
"install_names": [
|
|
{
|
|
"name": "@rpath/lib/libcpp.dylib"
|
|
}
|
|
],
|
|
"target_info": [
|
|
{
|
|
"min_deployment": "13.1",
|
|
"target": "arm64-macos"
|
|
}
|
|
]
|
|
},
|
|
"tapi_tbd_version": 5
|
|
}
|
|
|
|
//--- expected-rtti.tbd
|
|
{
|
|
"main_library": {
|
|
"compatibility_versions": [
|
|
{
|
|
"version": "0"
|
|
}
|
|
],
|
|
"current_versions": [
|
|
{
|
|
"version": "0"
|
|
}
|
|
],
|
|
"exported_symbols": [
|
|
{
|
|
"data": {
|
|
"global": [
|
|
"__ZTVN6test143SubE", "__ZTIN5test63SubE", "__ZTSN5test26SimpleE",
|
|
"__ZTIN6test153SubE", "__ZTVN6test113SubE", "__ZTIN5test43SubE",
|
|
"__ZTIN6test134BaseE", "__ZTVN5test26SimpleE", "__ZTIN5test26SimpleE",
|
|
"__ZTSN6test134BaseE", "__ZTVN6test154Sub1E", "__ZTVN5test43SubE",
|
|
"__ZTVN5test63SubE", "__ZTSN5test43SubE", "__ZTSN6test113SubE",
|
|
"__ZTIN6test154Sub1E", "__ZTSN6test153SubE", "__ZTSN5test63SubE",
|
|
"__ZTSN6test154Sub1E", "__ZTIN6test113SubE", "__ZTSN6test143SubE",
|
|
"__ZTVN5test53SubE", "__ZTIN6test143SubE", "__ZTVN6test153SubE",
|
|
"__ZTIN5test53SubE", "__ZN3Bar1yE", "__ZTVN6test134BaseE",
|
|
"__ZTSN5test53SubE"
|
|
],
|
|
"weak": [
|
|
"__ZTVN6test126SimpleIiEE"
|
|
]
|
|
},
|
|
"text": {
|
|
"global": [
|
|
"__ZN6test154Sub13runEv", "__ZN6test153Sub3runEv", "__ZNK6test143Sub4run1Ev",
|
|
"__ZN6test134Base4run3Ev", "__ZN5test16Simple3runEv", "__ZN6test153SubD2Ev",
|
|
"__ZN6test143SubC2Ev", "__ZN5test63Sub3runEv", "__ZN6test153SubD0Ev",
|
|
"__ZN6test143SubD2Ev", "__ZThn8_N6test154Sub14run1Ev",
|
|
"__ZThn8_N6test153SubD0Ev", "__Z3bari", "__ZThn8_N6test153SubD1Ev",
|
|
"__ZN6test154Sub14run1Ev", "__ZThn8_N6test153Sub4run1Ev",
|
|
"__ZN6test143SubD1Ev", "__ZN5test43Sub3runEv",
|
|
"__ZN6test113Sub4run3Ev", "__ZN5test53Sub3runEv", "__ZN6test143SubC1Ev",
|
|
"__ZN6test153SubD1Ev", "__ZN9templates4foo1IiEEiT_", "__ZN5test26Simple3runEv",
|
|
"__ZN6test153Sub4run1Ev", "__ZN6test143SubD0Ev", "_cFunc"
|
|
],
|
|
"weak": [
|
|
"__ZN9templates3BarIiEC2Ev", "__ZN9templates3BarIiEC1Ev",
|
|
"__ZN9templates3BarIiED1Ev", "__ZN6test126SimpleIiE3fooEv",
|
|
"__ZN9templates4foo1IsEEiT_", "__ZN9templates3BarIiED2Ev",
|
|
"__ZN9templates3BarIiE7bazingaEv"
|
|
]
|
|
}
|
|
}
|
|
],
|
|
"flags": [
|
|
{
|
|
"attributes": [
|
|
"not_app_extension_safe"
|
|
]
|
|
}
|
|
],
|
|
"install_names": [
|
|
{
|
|
"name": "@rpath/lib/libcpp.dylib"
|
|
}
|
|
],
|
|
"target_info": [
|
|
{
|
|
"min_deployment": "13.1",
|
|
"target": "arm64-macos"
|
|
}
|
|
]
|
|
},
|
|
"tapi_tbd_version": 5
|
|
}
|
|
|