Skip to content

Commit 3da8967

Browse files
authored
Merge pull request #1655 from clasp-developers/intrinsic-fallback
Add intrinsic fallbacks
2 parents c0d6df3 + 3607398 commit 3da8967

File tree

7 files changed

+53
-51
lines changed

7 files changed

+53
-51
lines changed

src/lisp/kernel/cleavir/landing-pad.lisp

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,8 @@
156156
(when cleanup-p (llvm-sys:set-cleanup lpad t))
157157
(cmp:irc-store exception-structure *exn.slot*)
158158
(cmp:irc-store exception-selector *ehselector.slot*)
159-
(let* ((typeid (%intrinsic-call
160-
#+(or llvm15 llvm16 llvm17)"llvm.eh.typeid.for"
161-
#-(or llvm15 llvm16 llvm17)"llvm.eh.typeid.for.p0"
162-
(list (cmp:irc-exception-typeid* 'cmp:typeid-core-unwind))))
159+
(let* ((typeid (%intrinsic-call cmp:+intrinsic/llvm.eh.typeid.for.p0+
160+
(list (cmp:irc-exception-typeid* 'cmp:typeid-core-unwind))))
163161
(matches-type (cmp:irc-icmp-eq exception-selector typeid)))
164162
;; If the exception is Clasp's Unwind exception, we handle it.
165163
;; Otherwise we go to the cleanup, or perhaps directly to the resume.
@@ -289,10 +287,8 @@
289287
(bb (cmp:irc-basic-block-create "escape-m-v-prog1")))
290288
(cmp:irc-begin-block bb)
291289
;; Lose the saved values alloca.
292-
(%intrinsic-call
293-
#+(or llvm15 llvm16 llvm17)"llvm.stackrestore"
294-
#-(or llvm15 llvm16 llvm17)"llvm.stackrestore.p0"
295-
(list stackpos))
290+
(%intrinsic-call cmp:+intrinsic/llvm.stackrestore.p0+
291+
(list stackpos))
296292
;; Continue
297293
(cmp:irc-br
298294
(maybe-entry-processor (cleavir-bir:parent instruction) tags))
@@ -305,10 +301,8 @@
305301
(let ((bb (cmp:irc-basic-block-create "escape-m-v-prog1")))
306302
(cmp:irc-begin-block bb)
307303
;; Lose the saved values alloca.
308-
(%intrinsic-call
309-
#+(or llvm15 llvm16 llvm17)"llvm.stackrestore"
310-
#-(or llvm15 llvm16 llvm17)"llvm.stackrestore.p0"
311-
(list stackpos))
304+
(%intrinsic-call cmp:+intrinsic/llvm.stackrestore.p0+
305+
(list stackpos))
312306
;; Continue
313307
(cmp:irc-br
314308
(maybe-entry-processor (cleavir-bir:parent inst) tags))

src/lisp/kernel/cleavir/translate.lisp

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -210,10 +210,8 @@
210210
(nvals (cmp:irc-tmv-nret tmv))
211211
(primary (cmp:irc-tmv-primary tmv))
212212
;; NOTE: Must be done BEFORE the alloca*fea.
213-
(save (%intrinsic-call
214-
#+(or llvm15 llvm16 llvm17)"llvm.stacksave"
215-
#-(or llvm15 llvm16 llvm17)"llvm.stacksave.p0"
216-
nil))
213+
(save (%intrinsic-call cmp:+intrinsic/llvm.stacksave.p0+
214+
nil))
217215
(mv-temp (cmp:alloca-temp-values nvals))
218216
(label (datum-name-as-string outp))
219217
(s2 (cmp::irc-make-vaslist nvals mv-temp label)))
@@ -235,18 +233,14 @@
235233
(%intrinsic-call "cc_set_dynenv_stack" (list old-de-stack)))))
236234
(defmethod undo-dynenv ((dynenv bir:values-save) tmv)
237235
(declare (ignore tmv))
238-
(%intrinsic-call
239-
#+(or llvm15 llvm16 llvm17)"llvm.stackrestore"
240-
#-(or llvm15 llvm16 llvm17)"llvm.stackrestore.p0"
241-
(list (dynenv-storage dynenv))))
236+
(%intrinsic-call cmp:+intrinsic/llvm.stackrestore.p0+
237+
(list (dynenv-storage dynenv))))
242238
(defmethod undo-dynenv ((dynenv bir:values-collect) tmv)
243239
(declare (ignore tmv))
244240
(let ((storage (dynenv-storage dynenv)))
245241
(when storage
246-
(%intrinsic-call
247-
#+(or llvm15 llvm16 llvm17)"llvm.stackrestore"
248-
#-(or llvm15 llvm16 llvm17)"llvm.stackrestore.p0"
249-
(list storage)))))
242+
(%intrinsic-call cmp:+intrinsic/llvm.stackrestore.p0+
243+
(list storage)))))
250244

251245
(defun translate-local-unwind (jump tmv)
252246
(loop with target = (bir:dynamic-environment
@@ -1528,10 +1522,8 @@
15281522
for n = size then (cmp:irc-add n size "sum-nret")
15291523
collect n))
15301524
(n-total-values (first (last partial-sums)))
1531-
(stacksave (%intrinsic-call
1532-
#+(or llvm15 llvm16 llvm17)"llvm.stacksave"
1533-
#-(or llvm15 llvm16 llvm17)"llvm.stacksave.p0"
1534-
nil "values-collect"))
1525+
(stacksave (%intrinsic-call cmp:+intrinsic/llvm.stacksave.p0+
1526+
nil "values-collect"))
15351527
(tv-size
15361528
;; In order to store the primary value unconditionally below, we
15371529
;; need to allocate one extra word. This is important for the
@@ -1622,10 +1614,8 @@
16221614
in)
16231615
((eq irt :multiple-values)
16241616
(let* ((nret (cmp:irc-tmv-nret in))
1625-
(save (%intrinsic-call
1626-
#+(or llvm15 llvm16 llvm17)"llvm.stacksave"
1627-
#-(or llvm15 llvm16 llvm17)"llvm.stacksave.p0"
1628-
nil))
1617+
(save (%intrinsic-call cmp:+intrinsic/llvm.stacksave.p0+
1618+
nil))
16291619
(values (cmp:alloca-temp-values nret)))
16301620
(setf (dynenv-storage inst) save)
16311621
(%intrinsic-call "cc_save_values"

src/lisp/kernel/cmp/cmpexports.lisp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
codegen-startup-shutdown
88
jit-startup-shutdown-function-names
99
irc-simple-function-create
10+
find-intrinsic-name
11+
+intrinsic/llvm.eh.typeid.for.p0+
12+
+intrinsic/llvm.stacksave.p0+
13+
+intrinsic/llvm.stackrestore.p0+
1014
*primitives*
1115
primitive-argument-types
1216
primitive-varargs

src/lisp/kernel/cmp/cmpintrinsics.lisp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,3 +1242,16 @@ is dumped to a file before the block and after the block."
12421242
(format t "~a Function ~a~%" num-instructions func)))
12431243
(format t "~a total~%" total)))
12441244

1245+
(defun find-intrinsic-name (&rest names)
1246+
(dolist (name names (error "Unable to find a valid intrinsic from ~s" names))
1247+
(unless (zerop (llvm-sys:lookup-intrinsic-id name))
1248+
(return name))))
1249+
1250+
(defvar +intrinsic/llvm.eh.typeid.for.p0+
1251+
(find-intrinsic-name "llvm.eh.typeid.for.p0" "llvm.eh.typeid.for"))
1252+
1253+
(defvar +intrinsic/llvm.stacksave.p0+
1254+
(find-intrinsic-name "llvm.stacksave.p0" "llvm.stacksave"))
1255+
1256+
(defvar +intrinsic/llvm.stackrestore.p0+
1257+
(find-intrinsic-name "llvm.stackrestore.p0" "llvm.stackrestore"))

src/lisp/kernel/cmp/primitives.lisp

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,7 @@
124124
(primitive "__gxx_personality_v0" :i32 nil :varargs t)
125125
(primitive "__cxa_begin_catch" :i8* (list :i8*) )
126126
(primitive-unwinds "__cxa_end_catch" :void nil)
127-
(primitive #+(or llvm15 llvm16 llvm17)"llvm.eh.typeid.for"
128-
#-(or llvm15 llvm16 llvm17)"llvm.eh.typeid.for.p0"
129-
:i32 (list :i8*))
127+
(primitive +intrinsic/llvm.eh.typeid.for.p0+ :i32 (list :i8*))
130128
(primitive-unwinds "cc_overflowed_signed_bignum" :t* (list :i64))
131129
(primitive "llvm.sadd.with.overflow.i32" :{i32.i1} (list :i32 :i32))
132130
(primitive "llvm.sadd.with.overflow.i64" :{i64.i1} (list :i64 :i64))
@@ -190,14 +188,8 @@
190188
(primitive "llvm.lifetime.start" :void (list :i64 :i8*))
191189
(primitive "llvm.lifetime.end" :void (list :i64 :i8*))
192190

193-
(primitive
194-
#+(or llvm15 llvm16 llvm17)"llvm.stacksave"
195-
#-(or llvm15 llvm16 llvm17)"llvm.stacksave.p0"
196-
:i8* nil)
197-
(primitive
198-
#+(or llvm15 llvm16 llvm17)"llvm.stackrestore"
199-
#-(or llvm15 llvm16 llvm17)"llvm.stackrestore.p0"
200-
:void (list :i8*))
191+
(primitive +intrinsic/llvm.stacksave.p0+ :i8* nil)
192+
(primitive +intrinsic/llvm.stackrestore.p0+ :void (list :i8*))
201193

202194
(primitive "llvm.memcpy.p0.p0.i64" :void (list :i8* :i8* :i64 :i1))
203195
(primitive "llvm.memmove.p0.p0.i64" :void (list :i8* :i8* :i64 :i1))

src/llvmo/llvmoExpose.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,9 @@ CL_EXTERN_DEFMETHOD(Triple_O, &llvm::Triple::getEnvironmentName);
748748
CL_LISPIFY_NAME(getOSAndEnvironmentName);
749749
CL_EXTERN_DEFMETHOD(Triple_O, &llvm::Triple::getOSAndEnvironmentName);
750750

751+
CL_PKG_NAME(LlvmoPkg, "lookup-intrinsic-id");
752+
CL_EXTERN_DEFUN((llvm::Intrinsic::ID(*)(llvm::StringRef Name))&llvm::Function::lookupIntrinsicID);
753+
751754
SYMBOL_EXPORT_SC_(LlvmoPkg, ArchType);
752755
SYMBOL_EXPORT_SC_(LlvmoPkg, ArchType_UnknownArch);
753756
SYMBOL_EXPORT_SC_(LlvmoPkg, ArchType_arm);

src/llvmo/runtimeJit.cc

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -224,16 +224,21 @@ class ClaspAllocator : public JITLinkMemoryManager {
224224
llvm::orc::ExecutorAddr ea((uintptr_t)execMemory);
225225
OnFinalized(llvm::jitlink::InProcessMemoryManager::FinalizedAlloc(ea));
226226
}
227+
227228
virtual void abandon(OnAbandonedFunction OnAbandoned) {
228-
printf("%s:%d:%s I have no idea what to do here - calling OnAbandoned and continuing\n", __FILE__, __LINE__, __FUNCTION__);
229-
if (getenv("CLASP_TRAP_ONABANDONED")!=NULL) {
230-
printf("!\n!\n!\n!\n You set CLASP_TRAP_ONABANDONED - sleeping for 9999 seconds - connect using debugger to pid %d\n!\n!\n!\n!\n", getpid());
231-
sleep(9999);
229+
size_t PageSize = getpagesize();
230+
for (auto& KV : BL.segments()) {
231+
auto& Seg = KV.second;
232+
sys::MemoryBlock MB(Seg.WorkingMem, alignTo(Seg.ContentSize + Seg.ZeroFillSize, PageSize));
233+
auto code = sys::Memory::releaseMappedMemory(MB);
234+
if (code) {
235+
OnAbandoned(std::move(llvm::errorCodeToError(code)));
236+
return;
237+
}
232238
}
233-
printf("!\n!\n!\n!\n If you want to trap here set CLASP_TRAP_ONABANDONED - restarting for now\n!\n!\n!\n!\n");
234-
exit(1);
235-
//OnAbandoned(std::move(llvm::Error::success()));
239+
OnAbandoned(std::move(llvm::Error::success()));
236240
}
241+
237242
private:
238243
Error applyProtections() {
239244
JITMemoryReadExecute(BL);
@@ -960,7 +965,8 @@ void ClaspReturnObjectBuffer(std::unique_ptr<llvm::MemoryBuffer> buffer) {
960965

961966
ObjectFile_sp code = lookupObjectFile(buffer->getBufferIdentifier().str());
962967
code->_MemoryBuffer = std::move(buffer);
963-
// printf("%s:%d:%s loadedObjectFile %p _MemoryBuffer = %p\n", __FILE__, __LINE__, __FUNCTION__, (void*)&*code, (void*)code->_MemoryBuffer.get() );
968+
// printf("%s:%d:%s loadedObjectFile %p _MemoryBuffer = %p\n", __FILE__, __LINE__, __FUNCTION__, (void*)&*code,
969+
// (void*)code->_MemoryBuffer.get() );
964970
auto objf = code->getObjectFile();
965971
llvm::object::ObjectFile& of = *objf->get();
966972
#if defined(_TARGET_OS_LINUX)

0 commit comments

Comments
 (0)