diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 235b6849b1693af12a53a3b122f1e27edb6f9d7e..9d4fb2e005cb7f363226e9dc0ab4548fc8c80f1b 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -658,8 +658,8 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const { Loader = "ld-linux.so.2"; break; case llvm::Triple::sw_64: - LibDir = "lib"; - Loader = "ld-linux.so.2"; + LibDir = "lib64"; + Loader = "ld-linux-sw-64.so.2"; break; case llvm::Triple::systemz: LibDir = "lib"; diff --git a/compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake b/compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake index cdc72b6cd13347d9b9f70fad1d2044ae8e170b3d..4caca85c4fd16aa807e594b4ae81fa6cd10aa6bb 100644 --- a/compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake +++ b/compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake @@ -31,7 +31,7 @@ set(ALL_ASAN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${RISCV64} ${MIPS32} ${MIPS64} ${PPC64} ${S390X} ${SPARC} ${SPARCV9} ${HEXAGON} ${LOONGARCH64} ${SW64}) set(ALL_ASAN_ABI_SUPPORTED_ARCH ${X86_64} ${ARM64}) -set(ALL_DFSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64} ${LOONGARCH64} ${SW64}) +set(ALL_DFSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64} ${LOONGARCH64}) if(ANDROID) set(OS_NAME "Android") @@ -81,7 +81,7 @@ if(APPLE) set(ALL_XRAY_SUPPORTED_ARCH ${X86_64} ${ARM64}) else() set(ALL_XRAY_SUPPORTED_ARCH ${X86_64} ${ARM32} ${ARM64} ${MIPS32} ${MIPS64} - powerpc64le ${HEXAGON} ${LOONGARCH64} ${SW64}) + powerpc64le ${HEXAGON} ${LOONGARCH64}) endif() set(ALL_SHADOWCALLSTACK_SUPPORTED_ARCH ${ARM64}) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp index 6aca7e0b2332909ce8900023b2b07d36830f2644..ef4283cba798d468bfc8d19ddfec303bc216945a 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp @@ -1538,7 +1538,8 @@ uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg, "ldi $sp,32($sp);\n" "call $26,($27),0;\n" - "ldgp $29, 0($26);\n" + "ldih $29, 0($26);\n" + "ldi $29, 0($29);\n" /* Call _exit($v0). */ "mov $0,$16;\n" diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_sw64.S b/compiler-rt/lib/tsan/rtl/tsan_rtl_sw64.S index fd893a780385fbceac98fea72e2d5e77bd8c3f13..8a701ed264e483aea81c1d28826fc9b5bae604d7 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_sw64.S +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_sw64.S @@ -11,7 +11,8 @@ ASM_HIDDEN(__tsan_setjmp) .globl ASM_SYMBOL_INTERCEPTOR(setjmp) ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp)) ASM_SYMBOL_INTERCEPTOR(setjmp): - ldgp $r29, 0($r27) + ldih $r29, 0($r27) + ldi $r29, 0($r29) CFI_STARTPROC // Save frame/link register @@ -38,7 +39,8 @@ ASM_SYMBOL_INTERCEPTOR(setjmp): //ldi $r27, ASM_SYMBOL(__tsan_setjmp)($r29) !gprellow ldl $r27, ASM_SYMBOL(__tsan_setjmp)($r29) !literal call $r26, ($r27), 0 - ldgp $r29, 0($r26) + ldih $r29, 0($r26) + ldi $r29, 0($r29) // Restore env parameter ldl $r16, 16($sp) @@ -55,7 +57,7 @@ ASM_SYMBOL_INTERCEPTOR(setjmp): // tail jump to libc setjmp ldl $r27, _ZN14__interception11real_setjmpE($r29) !literal ldl $r27, 0($r27) - jmp $r31, ($r27) + jmp $r31, ($r27), 0 CFI_ENDPROC ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp)) @@ -65,7 +67,8 @@ ASM_HIDDEN(__tsan_setjmp) .globl ASM_SYMBOL_INTERCEPTOR(_setjmp) ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp)) ASM_SYMBOL_INTERCEPTOR(_setjmp): - ldgp $r29, 0($r27) + ldih $r29, 0($r27) + ldi $r29, 0($r29) CFI_STARTPROC // Save frame/link register @@ -92,7 +95,8 @@ ASM_SYMBOL_INTERCEPTOR(_setjmp): //ldi $r27, ASM_SYMBOL(__tsan_setjmp)($r29) !gprellow ldl $r27, ASM_SYMBOL(__tsan_setjmp)($r29) !literal call $r26, ($r27), 0 - ldgp $r29, 0($r26) + ldih $r29, 0($r26) + ldi $r29, 0($r29) // Restore env parameter ldl $r16, 16($sp) @@ -109,7 +113,7 @@ ASM_SYMBOL_INTERCEPTOR(_setjmp): // tail jump to libc setjmp ldl $r27, _ZN14__interception12real__setjmpE($r29) !literal ldl $r27, 0($r27) - jmp $r31, ($r27) + jmp $r31, ($r27), 0 CFI_ENDPROC ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp)) @@ -119,7 +123,8 @@ ASM_HIDDEN(__tsan_setjmp) .globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp) ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp)) ASM_SYMBOL_INTERCEPTOR(sigsetjmp): - ldgp $r29, 0($r27) + ldih $r29, 0($r27) + ldi $r29, 0($r29) CFI_STARTPROC // Save frame/link register @@ -148,7 +153,8 @@ ASM_SYMBOL_INTERCEPTOR(sigsetjmp): //ldi $r27, ASM_SYMBOL(__tsan_setjmp)($r29) !gprellow ldl $r27, ASM_SYMBOL(__tsan_setjmp)($r29) !literal call $r26, ($r27), 0 - ldgp $r29, 0($r26) + ldih $r29, 0($r26) + ldi $r29, 0($r29) // Restore env parameter ldl $r16, 16($sp) @@ -167,7 +173,7 @@ ASM_SYMBOL_INTERCEPTOR(sigsetjmp): // tail jump to libc setjmp ldl $r27, _ZN14__interception14real_sigsetjmpE($r29) !literal ldl $r27, 0($r27) - jmp $r31, ($r27) + jmp $r31, ($r27), 0 CFI_ENDPROC ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp)) @@ -177,7 +183,8 @@ ASM_HIDDEN(__tsan_setjmp) .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp) ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)) ASM_SYMBOL_INTERCEPTOR(__sigsetjmp): - ldgp $r29, 0($r27) + ldih $r29, 0($r27) + ldi $r29, 0($r29) CFI_STARTPROC // Save frame/link register @@ -206,7 +213,8 @@ ASM_SYMBOL_INTERCEPTOR(__sigsetjmp): //ldi $r27, ASM_SYMBOL(__tsan_setjmp)($r29) !gprellow ldl $r27, ASM_SYMBOL(__tsan_setjmp)($r29) !literal call $r26, ($r27), 0 - ldgp $r29, 0($r26) + ldih $r29, 0($r26) + ldi $r29, 0($r29) // Restore env parameter ldl $r16, 16($sp) @@ -225,7 +233,7 @@ ASM_SYMBOL_INTERCEPTOR(__sigsetjmp): // tail jump to libc setjmp ldl $r27, _ZN14__interception16real___sigsetjmpE($r29) !literal ldl $r27, 0($r27) - jmp $r31, ($r27) + jmp $r31, ($r27), 0 CFI_ENDPROC ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)) diff --git a/llvm/lib/Target/Sw64/Sw64ISelLowering.cpp b/llvm/lib/Target/Sw64/Sw64ISelLowering.cpp index 2cccb036374e609459ee59afd608b6c787664c9f..b115ed5357bd76d35428321f47465e624be6f90a 100644 --- a/llvm/lib/Target/Sw64/Sw64ISelLowering.cpp +++ b/llvm/lib/Target/Sw64/Sw64ISelLowering.cpp @@ -367,6 +367,8 @@ const char *Sw64TargetLowering::getTargetNodeName(unsigned Opcode) const { return "Sw64ISD::VBROADCAST_LD"; case Sw64ISD::VTRUNCST: return "Sw64ISD::VTRUNCST"; + case Sw64ISD::RTID: + return "Sw64ISD::RTID"; } return nullptr; @@ -2116,6 +2118,10 @@ SDValue Sw64TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, case Intrinsic::sw64_vshfw: return DAG.getNode(Sw64ISD::VSHF, dl, Op->getValueType(0), Op->getOperand(1), Op->getOperand(2), Op->getOperand(3)); + case Intrinsic::thread_pointer: { + EVT PtrVT = getPointerTy(DAG.getDataLayout()); + return DAG.getNode(Sw64ISD::RTID, dl, PtrVT); + } } return Op; } diff --git a/llvm/lib/Target/Sw64/Sw64ISelLowering.h b/llvm/lib/Target/Sw64/Sw64ISelLowering.h index 836abe2774af71907a3f252c6aa00137262e6880..5142280c730996be58f0354e51dc0f38f036f450 100644 --- a/llvm/lib/Target/Sw64/Sw64ISelLowering.h +++ b/llvm/lib/Target/Sw64/Sw64ISelLowering.h @@ -235,6 +235,7 @@ enum NodeType : unsigned { // Extended vector element extraction VEXTRACT_SEXT_ELT, VEXTRACT_ZEXT_ELT, + RTID, VTRUNCST = ISD::FIRST_TARGET_MEMORY_OPCODE }; diff --git a/llvm/lib/Target/Sw64/Sw64InstrInfo.td b/llvm/lib/Target/Sw64/Sw64InstrInfo.td index c69b805ce6226f09c346bf973eda0f3cb9c9ce02..86edd6de357421fbdba226d67f8801da257b36da 100644 --- a/llvm/lib/Target/Sw64/Sw64InstrInfo.td +++ b/llvm/lib/Target/Sw64/Sw64InstrInfo.td @@ -1742,7 +1742,16 @@ let RB = 31 in { def RPCC : MfcForm<0x06, 0x0020,(ins), (outs GPRC:$RA), "rtc", "$RA">; //Read process cycle counter //4.7.4 read cpu core id def RCID : MfcForm<0x06, 0x0040,(ins), (outs GPRC:$RA), "rcid", "$RA">; + +def RTID : MfcForm<0x06, 0x1040,(ins), (outs GPRC:$RA), "rtid", "$RA">; } + +def SDT_ZRtid : SDTypeProfile<1, 0, [ + SDTCisPtrTy<0>, +]>; +def Sw64_rtid: SDNode<"Sw64ISD::RTID", SDT_ZRtid, []>; +def : Pat<(Sw64_rtid), (RTID)>; + //4.7.6 atom operate instruction let mayLoad = 1 in {