代码拉取完成,页面将自动刷新
同步操作将从 OpenHarmony/arkcompiler_ets_runtime 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 0e85afa82c7..f56219422d2 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -507,6 +507,12 @@ option(LLVM_BUILD_EXAMPLES
"Build the LLVM example programs. If OFF, just generate build targets." OFF)
option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
+option(BUILD_ARK_GC_SUPPORT
+ "ARK support GC. If ON, support GC." OFF)
+if(BUILD_ARK_GC_SUPPORT)
+ add_definitions(-DARK_GC_SUPPORT)
+endif(ARK_SUPPORT_GC)
+
if(LLVM_BUILD_EXAMPLES)
add_definitions(-DBUILD_EXAMPLES)
endif(LLVM_BUILD_EXAMPLES)
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp
index 1da20371caf..875184f32b2 100644
--- a/llvm/lib/Target/X86/X86FrameLowering.cpp
+++ b/llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -31,6 +31,7 @@
#include "llvm/Support/Debug.h"
#include "llvm/Target/TargetOptions.h"
#include <cstdlib>
+#include <iostream>
using namespace llvm;
@@ -1169,6 +1170,29 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
MFI.setOffsetAdjustment(-StackSize);
}
+#ifdef ARK_GC_SUPPORT
+ // push marker
+ if (MF.getFunction().hasFnAttribute("js-stub-call"))
+ {
+ int64_t marker = 0x0;
+ MF.getFunction()
+ .getFnAttribute("js-stub-call")
+ .getValueAsString()
+ .getAsInteger(10, marker);//marker 1 break frame
+ std::cout << __LINE__ << " marker:" << std::dec << marker << std::endl;
+
+ BuildMI(MBB, MBBI, DL, TII.get(X86::PUSH64i32))
+ .addImm(marker)
+ .setMIFlag(MachineInstr::FrameSetup);
+ /*reserve thread.fp */
+ if (marker == 1) {
+ BuildMI(MBB, MBBI, DL, TII.get(X86::PUSH64i32))
+ .addImm(marker)
+ .setMIFlag(MachineInstr::FrameSetup);
+ }
+ }
+#endif
+
// For EH funclets, only allocate enough space for outgoing calls. Save the
// NumBytes value that we would've used for the parent frame.
unsigned ParentFrameNumBytes = NumBytes;
@@ -1635,6 +1659,27 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,
uint64_t SEHStackAllocAmt = NumBytes;
if (HasFP) {
+#ifdef ARK_GC_SUPPORT
+ if (MF.getFunction().hasFnAttribute("js-stub-call"))
+ {
+ int64_t marker = 0x0;
+ MF.getFunction()
+ .getFnAttribute("js-stub-call")
+ .getValueAsString()
+ .getAsInteger(10, marker);//marker 1 break frame
+
+ // pop marker
+ BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::POP64r : X86::POP32r),
+ MachineFramePtr)
+ .setMIFlag(MachineInstr::FrameDestroy);
+ if (marker == 1) {
+ // pop thread.fp
+ BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::POP64r : X86::POP32r),
+ MachineFramePtr)
+ .setMIFlag(MachineInstr::FrameDestroy);
+ }
+ }
+#endif
// Pop EBP.
BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::POP64r : X86::POP32r),
MachineFramePtr)
@@ -1993,8 +2038,33 @@ bool X86FrameLowering::assignCalleeSavedSpillSlots(
if (hasFP(MF)) {
// emitPrologue always spills frame register the first thing.
+#ifdef ARK_GC_SUPPORT
+ if (MF.getFunction().hasFnAttribute("js-stub-call")) {
+ int64_t marker = 0x0;
+ MF.getFunction()
+ .getFnAttribute("js-stub-call")
+ .getValueAsString()
+ .getAsInteger(10, marker);//marker 1 break frame
+ if (marker == 1) {
+ SpillSlotOffset -= 3 * SlotSize; // add type and thread.fp
+ MFI.CreateFixedSpillStackObject(SlotSize, SpillSlotOffset);
+ MFI.CreateFixedSpillStackObject(SlotSize, SpillSlotOffset);
+ MFI.CreateFixedSpillStackObject(SlotSize, SpillSlotOffset);
+ CalleeSavedFrameSize += 16;
+ } else {
+ SpillSlotOffset -= 2 * SlotSize; // add type
+ MFI.CreateFixedSpillStackObject(SlotSize, SpillSlotOffset);
+ MFI.CreateFixedSpillStackObject(SlotSize, SpillSlotOffset);
+ CalleeSavedFrameSize += 8;
+ }
+ } else {
+ SpillSlotOffset -= SlotSize; // add type and thread.fp
+ MFI.CreateFixedSpillStackObject(SlotSize, SpillSlotOffset);
+ }
+#else
SpillSlotOffset -= SlotSize;
MFI.CreateFixedSpillStackObject(SlotSize, SpillSlotOffset);
+#endif
// Since emitPrologue and emitEpilogue will handle spilling and restoring of
// the frame register, we can delete it from CSI list and not have to worry
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。