Skip to content

Commit 494ff2d

Browse files
committed
[cxx-interop] Flip the switch: only import safe APIs.
1 parent 03e4e5c commit 494ff2d

39 files changed

+630
-189
lines changed

include/swift/ClangImporter/ClangImporterRequests.h

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,109 @@ class ClangRecordMemberLookup
178178
evaluate(Evaluator &evaluator, ClangRecordMemberLookupDescriptor desc) const;
179179
};
180180

181+
enum class CxxRecordSemanticsKind {
182+
Trivial,
183+
Owned,
184+
Reference,
185+
Iterator,
186+
// An API that has be annotated as explicitly unsafe, but still importable.
187+
// TODO: we should rename these APIs.
188+
ExplicitlyUnsafe,
189+
// A record that has custom lifetime operations which we cannot prove are
190+
// safe.
191+
UnsafeLifetimeOperation,
192+
// A record that contains a pointer (aka non-trivial type).
193+
UnsafePointerMember
194+
};
195+
196+
struct CxxRecordSemanticsDescriptor final {
197+
const clang::CXXRecordDecl *decl;
198+
199+
CxxRecordSemanticsDescriptor(const clang::CXXRecordDecl *decl) : decl(decl) {}
200+
201+
friend llvm::hash_code hash_value(const CxxRecordSemanticsDescriptor &desc) {
202+
return llvm::hash_combine(desc.decl);
203+
}
204+
205+
friend bool operator==(const CxxRecordSemanticsDescriptor &lhs,
206+
const CxxRecordSemanticsDescriptor &rhs) {
207+
return lhs.decl == rhs.decl;
208+
}
209+
210+
friend bool operator!=(const CxxRecordSemanticsDescriptor &lhs,
211+
const CxxRecordSemanticsDescriptor &rhs) {
212+
return !(lhs == rhs);
213+
}
214+
};
215+
216+
void simple_display(llvm::raw_ostream &out, CxxRecordSemanticsDescriptor desc);
217+
SourceLoc extractNearestSourceLoc(CxxRecordSemanticsDescriptor desc);
218+
219+
/// What pattern does this C++ API fit? Uses attributes such as
220+
/// import_owned and import_as_reference to determine the pattern.
221+
class CxxRecordSemantics
222+
: public SimpleRequest<CxxRecordSemantics,
223+
CxxRecordSemanticsKind(CxxRecordSemanticsDescriptor),
224+
RequestFlags::Cached> {
225+
public:
226+
using SimpleRequest::SimpleRequest;
227+
228+
// Caching
229+
bool isCached() const { return true; }
230+
231+
// Source location
232+
SourceLoc getNearestLoc() const { return SourceLoc(); };
233+
234+
private:
235+
friend SimpleRequest;
236+
237+
// Evaluation.
238+
CxxRecordSemanticsKind evaluate(Evaluator &evaluator,
239+
CxxRecordSemanticsDescriptor) const;
240+
};
241+
242+
struct SafeUseOfCxxDeclDescriptor final {
243+
const clang::Decl *decl;
244+
245+
SafeUseOfCxxDeclDescriptor(const clang::Decl *decl) : decl(decl) {}
246+
247+
friend llvm::hash_code hash_value(const SafeUseOfCxxDeclDescriptor &desc) {
248+
return llvm::hash_combine(desc.decl);
249+
}
250+
251+
friend bool operator==(const SafeUseOfCxxDeclDescriptor &lhs,
252+
const SafeUseOfCxxDeclDescriptor &rhs) {
253+
return lhs.decl == rhs.decl;
254+
}
255+
256+
friend bool operator!=(const SafeUseOfCxxDeclDescriptor &lhs,
257+
const SafeUseOfCxxDeclDescriptor &rhs) {
258+
return !(lhs == rhs);
259+
}
260+
};
261+
262+
void simple_display(llvm::raw_ostream &out, SafeUseOfCxxDeclDescriptor desc);
263+
SourceLoc extractNearestSourceLoc(SafeUseOfCxxDeclDescriptor desc);
264+
265+
class IsSafeUseOfCxxDecl
266+
: public SimpleRequest<IsSafeUseOfCxxDecl, bool(SafeUseOfCxxDeclDescriptor),
267+
RequestFlags::Cached> {
268+
public:
269+
using SimpleRequest::SimpleRequest;
270+
271+
// Caching
272+
bool isCached() const { return true; }
273+
274+
// Source location
275+
SourceLoc getNearestLoc() const { return SourceLoc(); };
276+
277+
private:
278+
friend SimpleRequest;
279+
280+
// Evaluation.
281+
bool evaluate(Evaluator &evaluator, SafeUseOfCxxDeclDescriptor desc) const;
282+
};
283+
181284
#define SWIFT_TYPEID_ZONE ClangImporter
182285
#define SWIFT_TYPEID_HEADER "swift/ClangImporter/ClangImporterTypeIDZone.def"
183286
#include "swift/Basic/DefineTypeIDZone.h"

include/swift/ClangImporter/ClangImporterTypeIDZone.def

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,9 @@ SWIFT_REQUEST(ClangImporter, CXXNamespaceMemberLookup,
2424
SWIFT_REQUEST(ClangImporter, ClangRecordMemberLookup,
2525
Decl *(ClangRecordMemberLookupDescriptor), Uncached,
2626
NoLocationInfo)
27+
SWIFT_REQUEST(ClangImporter, CxxRecordSemantics,
28+
CxxRecordSemanticsKind(const clang::CXXRecordDecl *), Cached,
29+
NoLocationInfo)
30+
SWIFT_REQUEST(ClangImporter, IsSafeUseOfCxxDecl,
31+
bool(SafeUseOfCxxRecordDescriptor), Cached,
32+
NoLocationInfo)

0 commit comments

Comments
 (0)