Skip to content

Commit 5b356e0

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merged main:5e53a8dadb00 into amd-gfx:a13c32b40a9c
Local branch amd-gfx a13c32b Merged main:38eaea73cab3 into amd-gfx:94128674bb5a Remote branch main 5e53a8d AMDGPU: Fix verifier assert with out of bounds subregister indexes (llvm#119799)
2 parents a13c32b + 5e53a8d commit 5b356e0

29 files changed

+528
-79
lines changed

clang/lib/Basic/Targets.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,9 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
726726
case llvm::Triple::Linux:
727727
return std::make_unique<LinuxTargetInfo<LoongArch32TargetInfo>>(Triple,
728728
Opts);
729+
case llvm::Triple::FreeBSD:
730+
return std::make_unique<FreeBSDTargetInfo<LoongArch32TargetInfo>>(Triple,
731+
Opts);
729732
default:
730733
return std::make_unique<LoongArch32TargetInfo>(Triple, Opts);
731734
}
@@ -734,6 +737,9 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
734737
case llvm::Triple::Linux:
735738
return std::make_unique<LinuxTargetInfo<LoongArch64TargetInfo>>(Triple,
736739
Opts);
740+
case llvm::Triple::FreeBSD:
741+
return std::make_unique<FreeBSDTargetInfo<LoongArch64TargetInfo>>(Triple,
742+
Opts);
737743
default:
738744
return std::make_unique<LoongArch64TargetInfo>(Triple, Opts);
739745
}

clang/lib/Basic/Targets/OSTargets.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,9 @@ class LLVM_LIBRARY_VISIBILITY FreeBSDTargetInfo : public OSTargetInfo<Target> {
231231
case llvm::Triple::riscv32:
232232
case llvm::Triple::riscv64:
233233
break;
234+
case llvm::Triple::loongarch32:
235+
case llvm::Triple::loongarch64:
236+
break;
234237
}
235238
}
236239
};

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -247,39 +247,49 @@ static SanitizerMask setGroupBits(SanitizerMask Kinds) {
247247
return Kinds;
248248
}
249249

