mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
Generate native unwind info on Win64
This patch enables LLVM to emit Win64-native unwind info rather than DWARF CFI. It handles all corner cases (I hope), including stack realignment. Because the unwind info is not flexible enough to describe stack frames with a gap of unknown size in the middle, such as the one caused by stack realignment, I modified register spilling code to place all spills into the fixed frame slots, so that they can be accessed relative to the frame pointer. Patch by Vadim Chugunov! Reviewed By: rnk Differential Revision: http://reviews.llvm.org/D4081 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211399 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -110,7 +110,7 @@ let Defs = [EAX, ESP, EFLAGS], Uses = [ESP] in
|
||||
|
||||
// When using segmented stacks these are lowered into instructions which first
|
||||
// check if the current stacklet has enough free memory. If it does, memory is
|
||||
// allocated by bumping the stack pointer. Otherwise memory is allocated from
|
||||
// allocated by bumping the stack pointer. Otherwise memory is allocated from
|
||||
// the heap.
|
||||
|
||||
let Defs = [EAX, ESP, EFLAGS], Uses = [ESP] in
|
||||
@@ -196,6 +196,26 @@ let isBranch = 1, isTerminator = 1, isCodeGenOnly = 1 in {
|
||||
"#EH_SjLj_Setup\t$dst", []>;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Pseudo instructions used by unwind info.
|
||||
//
|
||||
let isPseudo = 1 in {
|
||||
def SEH_PushReg : I<0, Pseudo, (outs), (ins i32imm:$reg),
|
||||
"#SEH_PushReg $reg", []>;
|
||||
def SEH_SaveReg : I<0, Pseudo, (outs), (ins i32imm:$reg, i32imm:$dst),
|
||||
"#SEH_SaveReg $reg, $dst", []>;
|
||||
def SEH_SaveXMM : I<0, Pseudo, (outs), (ins i32imm:$reg, i32imm:$dst),
|
||||
"#SEH_SaveXMM $reg, $dst", []>;
|
||||
def SEH_StackAlloc : I<0, Pseudo, (outs), (ins i32imm:$size),
|
||||
"#SEH_StackAlloc $size", []>;
|
||||
def SEH_SetFrame : I<0, Pseudo, (outs), (ins i32imm:$reg, i32imm:$offset),
|
||||
"#SEH_SetFrame $reg, $offset", []>;
|
||||
def SEH_PushFrame : I<0, Pseudo, (outs), (ins i1imm:$mode),
|
||||
"#SEH_PushFrame $mode", []>;
|
||||
def SEH_EndPrologue : I<0, Pseudo, (outs), (ins),
|
||||
"#SEH_EndPrologue", []>;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Pseudo instructions used by segmented stacks.
|
||||
//
|
||||
@@ -371,7 +391,7 @@ let Defs = [RCX,RDI], isCodeGenOnly = 1 in {
|
||||
def REP_STOSD_64 : I<0xAB, RawFrm, (outs), (ins), "{rep;stosl|rep stosd}",
|
||||
[(X86rep_stos i32)], IIC_REP_STOS>, REP, OpSize32,
|
||||
Requires<[In64BitMode]>;
|
||||
|
||||
|
||||
let Uses = [RAX,RCX,RDI] in
|
||||
def REP_STOSQ_64 : RI<0xAB, RawFrm, (outs), (ins), "{rep;stosq|rep stosq}",
|
||||
[(X86rep_stos i64)], IIC_REP_STOS>, REP,
|
||||
|
Reference in New Issue
Block a user