File tree Expand file tree Collapse file tree 16 files changed +59
-28
lines changed Expand file tree Collapse file tree 16 files changed +59
-28
lines changed Original file line number Diff line number Diff line change @@ -57,6 +57,10 @@ struct AArch64TargetABI : TargetABI {
57
57
public:
58
58
AArch64TargetABI () {}
59
59
60
+ llvm::UWTableKind defaultUnwindTableKind () override {
61
+ return isDarwin () ? llvm::UWTableKind::Sync : llvm::UWTableKind::Async;
62
+ }
63
+
60
64
bool returnInArg (TypeFunction *tf, bool ) override {
61
65
Type *rt = tf->next ->toBasetype ();
62
66
if (rt->ty == TY::Tstruct || rt->ty == TY::Tsarray) {
Original file line number Diff line number Diff line change @@ -155,6 +155,17 @@ llvm::CallingConv::ID TargetABI::callingConv(FuncDeclaration *fdecl) {
155
155
return callingConv (tf, fdecl->needThis () || fdecl->isNested ());
156
156
}
157
157
158
+ void TargetABI::setUnwindTableKind (llvm::Function *fn) {
159
+ llvm::UWTableKind kind = defaultUnwindTableKind ();
160
+ if (kind != llvm::UWTableKind::None) {
161
+ #if LDC_LLVM_VER >= 1600
162
+ fn->setUWTableKind (kind);
163
+ #else
164
+ fn->setUWTableKind (kind);
165
+ #endif
166
+ }
167
+ }
168
+
158
169
// ////////////////////////////////////////////////////////////////////////////
159
170
160
171
bool TargetABI::returnInArg (TypeFunction *tf, bool needsThis) {
Original file line number Diff line number Diff line change 19
19
#include " dmd/globals.h"
20
20
#include " gen/dvalue.h"
21
21
#include " llvm/IR/CallingConv.h"
22
+ #include " llvm/Support/CodeGen.h" // for UWTableKind
22
23
#include < vector>
23
24
24
25
class Type ;
@@ -33,6 +34,7 @@ namespace llvm {
33
34
class Type ;
34
35
class Value ;
35
36
class FunctionType ;
37
+ class Function ;
36
38
}
37
39
38
40
// / Transforms function arguments and return values.
@@ -110,14 +112,14 @@ struct TargetABI {
110
112
return name;
111
113
}
112
114
113
- // / Returns true if all functions require the LLVM uwtable attribute.
114
- virtual bool needsUnwindTables () {
115
- // Condensed logic of Clang implementations of
116
- // `clang::ToolChain::IsUnwindTablesDefault()` based on early Clang 5.0.
117
- return global.params .targetTriple ->getArch () == llvm::Triple::x86_64 ||
118
- global.params .targetTriple ->getOS () == llvm::Triple::NetBSD;
115
+ // / Returns the default unwind-table kind for all functions.
116
+ // / Analogous to clang's ToolChain::getDefaultUnwindTableLevel().
117
+ virtual llvm::UWTableKind defaultUnwindTableKind () {
118
+ return llvm::UWTableKind::None;
119
119
}
120
120
121
+ void setUnwindTableKind (llvm::Function *fn);
122
+
121
123
// / Returns true if the target is darwin-based.
122
124
bool isDarwin () {
123
125
return global.params .targetTriple ->isOSDarwin ();
Original file line number Diff line number Diff line change @@ -26,6 +26,13 @@ struct ArmTargetABI : TargetABI {
26
26
CompositeToArray64 compositeToArray64;
27
27
IntegerRewrite integerRewrite;
28
28
29
+ llvm::UWTableKind defaultUnwindTableKind () override {
30
+ const auto &triple = *global.params .targetTriple ;
31
+ return triple.isOSLinux () || triple.isOSOpenBSD ()
32
+ ? llvm::UWTableKind::None
33
+ : llvm::UWTableKind::Async;
34
+ }
35
+
29
36
bool returnInArg (TypeFunction *tf, bool ) override {
30
37
// AAPCS 5.4 wants composites > 4-bytes returned by arg except for
31
38
// Homogeneous Aggregates of up-to 4 float types (6.1.2.1) - an HFA.
Original file line number Diff line number Diff line change @@ -44,10 +44,6 @@ struct NVPTXTargetABI : TargetABI {
44
44
pointerRewite.applyTo (arg);
45
45
}
46
46
}
47
- // There are no exceptions at all, so no need for unwind tables.
48
- bool needsUnwindTables () override {
49
- return false ;
50
- }
51
47
};
52
48
53
49
TargetABI *createNVPTXABI () { return new NVPTXTargetABI (); }
Original file line number Diff line number Diff line change @@ -36,6 +36,10 @@ struct PPCTargetABI : TargetABI {
36
36
37
37
explicit PPCTargetABI (const bool Is64Bit) : Is64Bit(Is64Bit) {}
38
38
39
+ llvm::UWTableKind defaultUnwindTableKind () override {
40
+ return llvm::UWTableKind::Async;
41
+ }
42
+
39
43
bool returnInArg (TypeFunction *tf, bool ) override {
40
44
Type *rt = tf->next ->toBasetype ();
41
45
Original file line number Diff line number Diff line change @@ -29,6 +29,10 @@ struct PPC64LETargetABI : TargetABI {
29
29
30
30
explicit PPC64LETargetABI () : hfvaToArray(8 ) {}
31
31
32
+ llvm::UWTableKind defaultUnwindTableKind () override {
33
+ return llvm::UWTableKind::Async;
34
+ }
35
+
32
36
bool passByVal (TypeFunction *, Type *t) override {
33
37
t = t->toBasetype ();
34
38
return isPOD (t) &&
Original file line number Diff line number Diff line change @@ -158,6 +158,11 @@ struct RISCV64TargetABI : TargetABI {
158
158
IntegerRewrite integerRewrite;
159
159
160
160
public:
161
+ llvm::UWTableKind defaultUnwindTableKind () override {
162
+ return global.params .targetTriple ->isOSLinux () ? llvm::UWTableKind::Async
163
+ : llvm::UWTableKind::None;
164
+ }
165
+
161
166
Type *vaListType () override {
162
167
// va_list is void*
163
168
return pointerTo (Type::tvoid);
Original file line number Diff line number Diff line change @@ -50,10 +50,6 @@ struct SPIRVTargetABI : TargetABI {
50
50
pointerRewite.applyTo (arg);
51
51
}
52
52
}
53
- // There are no exceptions at all, so no need for unwind tables.
54
- bool needsUnwindTables () override {
55
- return false ;
56
- }
57
53
};
58
54
59
55
TargetABI *createSPIRVABI () { return new SPIRVTargetABI (); }
Original file line number Diff line number Diff line change @@ -116,6 +116,10 @@ struct Win64TargetABI : TargetABI {
116
116
return name;
117
117
}
118
118
119
+ llvm::UWTableKind defaultUnwindTableKind () override {
120
+ return llvm::UWTableKind::Async;
121
+ }
122
+
119
123
bool returnInArg (TypeFunction *tf, bool needsThis) override {
120
124
Type *rt = tf->next ->toBasetype ();
121
125
You can’t perform that action at this time.
0 commit comments