Skip to content

Commit febeba3

Browse files
shushanhfqiaopengcheng
andauthored
[LoongArch64] coreclr-vm directory (#62885)
* Part6-2: -add the coreclr-vm directory for LoongArch64. (#59561) Co-authored-by: Loongson's .NET-teams * [LoongArch64] revert the syncblk.cpp. * [LoongArch64] delete some unused codes. * [LoongArch64] add vm/CMakeLists.txt from #62889. * [LoongArch64] add related files from #62886 and #62893. * [LoongArch64] moved vm/jitinterface.cpp from #62893. moved inc/corinfo.h from #6288. * [LoongArch64] run the file `src/coreclr/tools/Common/JitInterface/ThunkGenerator/gen.sh` and merge the patch from #62893. * [LoongArch64] revert vm/ceeload.h. amend the `ToolBox/superpmi/superpmi-shared/agnostic.h` * [LoongArch64] add empty interfaces within `CorInfoImpl.cs`. * [LoongArch64] Fix the compiling error on Windows. * [LoongArch64] Fix the compiling error for memory unaligned m_currentByteStackIndex. * [LoongArch64] Delete the !TARGET_LOONGARCH64 for m_currentByteStackIndex. * [LoongArch64] move ToolBox from #62886. * [LoongArch64] amend the args when needs unsigned extending within CallTargetWorker. * [LoongArch64] add bool type for args' unsigned extention. * [LoongArch64] adding char type for args' unsigned extention. Also rename `TARGET_LOONGARCH64` to `UNIX_LOONGARCH64_ABI` within ABI. * [LoongArch64] amend renaming `TARGET_LOONGARCH64` to `UNIX_LOONGARCH64_ABI` within ABI. * [LoongArch64] remove the JIT/EE interface to #62893. * [LoongArch64] revert the rename `TARGET_LOONGARCH64` to `UNIX_LOONGARCH64_ABI`. Also add unsigned extend for CHAR type. * [LoongArch64] refactor the `ArgDestination and ArgLocDesc`. * [LoongArch64] rename the `m_flag` and `getFieldTypeByHnd`. * [LoongArch64] add `NATIVE_SYMBOL_READER_DLL` for compiling error. * [LoongArch64] update the version of the `LICENSE description`. * [LoongArch64] keep same with the comment in `jit/targetloongarch64.h` * [LoongArch64] amend the code for reviewing. * [LoongArch64] refactor LoongArch64-ABI within `vm`, and also amend some code for review. * [LoongArch64] delete unused codes. * [LoongArch64] merge main for #65869. * [LoongArch64] amend the format for reviewing. * [LoongArch64] delete some unused code for reviewing. * [LoongArch64] amend code for CR feedback @jkotas @janvorli * [LoongArch64] add class type for LoongArch64-ABI. * [LoongArch64] Amend the LoongArch64's ABI after merged `MethodTable::GetLoongArch64PassStructInRegisterFlags()` and `CEEInfo::getLoongArch64PassStructInRegisterFlags()` * [LoongArch64] Fix the assert error when running hello-world within debug-mode after refacting. Co-authored-by: qiaopengcheng <qiaopengcheng-hf@loongson.cn>
1 parent 2389815 commit febeba3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+6737
-520
lines changed

src/coreclr/inc/clrnt.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,14 +1069,6 @@ RtlVirtualUnwind(
10691069
IN OUT PKNONVOLATILE_CONTEXT_POINTERS ContextPointers OPTIONAL
10701070
);
10711071

1072-
#ifndef IMAGE_REL_LOONGARCH64_PC
1073-
#define IMAGE_REL_LOONGARCH64_PC 0x0003
1074-
#endif
1075-
1076-
#ifndef IMAGE_REL_LOONGARCH64_JIR
1077-
#define IMAGE_REL_LOONGARCH64_JIR 0x0004
1078-
#endif
1079-
10801072
#endif // TARGET_LOONGARCH64
10811073

10821074
#endif // CLRNT_H_

src/coreclr/inc/eetwain.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,9 @@ virtual bool UnwindStackFrame(PREGDISPLAY pContext,
211211
virtual bool IsGcSafe(EECodeInfo *pCodeInfo,
212212
DWORD dwRelOffset) = 0;
213213

214-
#if defined(TARGET_ARM) || defined(TARGET_ARM64)
214+
#if defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64)
215215
virtual bool HasTailCalls(EECodeInfo *pCodeInfo) = 0;
216-
#endif // TARGET_ARM || TARGET_ARM64
216+
#endif // TARGET_ARM || TARGET_ARM64 || TARGET_LOONGARCH64
217217

218218
#if defined(TARGET_AMD64) && defined(_DEBUG)
219219
/*
@@ -455,10 +455,10 @@ virtual
455455
bool IsGcSafe( EECodeInfo *pCodeInfo,
456456
DWORD dwRelOffset);
457457

458-
#if defined(TARGET_ARM) || defined(TARGET_ARM64)
458+
#if defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64)
459459
virtual
460460
bool HasTailCalls(EECodeInfo *pCodeInfo);
461-
#endif // TARGET_ARM || TARGET_ARM64
461+
#endif // TARGET_ARM || TARGET_ARM64 || TARGET_LOONGARCH64
462462

463463
#if defined(TARGET_AMD64) && defined(_DEBUG)
464464
/*

src/coreclr/inc/jithelpers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@
320320

321321
JITHELPER(CORINFO_HELP_GVMLOOKUP_FOR_SLOT, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
322322

323-
#ifndef TARGET_ARM64
323+
#if !defined(TARGET_ARM64) && !defined(TARGET_LOONGARCH64)
324324
JITHELPER(CORINFO_HELP_STACK_PROBE, JIT_StackProbe, CORINFO_HELP_SIG_REG_ONLY)
325325
#else
326326
JITHELPER(CORINFO_HELP_STACK_PROBE, NULL, CORINFO_HELP_SIG_UNDEF)

src/coreclr/inc/stdmacros.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,20 @@
111111
#define NOT_ARM64_ARG(x) , x
112112
#endif
113113

114+
#ifdef TARGET_LOONGARCH64
115+
#define LOONGARCH64_FIRST_ARG(x) x ,
116+
#define LOONGARCH64_ARG(x) , x
117+
#define LOONGARCH64_ONLY(x) x
118+
#define NOT_LOONGARCH64(x)
119+
#define NOT_LOONGARCH64_ARG(x)
120+
#else
121+
#define LOONGARCH64_FIRST_ARG(x)
122+
#define LOONGARCH64_ARG(x)
123+
#define LOONGARCH64_ONLY(x)
124+
#define NOT_LOONGARCH64(x) x
125+
#define NOT_LOONGARCH64_ARG(x) , x
126+
#endif
127+
114128
#ifdef TARGET_64BIT
115129
#define LOG2_PTRSIZE 3
116130
#else

src/coreclr/tools/superpmi/superpmi-shared/compileresult.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,11 @@ void CompileResult::applyRelocs(RelocContext* rc, unsigned char* block1, ULONG b
862862
}
863863
}
864864

865+
if (targetArch == SPMI_TARGET_ARCHITECTURE_LOONGARCH64)
866+
{
867+
Assert(!"FIXME: Not Implements on loongarch64");
868+
}
869+
865870
if (IsSpmiTarget64Bit())
866871
{
867872
if (relocType == IMAGE_REL_BASED_DIR64)

src/coreclr/tools/superpmi/superpmi-shared/spmiutil.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,8 @@ static SPMI_TARGET_ARCHITECTURE SpmiTargetArchitecture = SPMI_TARGET_ARCHITECTUR
251251
static SPMI_TARGET_ARCHITECTURE SpmiTargetArchitecture = SPMI_TARGET_ARCHITECTURE_ARM;
252252
#elif defined(TARGET_ARM64)
253253
static SPMI_TARGET_ARCHITECTURE SpmiTargetArchitecture = SPMI_TARGET_ARCHITECTURE_ARM64;
254+
#elif defined(TARGET_LOONGARCH64)
255+
static SPMI_TARGET_ARCHITECTURE SpmiTargetArchitecture = SPMI_TARGET_ARCHITECTURE_LOONGARCH64;
254256
#else
255257
#error Unsupported architecture
256258
#endif

src/coreclr/tools/superpmi/superpmi-shared/spmiutil.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,16 @@ enum SPMI_TARGET_ARCHITECTURE
5353
SPMI_TARGET_ARCHITECTURE_X86,
5454
SPMI_TARGET_ARCHITECTURE_AMD64,
5555
SPMI_TARGET_ARCHITECTURE_ARM64,
56-
SPMI_TARGET_ARCHITECTURE_ARM
56+
SPMI_TARGET_ARCHITECTURE_ARM,
57+
SPMI_TARGET_ARCHITECTURE_LOONGARCH64
5758
};
5859

5960
SPMI_TARGET_ARCHITECTURE GetSpmiTargetArchitecture();
6061
void SetSpmiTargetArchitecture(SPMI_TARGET_ARCHITECTURE spmiTargetArchitecture);
6162

6263
inline bool IsSpmiTarget64Bit()
6364
{
64-
return (GetSpmiTargetArchitecture() == SPMI_TARGET_ARCHITECTURE_AMD64) || (GetSpmiTargetArchitecture() == SPMI_TARGET_ARCHITECTURE_ARM64);
65+
return (GetSpmiTargetArchitecture() == SPMI_TARGET_ARCHITECTURE_AMD64) || (GetSpmiTargetArchitecture() == SPMI_TARGET_ARCHITECTURE_ARM64) || (GetSpmiTargetArchitecture() == SPMI_TARGET_ARCHITECTURE_LOONGARCH64);
6566
}
6667

6768
inline size_t SpmiTargetPointerSize()

src/coreclr/tools/superpmi/superpmi/superpmi.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ void SetSuperPmiTargetArchitecture(const char* targetArchitecture)
5353
{
5454
SetSpmiTargetArchitecture(SPMI_TARGET_ARCHITECTURE_ARM64);
5555
}
56+
else if (0 == _stricmp(targetArchitecture, "loongarch64"))
57+
{
58+
SetSpmiTargetArchitecture(SPMI_TARGET_ARCHITECTURE_LOONGARCH64);
59+
}
5660
else
5761
{
5862
LogError("Illegal target architecture '%s'", targetArchitecture);

src/coreclr/vm/CMakeLists.txt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,14 @@ else(CLR_CMAKE_TARGET_WIN32)
762762
${ARCH_SOURCES_DIR}/pinvokestubs.S
763763
${ARCH_SOURCES_DIR}/thunktemplates.S
764764
)
765+
elseif(CLR_CMAKE_TARGET_ARCH_LOONGARCH64)
766+
set(VM_SOURCES_WKS_ARCH_ASM
767+
${ARCH_SOURCES_DIR}/asmhelpers.S
768+
${ARCH_SOURCES_DIR}/calldescrworkerloongarch64.S
769+
${ARCH_SOURCES_DIR}/crthelpers.S
770+
${ARCH_SOURCES_DIR}/pinvokestubs.S
771+
${ARCH_SOURCES_DIR}/thunktemplates.S
772+
)
765773
endif()
766774

767775
endif(CLR_CMAKE_TARGET_WIN32)
@@ -864,6 +872,21 @@ elseif(CLR_CMAKE_TARGET_ARCH_ARM64)
864872
${ARCH_SOURCES_DIR}/arm64singlestepper.cpp
865873
)
866874
endif(CLR_CMAKE_HOST_UNIX)
875+
elseif(CLR_CMAKE_TARGET_ARCH_LOONGARCH64)
876+
set(VM_SOURCES_DAC_AND_WKS_ARCH
877+
${ARCH_SOURCES_DIR}/stubs.cpp
878+
exceptionhandling.cpp
879+
)
880+
881+
set(VM_HEADERS_DAC_AND_WKS_ARCH
882+
${ARCH_SOURCES_DIR}/virtualcallstubcpu.hpp
883+
exceptionhandling.h
884+
)
885+
886+
set(VM_SOURCES_WKS_ARCH
887+
${ARCH_SOURCES_DIR}/profiler.cpp
888+
gcinfodecoder.cpp
889+
)
867890
endif()
868891

869892
if(CLR_CMAKE_HOST_UNIX)

src/coreclr/vm/argdestination.h

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ class ArgDestination
2929
LIMITED_METHOD_CONTRACT;
3030
#if defined(UNIX_AMD64_ABI)
3131
_ASSERTE((argLocDescForStructInRegs != NULL) || (offset != TransitionBlock::StructInRegsOffset));
32-
#elif defined(TARGET_ARM64)
33-
// This assert is not interesting on arm64. argLocDescForStructInRegs could be
32+
#elif defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64)
33+
// This assert is not interesting on arm64/loongarch64. argLocDescForStructInRegs could be
3434
// initialized if the args are being enregistered.
3535
#else
3636
_ASSERTE(argLocDescForStructInRegs == NULL);
@@ -83,6 +83,67 @@ class ArgDestination
8383
#endif // !DACCESS_COMPILE
8484
#endif // defined(TARGET_ARM64)
8585

86+
#if defined(TARGET_LOONGARCH64)
87+
bool IsStructPassedInRegs()
88+
{
89+
return m_argLocDescForStructInRegs != NULL;
90+
}
91+
92+
#ifndef DACCESS_COMPILE
93+
void CopyStructToRegisters(void *src, int fieldBytes)
94+
{
95+
_ASSERTE(IsStructPassedInRegs());
96+
_ASSERTE(fieldBytes <= 16);
97+
98+
int argOfs = TransitionBlock::GetOffsetOfFloatArgumentRegisters() + m_argLocDescForStructInRegs->m_idxFloatReg * 8;
99+
100+
if (m_argLocDescForStructInRegs->m_structFields == STRUCT_FLOAT_FIELD_ONLY_TWO)
101+
{ // struct with two floats.
102+
_ASSERTE(m_argLocDescForStructInRegs->m_cFloatReg == 2);
103+
_ASSERTE(m_argLocDescForStructInRegs->m_cGenReg == 0);
104+
*(INT64*)((char*)m_base + argOfs) = *(INT32*)src;
105+
*(INT64*)((char*)m_base + argOfs + 8) = *((INT32*)src + 1);
106+
}
107+
else if ((m_argLocDescForStructInRegs->m_structFields & STRUCT_FLOAT_FIELD_FIRST) != 0)
108+
{ // the first field is float or double.
109+
if ((m_argLocDescForStructInRegs->m_structFields & STRUCT_FIRST_FIELD_SIZE_IS8) == 0)
110+
*(INT64*)((char*)m_base + argOfs) = *(INT32*)src; // the first field is float
111+
else
112+
*(UINT64*)((char*)m_base + argOfs) = *(UINT64*)src; // the first field is double.
113+
_ASSERTE(m_argLocDescForStructInRegs->m_cFloatReg == 1);
114+
_ASSERTE(m_argLocDescForStructInRegs->m_cGenReg == 1);
115+
_ASSERTE((m_argLocDescForStructInRegs->m_structFields & STRUCT_FLOAT_FIELD_SECOND) == 0);//the second field is integer.
116+
argOfs = TransitionBlock::GetOffsetOfArgumentRegisters() + m_argLocDescForStructInRegs->m_idxGenReg * 8;
117+
if ((m_argLocDescForStructInRegs->m_structFields & STRUCT_HAS_8BYTES_FIELDS_MASK) != 0)
118+
*(UINT64*)((char*)m_base + argOfs) = *((UINT64*)src + 1);
119+
else
120+
*(INT64*)((char*)m_base + argOfs) = *((INT32*)src + 1); // the second field is int32.
121+
}
122+
else if ((m_argLocDescForStructInRegs->m_structFields & STRUCT_FLOAT_FIELD_SECOND) != 0)
123+
{ // the second field is float or double.
124+
*(UINT64*)((char*)m_base + argOfs) = *(UINT64*)src; // NOTE: here ignoring the first size.
125+
if ((m_argLocDescForStructInRegs->m_structFields & STRUCT_HAS_8BYTES_FIELDS_MASK) == 0)
126+
*(UINT64*)((char*)m_base + argOfs) = *((INT32*)src + 1); // the second field is int32.
127+
else
128+
*(UINT64*)((char*)m_base + argOfs) = *((UINT64*)src + 1);
129+
_ASSERTE(m_argLocDescForStructInRegs->m_cFloatReg == 1);
130+
_ASSERTE(m_argLocDescForStructInRegs->m_cGenReg == 1);
131+
_ASSERTE((m_argLocDescForStructInRegs->m_structFields & STRUCT_FLOAT_FIELD_FIRST) == 0);//the first field is integer.
132+
argOfs = TransitionBlock::GetOffsetOfArgumentRegisters() + m_argLocDescForStructInRegs->m_idxGenReg * 8;
133+
}
134+
else
135+
_ASSERTE(!"---------UNReachable-------LoongArch64!!!");
136+
}
137+
#endif // !DACCESS_COMPILE
138+
139+
PTR_VOID GetStructGenRegDestinationAddress()
140+
{
141+
_ASSERTE(IsStructPassedInRegs());
142+
int argOfs = TransitionBlock::GetOffsetOfArgumentRegisters() + m_argLocDescForStructInRegs->m_idxGenReg * 8;
143+
return dac_cast<PTR_VOID>(dac_cast<TADDR>(m_base) + argOfs);
144+
}
145+
#endif // defined(TARGET_LOONGARCH64)
146+
86147
#if defined(UNIX_AMD64_ABI)
87148

88149
// Returns true if the ArgDestination represents a struct passed in registers.

0 commit comments

Comments
 (0)