250-
static SanitizerMask parseSanitizeTrapArgs(const Driver &D,
251-
const llvm::opt::ArgList &Args,
252-
bool DiagnoseErrors) {
253-
SanitizerMask TrapRemove; // During the loop below, the accumulated set of
254-
// sanitizers disabled by the current sanitizer
255-
// argument or any argument after it.
256-
SanitizerMask TrappingKinds;
257-
SanitizerMask TrappingSupportedWithGroups = setGroupBits(TrappingSupported);
250+
// Computes the sanitizer mask based on the default plus opt-in (if supported)
251+
// minus opt-out.
252+
static SanitizerMask
253+
parseSanitizeArgs(const Driver &D, const llvm::opt::ArgList &Args,
254+
bool DiagnoseErrors, SanitizerMask Supported,
255+
SanitizerMask Default, int OptInID, int OptOutID) {
256+
SanitizerMask Remove; // During the loop below, the accumulated set of
257+
// sanitizers disabled by the current sanitizer
258+
// argument or any argument after it.
259+
SanitizerMask Kinds;
260+
SanitizerMask SupportedWithGroups = setGroupBits(Supported);
258261

259262
for (const llvm::opt::Arg *Arg : llvm::reverse(Args)) {
260-
if (Arg->getOption().matches(options::OPT_fsanitize_trap_EQ)) {
263+
if (Arg->getOption().matches(OptInID)) {
261264
Arg->claim();
262265
SanitizerMask Add = parseArgValues(D, Arg, true);
263-
Add &= ~TrapRemove;
264-
SanitizerMask InvalidValues = Add & ~TrappingSupportedWithGroups;
266+
Add &= ~Remove;
267+
SanitizerMask InvalidValues = Add & ~SupportedWithGroups;
265268
if (InvalidValues && DiagnoseErrors) {
266269
SanitizerSet S;
267270
S.Mask = InvalidValues;
268271
D.Diag(diag::err_drv_unsupported_option_argument)
269272
<< Arg->getSpelling() << toString(S);
270273
}
271-
TrappingKinds |= expandSanitizerGroups(Add) & ~TrapRemove;
272-
} else if (Arg->getOption().matches(options::OPT_fno_sanitize_trap_EQ)) {
274+
Kinds |= expandSanitizerGroups(Add) & ~Remove;
275+
} else if (Arg->getOption().matches(OptOutID)) {
273276
Arg->claim();
274-
TrapRemove |=
275-
expandSanitizerGroups(parseArgValues(D, Arg, DiagnoseErrors));
277+
Remove |= expandSanitizerGroups(parseArgValues(D, Arg, DiagnoseErrors));
276278
}
277279
}
278280

279-
// Apply default trapping behavior.
280-
TrappingKinds |= TrappingDefault & ~TrapRemove;
281+
// Apply default behavior.
282+
Kinds |= Default & ~Remove;
283+
284+
return Kinds;
285+
}
281286

282-
return TrappingKinds;
287+
static SanitizerMask parseSanitizeTrapArgs(const Driver &D,
288+
const llvm::opt::ArgList &Args,
289+
bool DiagnoseErrors) {
290+
return parseSanitizeArgs(D, Args, DiagnoseErrors, TrappingSupported,
291+
TrappingDefault, options::OPT_fsanitize_trap_EQ,
292+
options::OPT_fno_sanitize_trap_EQ);
283293
}
284294

285295
bool SanitizerArgs::needsFuzzerInterceptors() const {

clang/lib/Driver/ToolChains/FreeBSD.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,14 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
213213
CmdArgs.push_back("-m");
214214
CmdArgs.push_back("elf64lriscv");
215215
break;
216+
case llvm::Triple::loongarch32:
217+
CmdArgs.push_back("-m");
218+
CmdArgs.push_back("elf32loongarch");
219+
break;
220+
case llvm::Triple::loongarch64:
221+
CmdArgs.push_back("-m");
222+
CmdArgs.push_back("elf64loongarch");
223+
break;
216224
default:
217225
break;
218226
}
@@ -223,6 +231,12 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
223231
CmdArgs.push_back("--no-relax");
224232
}
225233

234+
if (Triple.isLoongArch64()) {
235+
CmdArgs.push_back("-X");
236+
if (Args.hasArg(options::OPT_mno_relax))
237+
CmdArgs.push_back("--no-relax");
238+
}
239+
226240
if (Arg *A = Args.getLastArg(options::OPT_G)) {
227241
if (ToolChain.getTriple().isMIPS()) {
228242
StringRef v = A->getValue();

clang/test/Driver/freebsd.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,21 @@
7777
// RUN: | FileCheck --check-prefix=CHECK-RV64I-LD %s
7878
// CHECK-RV64I-LD: ld{{.*}}" {{.*}} "-m" "elf64lriscv"
7979
//
80+
// Check that LoongArch passes the correct linker emulation.
81+
//
82+
// RUN: %clang --target=loongarch32-freebsd -### %s %s 2>&1 \
83+
// RUN: | FileCheck --check-prefix=CHECK-LA32-LD %s
84+
// CHECK-LA32-LD: ld{{.*}}" {{.*}} "-m" "elf32loongarch"
85+
// RUN: %clang --target=loongarch64-freebsd -### %s %s 2>&1 \
86+
// RUN: | FileCheck --check-prefix=CHECK-LA64-LD %s
87+
// CHECK-LA64-LD: ld{{.*}}" {{.*}} "-m" "elf64loongarch"
88+
//
89+
// Check options passed to the linker on LoongArch
90+
//
91+
// RUN: %clang --target=loongarch64-freebsd -mno-relax -### %s %s 2>&1 \
92+
// RUN: | FileCheck --check-prefix=CHECK-LA64-LD-OPTS %s
93+
// CHECK-LA64-LD-OPTS: ld{{.*}}" {{.*}} "-X" "--no-relax"
94+
//
8095
// Check that the new linker flags are passed to FreeBSD
8196
// RUN: %clang --target=x86_64-pc-freebsd10.0 -m32 %s \
8297
// RUN: --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \

libcxxabi/CMakeLists.txt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,49 @@ if (CXX_SUPPORTS_NOSTDINCXX_FLAG)
264264
string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
265265
endif()
266266

267+
function(get_sanitizer_flags OUT_VAR USE_SANITIZER)
268+
set(SANITIZER_FLAGS)
269+
set(USE_SANITIZER "${USE_SANITIZER}")
270+
# NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
271+
# But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
272+
if (USE_SANITIZER AND NOT MSVC)
273+
append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
274+
append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
275+
276+
if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
277+
NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
278+
append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
279+
endif()
280+
if (USE_SANITIZER STREQUAL "Address")
281+
append_flags(SANITIZER_FLAGS "-fsanitize=address")
282+
elseif (USE_SANITIZER STREQUAL "HWAddress")
283+
append_flags(SANITIZER_FLAGS "-fsanitize=hwaddress")
284+
elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
285+
append_flags(SANITIZER_FLAGS -fsanitize=memory)
286+
if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
287+
append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
288+
endif()
289+
elseif (USE_SANITIZER STREQUAL "Undefined")
290+
append_flags(SANITIZER_FLAGS "-fsanitize=undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
291+
elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
292+
USE_SANITIZER STREQUAL "Undefined;Address")
293+
append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
294+
elseif (USE_SANITIZER STREQUAL "Thread")
295+
append_flags(SANITIZER_FLAGS -fsanitize=thread)
296+
elseif (USE_SANITIZER STREQUAL "DataFlow")
297+
append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
298+
else()
299+
message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
300+
endif()
301+
elseif(USE_SANITIZER AND MSVC)
302+
message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
303+
endif()
304+
set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
305+
endfunction()
306+
307+
get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
308+
list(APPEND LIBCXXABI_COMPILE_FLAGS ${SANITIZER_FLAGS})
309+
267310
# Let the library headers know they are currently being used to build the
268311
# library.
269312
add_definitions(-D_LIBCXXABI_BUILDING_LIBRARY)

lld/test/ELF/tls-opt.s

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,17 @@
2828
// DISASM-NEXT: addq $-8, %r28
2929
// DISASM-NEXT: addq $-4, %r16
3030
# NDD
31-
// DISASM-NEXT: addq $-10, %r16, %r16
32-
// DISASM-NEXT: addq $-10, %r16, %r20
33-
// DISASM-NEXT: addq $-10, %r16, %rax
34-
// DISASM-NEXT: addq $-10, %rax, %r16
35-
// DISASM-NEXT: addq $-10, %r8, %r16
36-
// DISASM-NEXT: addq $-10, %rax, %r12
31+
// DISASM-NEXT: addq $-8, %r16, %r16
32+
// DISASM-NEXT: addq $-8, %r16, %r20
33+
// DISASM-NEXT: addq $-8, %r16, %rax
34+
// DISASM-NEXT: addq $-8, %rax, %r16
35+
// DISASM-NEXT: addq $-8, %r8, %r16
36+
// DISASM-NEXT: addq $-8, %rax, %r12
3737
# NDD + NF
38-
// DISASM-NEXT: {nf} addq $-10, %r8, %r16
39-
// DISASM-NEXT: {nf} addq $-10, %rax, %r12
38+
// DISASM-NEXT: {nf} addq $-8, %r8, %r16
39+
// DISASM-NEXT: {nf} addq $-8, %rax, %r12
4040
# NF
41-
// DISASM-NEXT: {nf} addq $-10, %r12
41+
// DISASM-NEXT: {nf} addq $-8, %r12
4242

4343
// LD to LE:
4444
// DISASM-NEXT: movq %fs:0, %rax

lld/test/ELF/x86-64-tls-ie-local.s

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,21 @@
1717
## &.got[1] - 0x1286 = 0x2380 - 0x1286 = 4346
1818
## &.got[2] - 0x128e = 0x2378 - 0x128e = 4330
1919
## &.got[3] - 0x1296 = 0x2380 - 0x1296 = 4330
20-
## &.got[0] - 0x12a0 = 0x2376 - 0x12a0 = 4310
21-
## &.got[1] - 0x12aa = 0x237e - 0x12aa = 4308
22-
## &.got[0] - 0x12b4 = 0x2376 - 0x12b4 = 4290
23-
## &.got[1] - 0x12be = 0x237e - 0x12be = 4288
24-
## &.got[0] - 0x12c8 = 0x2376 - 0x12c8 = 4270
20+
## &.got[0] - 0x12a0 = 0x2378 - 0x12a0 = 4312
21+
## &.got[1] - 0x12aa = 0x2380 - 0x12aa = 4310
22+
## &.got[0] - 0x12b4 = 0x2378 - 0x12b4 = 4292
23+
## &.got[1] - 0x12be = 0x2380 - 0x12be = 4290
24+
## &.got[0] - 0x12c8 = 0x2378 - 0x12c8 = 4272
2525

2626
# CHECK: 1278: addq 4345(%rip), %rax
2727
# CHECK-NEXT: 127f: addq 4346(%rip), %rax
2828
# CHECK-NEXT: 1286: addq 4330(%rip), %r16
2929
# CHECK-NEXT: 128e: addq 4330(%rip), %r16
30-
# CHECK-NEXT: 1296: addq %r8, 4310(%rip), %r16
31-
# CHECK-NEXT: 12a0: addq 4308(%rip), %rax, %r12
32-
# CHECK-NEXT: 12aa: {nf} addq %r8, 4290(%rip), %r16
33-
# CHECK-NEXT: 12b4: {nf} addq 4288(%rip), %rax, %r12
34-
# CHECK-NEXT: 12be: {nf} addq 4270(%rip), %r12
30+
# CHECK-NEXT: 1296: addq %r8, 4312(%rip), %r16
31+
# CHECK-NEXT: 12a0: addq 4310(%rip), %rax, %r12
32+
# CHECK-NEXT: 12aa: {nf} addq %r8, 4292(%rip), %r16
33+
# CHECK-NEXT: 12b4: {nf} addq 4290(%rip), %rax, %r12
34+
# CHECK-NEXT: 12be: {nf} addq 4272(%rip), %r12
3535

3636
addq foo@GOTTPOFF(%rip), %rax
3737
addq bar@GOTTPOFF(%rip), %rax

lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_loongarch64.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "NativeRegisterContextLinux_loongarch64.h"
1212

1313
#include "lldb/Host/HostInfo.h"
14+
#include "lldb/Host/linux/Ptrace.h"
1415
#include "lldb/Utility/DataBufferHeap.h"
1516
#include "lldb/Utility/Log.h"
1617
#include "lldb/Utility/RegisterValue.h"
@@ -62,6 +63,16 @@ NativeRegisterContextLinux_loongarch64::NativeRegisterContextLinux_loongarch64(
6263
::memset(&m_fpr, 0, sizeof(m_fpr));
6364
::memset(&m_gpr, 0, sizeof(m_gpr));
6465

66+
::memset(&m_hwp_regs, 0, sizeof(m_hwp_regs));
67+
::memset(&m_hbp_regs, 0, sizeof(m_hbp_regs));
68+
69+
// Refer to:
70+
// https://loongson.github.io/LoongArch-Documentation/LoongArch-Vol1-EN.html#control-and-status-registers-related-to-watchpoints
71+
// 14 is just a maximum value, query hardware for actual watchpoint count.
72+
m_max_hwp_supported = 14;
73+
m_max_hbp_supported = 14;
74+
m_refresh_hwdebug_info = true;
75+
6576
m_gpr_is_valid = false;
6677
m_fpu_is_valid = false;
6778
}
@@ -337,4 +348,73 @@ NativeRegisterContextLinux_loongarch64::GetExpeditedRegisters(
337348
return expedited_reg_nums;
338349
}
339350

351+
llvm::Error NativeRegisterContextLinux_loongarch64::ReadHardwareDebugInfo() {
352+
if (!m_refresh_hwdebug_info)
353+
return llvm::Error::success();
354+
355+
::pid_t tid = m_thread.GetID();
356+
357+
int regset = NT_LOONGARCH_HW_WATCH;
358+
struct iovec ioVec;
359+
struct user_watch_state dreg_state;
360+
Status error;
361+
362+
ioVec.iov_base = &dreg_state;
363+
ioVec.iov_len = sizeof(dreg_state);
364+
error = NativeProcessLinux::PtraceWrapper(PTRACE_GETREGSET, tid, &regset,
365+
&ioVec, ioVec.iov_len);
366+
if (error.Fail())
367+
return error.ToError();
368+
369+
m_max_hwp_supported = dreg_state.dbg_info & 0x3f;
370+
371+
regset = NT_LOONGARCH_HW_BREAK;
372+
error = NativeProcessLinux::PtraceWrapper(PTRACE_GETREGSET, tid, &regset,
373+
&ioVec, ioVec.iov_len);
374+
if (error.Fail())
375+
return error.ToError();
376+
377+
m_max_hbp_supported = dreg_state.dbg_info & 0x3f;
378+
379+
m_refresh_hwdebug_info = false;
380+
381+
return llvm::Error::success();
382+
}
383+
384+
llvm::Error NativeRegisterContextLinux_loongarch64::WriteHardwareDebugRegs(
385+
DREGType hwbType) {
386+
struct iovec ioVec;
387+
struct user_watch_state dreg_state;
388+
int regset;
389+
390+
memset(&dreg_state, 0, sizeof(dreg_state));
391+
ioVec.iov_base = &dreg_state;
392+
393+
switch (hwbType) {
394+
case eDREGTypeWATCH:
395+
regset = NT_LOONGARCH_HW_WATCH;
396+
ioVec.iov_len = sizeof(dreg_state.dbg_info) +
397+
(sizeof(dreg_state.dbg_regs[0]) * m_max_hwp_supported);
398+
399+
for (uint32_t i = 0; i < m_max_hwp_supported; i++) {
400+
dreg_state.dbg_regs[i].addr = m_hwp_regs[i].address;
401+
dreg_state.dbg_regs[i].ctrl = m_hwp_regs[i].control;
402+
}
403+
break;
404+
case eDREGTypeBREAK:
405+
regset = NT_LOONGARCH_HW_BREAK;
406+
ioVec.iov_len = sizeof(dreg_state.dbg_info) +
407+
(sizeof(dreg_state.dbg_regs[0]) * m_max_hbp_supported);
408+
409+
for (uint32_t i = 0; i < m_max_hbp_supported; i++) {
410+
dreg_state.dbg_regs[i].addr = m_hbp_regs[i].address;
411+
dreg_state.dbg_regs[i].ctrl = m_hbp_regs[i].control;
412+
}
413+
break;
414+
}
415+
416+
return NativeProcessLinux::PtraceWrapper(PTRACE_SETREGSET, m_thread.GetID(),
417+
&regset, &ioVec, ioVec.iov_len)
418+
.ToError();
419+
}
340420
#endif // defined(__loongarch__) && __loongarch_grlen == 64

lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_loongarch64.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#define lldb_NativeRegisterContextLinux_loongarch64_h
1313

1414
#include "Plugins/Process/Linux/NativeRegisterContextLinux.h"
15+
#include "Plugins/Process/Utility/NativeRegisterContextDBReg_loongarch.h"
1516
#include "Plugins/Process/Utility/RegisterInfoPOSIX_loongarch64.h"
1617

1718
#include <asm/ptrace.h>
@@ -22,7 +23,8 @@ namespace process_linux {
2223
class NativeProcessLinux;
2324

2425
class NativeRegisterContextLinux_loongarch64
25-
: public NativeRegisterContextLinux {
26+
: public NativeRegisterContextLinux,
27+
public NativeRegisterContextDBReg_loongarch {
2628
public:
2729
NativeRegisterContextLinux_loongarch64(
2830
const ArchSpec &target_arch, NativeThreadProtocol &native_thread,
@@ -71,6 +73,7 @@ class NativeRegisterContextLinux_loongarch64
7173
private:
7274
bool m_gpr_is_valid;
7375
bool m_fpu_is_valid;
76+
bool m_refresh_hwdebug_info;
7477

7578
RegisterInfoPOSIX_loongarch64::GPR m_gpr;
7679

@@ -83,6 +86,10 @@ class NativeRegisterContextLinux_loongarch64
8386
uint32_t CalculateFprOffset(const RegisterInfo *reg_info) const;
8487

8588
const RegisterInfoPOSIX_loongarch64 &GetRegisterInfo() const;
89+
90+
llvm::Error ReadHardwareDebugInfo() override;
91+
92+
llvm::Error WriteHardwareDebugRegs(DREGType hwbType) override;
8693
};
8794

8895
} // namespace process_linux

0 commit comments

Comments
 (0)