-
Notifications
You must be signed in to change notification settings - Fork 10.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[VE] Support SJLJ exception related instructions
Support EH_SJLJ_LONGJMP, EH_SJLJ_SETJMP, and EH_SJLJ_SETUP_DISPATCH for SjLj exception handling. NC++ uses SjLj exception handling, so implement it first. Add regression tests also. Reviewed By: simoll Differential Revision: https://reviews.llvm.org/D94071
- Loading branch information
Showing
9 changed files
with
1,717 additions
and
45 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
//===-- VEInstrBuilder.h - Aides for building VE insts ----------*- C++ -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file exposes functions that may be used with BuildMI from the | ||
// MachineInstrBuilder.h file to simplify generating frame and constant pool | ||
// references. | ||
// | ||
// For reference, the order of operands for memory references is: | ||
// (Operand), Dest Reg, Base Reg, and either Reg Index or Immediate | ||
// Displacement. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_LIB_TARGET_VE_VEINSTRBUILDER_H | ||
#define LLVM_LIB_TARGET_VE_VEINSTRBUILDER_H | ||
|
||
#include "llvm/CodeGen/MachineInstrBuilder.h" | ||
|
||
namespace llvm { | ||
|
||
/// addFrameReference - This function is used to add a reference to the base of | ||
/// an abstract object on the stack frame of the current function. This | ||
/// reference has base register as the FrameIndex offset until it is resolved. | ||
/// This allows a constant offset to be specified as well... | ||
/// | ||
static inline const MachineInstrBuilder & | ||
addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset = 0, | ||
bool ThreeOp = true) { | ||
if (ThreeOp) | ||
return MIB.addFrameIndex(FI).addImm(0).addImm(Offset); | ||
return MIB.addFrameIndex(FI).addImm(Offset); | ||
} | ||
|
||
} // namespace llvm | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,213 @@ | ||
; RUN: llc < %s -mtriple=ve | FileCheck %s | ||
; RUN: llc < %s -mtriple=ve -relocation-model=pic | \ | ||
; RUN: FileCheck %s -check-prefix=PIC | ||
|
||
%struct.__jmp_buf_tag = type { [25 x i64], i64, [16 x i64] } | ||
|
||
@buf = common global [1 x %struct.__jmp_buf_tag] zeroinitializer, align 8 | ||
|
||
; Function Attrs: noinline nounwind optnone | ||
define signext i32 @t_setjmp() { | ||
; CHECK-LABEL: t_setjmp: | ||
; CHECK: .LBB{{[0-9]+}}_5: | ||
; CHECK-NEXT: st %s18, 48(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s19, 56(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s20, 64(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s21, 72(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s22, 80(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s23, 88(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s24, 96(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s25, 104(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s26, 112(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s27, 120(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s28, 128(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s29, 136(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s30, 144(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s31, 152(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s32, 160(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: st %s33, 168(, %s9) # 8-byte Folded Spill | ||
; CHECK-NEXT: lea %s0, buf@lo | ||
; CHECK-NEXT: and %s0, %s0, (32)0 | ||
; CHECK-NEXT: lea.sl %s0, buf@hi(, %s0) | ||
; CHECK-NEXT: st %s9, (, %s0) | ||
; CHECK-NEXT: st %s11, 16(, %s0) | ||
; CHECK-NEXT: lea %s1, .LBB{{[0-9]+}}_3@lo | ||
; CHECK-NEXT: and %s1, %s1, (32)0 | ||
; CHECK-NEXT: lea.sl %s1, .LBB{{[0-9]+}}_3@hi(, %s1) | ||
; CHECK-NEXT: st %s1, 8(, %s0) | ||
; CHECK-NEXT: # EH_SJlJ_SETUP .LBB{{[0-9]+}}_3 | ||
; CHECK-NEXT: # %bb.1: | ||
; CHECK-NEXT: lea %s0, 0 | ||
; CHECK-NEXT: br.l.t .LBB{{[0-9]+}}_2 | ||
; CHECK-NEXT: .LBB{{[0-9]+}}_3: # Block address taken | ||
; CHECK-NEXT: lea %s0, 1 | ||
; CHECK-NEXT: .LBB{{[0-9]+}}_2: | ||
; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 | ||
; CHECK-NEXT: ld %s33, 168(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s32, 160(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s31, 152(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s30, 144(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s29, 136(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s28, 128(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s27, 120(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s26, 112(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s25, 104(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s24, 96(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s23, 88(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s22, 80(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s21, 72(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s20, 64(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s19, 56(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: ld %s18, 48(, %s9) # 8-byte Folded Reload | ||
; CHECK-NEXT: or %s11, 0, %s9 | ||
; | ||
; PIC-LABEL: t_setjmp: | ||
; PIC: # %bb.0: | ||
; PIC-NEXT: st %s9, (, %s11) | ||
; PIC-NEXT: st %s10, 8(, %s11) | ||
; PIC-NEXT: st %s15, 24(, %s11) | ||
; PIC-NEXT: st %s16, 32(, %s11) | ||
; PIC-NEXT: or %s9, 0, %s11 | ||
; PIC-NEXT: lea %s11, -176(, %s11) | ||
; PIC-NEXT: brge.l %s11, %s8, .LBB0_5 | ||
; PIC-NEXT: # %bb.4: | ||
; PIC-NEXT: ld %s61, 24(, %s14) | ||
; PIC-NEXT: or %s62, 0, %s0 | ||
; PIC-NEXT: lea %s63, 315 | ||
; PIC-NEXT: shm.l %s63, (%s61) | ||
; PIC-NEXT: shm.l %s8, 8(%s61) | ||
; PIC-NEXT: shm.l %s11, 16(%s61) | ||
; PIC-NEXT: monc | ||
; PIC-NEXT: or %s0, 0, %s62 | ||
; PIC-NEXT: .LBB0_5: | ||
; PIC-NEXT: st %s18, 48(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s19, 56(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s20, 64(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s21, 72(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s22, 80(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s23, 88(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s24, 96(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s25, 104(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s26, 112(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s27, 120(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s28, 128(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s29, 136(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s30, 144(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s31, 152(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s32, 160(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: st %s33, 168(, %s9) # 8-byte Folded Spill | ||
; PIC-NEXT: lea %s15, _GLOBAL_OFFSET_TABLE_@pc_lo(-24) | ||
; PIC-NEXT: and %s15, %s15, (32)0 | ||
; PIC-NEXT: sic %s16 | ||
; PIC-NEXT: lea.sl %s15, _GLOBAL_OFFSET_TABLE_@pc_hi(%s16, %s15) | ||
; PIC-NEXT: lea %s0, buf@got_lo | ||
; PIC-NEXT: and %s0, %s0, (32)0 | ||
; PIC-NEXT: lea.sl %s0, buf@got_hi(, %s0) | ||
; PIC-NEXT: ld %s0, (%s0, %s15) | ||
; PIC-NEXT: st %s9, (, %s0) | ||
; PIC-NEXT: st %s11, 16(, %s0) | ||
; PIC-NEXT: lea %s1, .LBB0_3@gotoff_lo | ||
; PIC-NEXT: and %s1, %s1, (32)0 | ||
; PIC-NEXT: lea.sl %s1, .LBB0_3@gotoff_hi(%s1, %s15) | ||
; PIC-NEXT: st %s1, 8(, %s0) | ||
; PIC-NEXT: # EH_SJlJ_SETUP .LBB0_3 | ||
; PIC-NEXT: # %bb.1: | ||
; PIC-NEXT: lea %s0, 0 | ||
; PIC-NEXT: br.l.t .LBB0_2 | ||
; PIC-NEXT: .LBB0_3: # Block address taken | ||
; PIC-NEXT: lea %s0, 1 | ||
; PIC-NEXT: .LBB0_2: | ||
; PIC-NEXT: adds.w.sx %s0, %s0, (0)1 | ||
; PIC-NEXT: ld %s33, 168(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s32, 160(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s31, 152(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s30, 144(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s29, 136(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s28, 128(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s27, 120(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s26, 112(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s25, 104(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s24, 96(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s23, 88(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s22, 80(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s21, 72(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s20, 64(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s19, 56(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: ld %s18, 48(, %s9) # 8-byte Folded Reload | ||
; PIC-NEXT: or %s11, 0, %s9 | ||
; PIC-NEXT: ld %s16, 32(, %s11) | ||
; PIC-NEXT: ld %s15, 24(, %s11) | ||
; PIC-NEXT: ld %s10, 8(, %s11) | ||
; PIC-NEXT: ld %s9, (, %s11) | ||
; PIC-NEXT: b.l.t (, %s10) | ||
%1 = call i8* @llvm.frameaddress(i32 0) | ||
store i8* %1, i8** bitcast ([1 x %struct.__jmp_buf_tag]* @buf to i8**), align 8 | ||
%2 = call i8* @llvm.stacksave() | ||
store i8* %2, i8** getelementptr inbounds (i8*, i8** bitcast ([1 x %struct.__jmp_buf_tag]* @buf to i8**), i64 2), align 8 | ||
%3 = call i32 @llvm.eh.sjlj.setjmp(i8* bitcast ([1 x %struct.__jmp_buf_tag]* @buf to i8*)) | ||
ret i32 %3 | ||
} | ||
|
||
; Function Attrs: nounwind readnone | ||
declare i8* @llvm.frameaddress(i32) | ||
|
||
; Function Attrs: nounwind | ||
declare i8* @llvm.stacksave() | ||
|
||
; Function Attrs: nounwind | ||
declare i32 @llvm.eh.sjlj.setjmp(i8*) | ||
|
||
; Function Attrs: noinline nounwind optnone | ||
define void @t_longjmp() { | ||
; CHECK-LABEL: t_longjmp: | ||
; CHECK: .LBB{{[0-9]+}}_2: | ||
; CHECK-NEXT: lea %s0, buf@lo | ||
; CHECK-NEXT: and %s0, %s0, (32)0 | ||
; CHECK-NEXT: lea.sl %s0, buf@hi(, %s0) | ||
; CHECK-NEXT: ld %s9, (, %s0) | ||
; CHECK-NEXT: ld %s1, 8(, %s0) | ||
; CHECK-NEXT: or %s10, 0, %s0 | ||
; CHECK-NEXT: ld %s11, 16(, %s0) | ||
; CHECK-NEXT: b.l.t (, %s1) | ||
; | ||
; PIC-LABEL: t_longjmp: | ||
; PIC: # %bb.0: | ||
; PIC-NEXT: st %s9, (, %s11) | ||
; PIC-NEXT: st %s10, 8(, %s11) | ||
; PIC-NEXT: st %s15, 24(, %s11) | ||
; PIC-NEXT: st %s16, 32(, %s11) | ||
; PIC-NEXT: or %s9, 0, %s11 | ||
; PIC-NEXT: lea %s11, -176(, %s11) | ||
; PIC-NEXT: brge.l.t %s11, %s8, .LBB1_2 | ||
; PIC-NEXT: # %bb.1: | ||
; PIC-NEXT: ld %s61, 24(, %s14) | ||
; PIC-NEXT: or %s62, 0, %s0 | ||
; PIC-NEXT: lea %s63, 315 | ||
; PIC-NEXT: shm.l %s63, (%s61) | ||
; PIC-NEXT: shm.l %s8, 8(%s61) | ||
; PIC-NEXT: shm.l %s11, 16(%s61) | ||
; PIC-NEXT: monc | ||
; PIC-NEXT: or %s0, 0, %s62 | ||
; PIC-NEXT: .LBB1_2: | ||
; PIC-NEXT: lea %s15, _GLOBAL_OFFSET_TABLE_@pc_lo(-24) | ||
; PIC-NEXT: and %s15, %s15, (32)0 | ||
; PIC-NEXT: sic %s16 | ||
; PIC-NEXT: lea.sl %s15, _GLOBAL_OFFSET_TABLE_@pc_hi(%s16, %s15) | ||
; PIC-NEXT: lea %s0, buf@got_lo | ||
; PIC-NEXT: and %s0, %s0, (32)0 | ||
; PIC-NEXT: lea.sl %s0, buf@got_hi(, %s0) | ||
; PIC-NEXT: ld %s0, (%s0, %s15) | ||
; PIC-NEXT: ld %s9, (, %s0) | ||
; PIC-NEXT: ld %s1, 8(, %s0) | ||
; PIC-NEXT: or %s10, 0, %s0 | ||
; PIC-NEXT: ld %s11, 16(, %s0) | ||
; PIC-NEXT: b.l.t (, %s1) | ||
call void @llvm.eh.sjlj.longjmp(i8* bitcast ([1 x %struct.__jmp_buf_tag]* @buf to i8*)) | ||
unreachable | ||
; No predecessors! | ||
ret void | ||
} | ||
|
||
; Function Attrs: noreturn nounwind | ||
declare void @llvm.eh.sjlj.longjmp(i8*) | ||
|
Oops, something went wrong.