@@ -52,6 +52,24 @@ using namespace llvm;
52
52
#if LLVM_VERSION_MAJOR >= 14
53
53
#define addAttribute addAttributeAtIndex
54
54
#endif
55
+
56
+ // ! Returns whether changed.
57
+ bool preserveLinkage (bool Begin, Function &F) {
58
+ if (Begin && !F.hasFnAttribute (" prev_fixup" )) {
59
+ F.addFnAttr (" prev_fixup" );
60
+ if (F.hasFnAttribute (Attribute::AlwaysInline))
61
+ F.addFnAttr (" prev_always_inline" );
62
+ if (F.hasFnAttribute (Attribute::NoInline))
63
+ F.addFnAttr (" prev_no_inline" );
64
+ F.addFnAttr (" prev_linkage" , std::to_string (F.getLinkage ()));
65
+ F.setLinkage (Function::LinkageTypes::ExternalLinkage);
66
+ F.addFnAttr (Attribute::NoInline);
67
+ F.removeFnAttr (Attribute::AlwaysInline);
68
+ return true ;
69
+ }
70
+ return false ;
71
+ }
72
+
55
73
bool preserveNVVM (bool Begin, Function &F) {
56
74
bool changed = false ;
57
75
std::map<std::string, std::pair<std::string, std::string>> Implements;
@@ -129,18 +147,7 @@ bool preserveNVVM(bool Begin, Function &F) {
129
147
break ;
130
148
}
131
149
if (V == &F) {
132
- changed = true ;
133
- if (Begin && !F.hasFnAttribute (" prev_fixup" )) {
134
- F.addFnAttr (" prev_fixup" );
135
- if (F.hasFnAttribute (Attribute::AlwaysInline))
136
- F.addFnAttr (" prev_always_inline" );
137
- if (F.hasFnAttribute (Attribute::NoInline))
138
- F.addFnAttr (" prev_no_inline" );
139
- F.addFnAttr (" prev_linkage" , std::to_string (F.getLinkage ()));
140
- F.setLinkage (Function::LinkageTypes::ExternalLinkage);
141
- F.addFnAttr (Attribute::NoInline);
142
- F.removeFnAttr (Attribute::AlwaysInline);
143
- }
150
+ changed |= preserveLinkage (Begin, F);
144
151
break ;
145
152
}
146
153
}
@@ -334,6 +341,7 @@ bool preserveNVVM(bool Begin, Function &F) {
334
341
" enzyme_deallocator_fn" ,
335
342
llvm::MDTuple::get (F->getContext (),
336
343
{llvm::ValueAsMetadata::get (F)}));
344
+ changed |= preserveLinkage (Begin, *F);
337
345
} else {
338
346
llvm::errs () << " Free fn of __enzyme_allocation_like must be a "
339
347
" function"
0 commit comments