Skip to content

Commit 474929f

Browse files
authored
Merge branch 'main' into prefetch-prepare
2 parents 564c38e + 046ae85 commit 474929f

File tree

14 files changed

+241
-141
lines changed

14 files changed

+241
-141
lines changed

compiler-rt/lib/scudo/standalone/combined.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,7 @@ class Allocator {
171171
Primary.Options.set(OptionBit::DeallocTypeMismatch);
172172
if (getFlags()->delete_size_mismatch)
173173
Primary.Options.set(OptionBit::DeleteSizeMismatch);
174-
if (allocatorSupportsMemoryTagging<AllocatorConfig>() &&
175-
systemSupportsMemoryTagging())
174+
if (systemSupportsMemoryTagging())
176175
Primary.Options.set(OptionBit::UseMemoryTagging);
177176

178177
QuarantineMaxChunkSize =

compiler-rt/lib/scudo/standalone/memtag.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ inline bool systemSupportsMemoryTagging() {
6666
#ifndef HWCAP2_MTE
6767
#define HWCAP2_MTE (1 << 18)
6868
#endif
69-
return getauxval(AT_HWCAP2) & HWCAP2_MTE;
69+
static bool SupportsMemoryTagging = getauxval(AT_HWCAP2) & HWCAP2_MTE;
70+
return SupportsMemoryTagging;
7071
}
7172

7273
inline bool systemDetectsMemoryTagFaultsTestOnly() {
@@ -261,9 +262,7 @@ inline uptr loadTag(uptr Ptr) {
261262

262263
#else
263264

264-
inline NORETURN bool systemSupportsMemoryTagging() {
265-
UNREACHABLE("memory tagging not supported");
266-
}
265+
inline bool systemSupportsMemoryTagging() { return false; }
267266

268267
inline NORETURN bool systemDetectsMemoryTagFaultsTestOnly() {
269268
UNREACHABLE("memory tagging not supported");

compiler-rt/lib/scudo/standalone/tests/memtag_test.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ TEST(MemtagBasicDeathTest, Unsupported) {
2828
EXPECT_DEATH(untagPointer((uptr)0), "not supported");
2929
EXPECT_DEATH(extractTag((uptr)0), "not supported");
3030

31-
EXPECT_DEATH(systemSupportsMemoryTagging(), "not supported");
3231
EXPECT_DEATH(systemDetectsMemoryTagFaultsTestOnly(), "not supported");
3332
EXPECT_DEATH(enableSystemMemoryTaggingTestOnly(), "not supported");
3433

compiler-rt/lib/scudo/standalone/tests/secondary_test.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@
2727
const scudo::uptr PageSize = scudo::getPageSizeCached();
2828

2929
template <typename Config> static scudo::Options getOptionsForConfig() {
30-
if (!Config::getMaySupportMemoryTagging() ||
31-
!scudo::archSupportsMemoryTagging() ||
32-
!scudo::systemSupportsMemoryTagging())
30+
if (!scudo::systemSupportsMemoryTagging())
3331
return {};
3432
scudo::AtomicOptions AO;
3533
AO.set(scudo::OptionBit::UseMemoryTagging);

compiler-rt/lib/scudo/standalone/tests/wrappers_cpp_test.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,7 @@ TEST_F(ScudoWrappersCppTest, ThreadedNew) {
187187
// TODO: Investigate why libc sometimes crashes with tag missmatch in
188188
// __pthread_clockjoin_ex.
189189
std::unique_ptr<scudo::ScopedDisableMemoryTagChecks> NoTags;
190-
if (!SCUDO_ANDROID && scudo::archSupportsMemoryTagging() &&
191-
scudo::systemSupportsMemoryTagging())
190+
if (!SCUDO_ANDROID && scudo::systemSupportsMemoryTagging())
192191
NoTags = std::make_unique<scudo::ScopedDisableMemoryTagChecks>();
193192

194193
Ready = false;

libc/src/__support/OSUtil/linux/fcntl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ ErrorOr<int> fcntl(int fd, int cmd, void *arg) {
6666
LIBC_NAMESPACE::syscall_impl<int>(FCNTL_SYSCALL_ID, fd, cmd, &flk64);
6767
// On failure, return
6868
if (ret < 0)
69-
return Error(-1);
69+
return Error(-ret);
7070
// Check for overflow, i.e. the offsets are not the same when cast
7171
// to off_t from off64_t.
7272
if (static_cast<off_t>(flk64.l_len) != flk64.l_len ||

libc/test/src/fcntl/fcntl_test.cpp

Lines changed: 99 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -94,68 +94,105 @@ TEST_F(LlvmLibcFcntlTest, FcntlSetFl) {
9494
ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
9595
}
9696

97-
TEST_F(LlvmLibcFcntlTest, FcntlGetLkRead) {
98-
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
99-
constexpr const char *TEST_FILE_NAME = "testdata/fcntl_getlkread.test";
100-
auto TEST_FILE = libc_make_test_file_path(TEST_FILE_NAME);
101-
102-
struct flock flk, svflk;
103-
int retVal;
104-
int fd =
105-
LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_TRUNC | O_RDONLY, S_IRWXU);
106-
ASSERT_ERRNO_SUCCESS();
107-
ASSERT_GT(fd, 0);
108-
109-
flk.l_type = F_RDLCK;
110-
flk.l_start = 0;
111-
flk.l_whence = SEEK_SET;
112-
flk.l_len = 50;
113-
114-
// copy flk into svflk
115-
svflk = flk;
116-
117-
retVal = LIBC_NAMESPACE::fcntl(fd, F_GETLK, &svflk);
118-
ASSERT_ERRNO_SUCCESS();
119-
ASSERT_GT(retVal, -1);
120-
ASSERT_NE((int)flk.l_type, F_WRLCK); // File should not be write locked.
121-
122-
retVal = LIBC_NAMESPACE::fcntl(fd, F_SETLK, &svflk);
123-
ASSERT_ERRNO_SUCCESS();
124-
ASSERT_GT(retVal, -1);
125-
126-
ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
127-
}
128-
129-
TEST_F(LlvmLibcFcntlTest, FcntlGetLkWrite) {
130-
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
131-
constexpr const char *TEST_FILE_NAME = "testdata/fcntl_getlkwrite.test";
132-
auto TEST_FILE = libc_make_test_file_path(TEST_FILE_NAME);
133-
134-
struct flock flk, svflk;
135-
int retVal;
136-
int fd = LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, S_IRWXU);
137-
ASSERT_ERRNO_SUCCESS();
138-
ASSERT_GT(fd, 0);
139-
140-
flk.l_type = F_WRLCK;
141-
flk.l_start = 0;
142-
flk.l_whence = SEEK_SET;
143-
flk.l_len = 0;
144-
145-
// copy flk into svflk
146-
svflk = flk;
147-
148-
retVal = LIBC_NAMESPACE::fcntl(fd, F_GETLK, &svflk);
149-
ASSERT_ERRNO_SUCCESS();
150-
ASSERT_GT(retVal, -1);
151-
ASSERT_NE((int)flk.l_type, F_RDLCK); // File should not be read locked.
152-
153-
retVal = LIBC_NAMESPACE::fcntl(fd, F_SETLK, &svflk);
154-
ASSERT_ERRNO_SUCCESS();
155-
ASSERT_GT(retVal, -1);
156-
157-
ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
158-
}
97+
/* Tests that are common between OFD and traditional variants of fcntl locks. */
98+
template <int GETLK_CMD, int SETLK_CMD>
99+
class LibcFcntlCommonLockTests : public LlvmLibcFcntlTest {
100+
public:
101+
void GetLkRead() {
102+
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
103+
constexpr const char *TEST_FILE_NAME = "testdata/fcntl_getlkread.test";
104+
const auto TEST_FILE = libc_make_test_file_path(TEST_FILE_NAME);
105+
106+
struct flock flk = {};
107+
struct flock svflk = {};
108+
int retVal;
109+
int fd =
110+
LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_TRUNC | O_RDONLY, S_IRWXU);
111+
ASSERT_ERRNO_SUCCESS();
112+
ASSERT_GT(fd, 0);
113+
114+
flk.l_type = F_RDLCK;
115+
flk.l_start = 0;
116+
flk.l_whence = SEEK_SET;
117+
flk.l_len = 50;
118+
119+
// copy flk into svflk
120+
svflk = flk;
121+
122+
retVal = LIBC_NAMESPACE::fcntl(fd, GETLK_CMD, &svflk);
123+
ASSERT_ERRNO_SUCCESS();
124+
ASSERT_GT(retVal, -1);
125+
ASSERT_NE((int)svflk.l_type, F_WRLCK); // File should not be write locked.
126+
127+
retVal = LIBC_NAMESPACE::fcntl(fd, SETLK_CMD, &svflk);
128+
ASSERT_ERRNO_SUCCESS();
129+
ASSERT_GT(retVal, -1);
130+
131+
ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
132+
}
133+
134+
void GetLkWrite() {
135+
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
136+
constexpr const char *TEST_FILE_NAME = "testdata/fcntl_getlkwrite.test";
137+
const auto TEST_FILE = libc_make_test_file_path(TEST_FILE_NAME);
138+
139+
struct flock flk = {};
140+
struct flock svflk = {};
141+
int retVal;
142+
int fd =
143+
LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, S_IRWXU);
144+
ASSERT_ERRNO_SUCCESS();
145+
ASSERT_GT(fd, 0);
146+
147+
flk.l_type = F_WRLCK;
148+
flk.l_start = 0;
149+
flk.l_whence = SEEK_SET;
150+
flk.l_len = 0;
151+
152+
// copy flk into svflk
153+
svflk = flk;
154+
155+
retVal = LIBC_NAMESPACE::fcntl(fd, GETLK_CMD, &svflk);
156+
ASSERT_ERRNO_SUCCESS();
157+
ASSERT_GT(retVal, -1);
158+
ASSERT_NE((int)svflk.l_type, F_RDLCK); // File should not be read locked.
159+
160+
retVal = LIBC_NAMESPACE::fcntl(fd, SETLK_CMD, &svflk);
161+
ASSERT_ERRNO_SUCCESS();
162+
ASSERT_GT(retVal, -1);
163+
164+
ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
165+
}
166+
167+
void UseAfterClose() {
168+
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
169+
constexpr const char *TEST_FILE_NAME =
170+
"testdata/fcntl_use_after_close.test";
171+
const auto TEST_FILE = libc_make_test_file_path(TEST_FILE_NAME);
172+
int fd =
173+
LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, S_IRWXU);
174+
ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
175+
176+
flock flk = {};
177+
flk.l_type = F_RDLCK;
178+
flk.l_start = 0;
179+
flk.l_whence = SEEK_SET;
180+
flk.l_len = 50;
181+
ASSERT_EQ(-1, LIBC_NAMESPACE::fcntl(fd, GETLK_CMD, &flk));
182+
ASSERT_ERRNO_EQ(EBADF);
183+
}
184+
};
185+
186+
#define COMMON_LOCK_TESTS(NAME, GETLK_CMD, SETLK_CMD) \
187+
using NAME = LibcFcntlCommonLockTests<GETLK_CMD, SETLK_CMD>; \
188+
TEST_F(NAME, GetLkRead) { GetLkRead(); } \
189+
TEST_F(NAME, GetLkWrite) { GetLkWrite(); } \
190+
TEST_F(NAME, UseAfterClose) { UseAfterClose(); } \
191+
static_assert(true, "Require semicolon.")
192+
193+
COMMON_LOCK_TESTS(LlvmLibcFcntlProcessAssociatedLockTest, F_GETLK, F_SETLK);
194+
COMMON_LOCK_TESTS(LlvmLibcFcntlOpenFileDescriptionLockTest, F_OFD_GETLK,
195+
F_OFD_SETLK);
159196

160197
TEST_F(LlvmLibcFcntlTest, UseAfterClose) {
161198
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;

lldb/test/Shell/helper/build.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,19 @@ def _get_link_command(self):
804804
args.extend(self._obj_file_names())
805805

806806
if sys.platform == "darwin":
807+
# By default, macOS doesn't allow injecting the ASAN
808+
# runtime into system processes.
809+
system_clang = (
810+
subprocess.check_output(["xcrun", "-find", "clang"])
811+
.strip()
812+
.decode("utf-8")
813+
)
814+
system_liblto = os.path.join(
815+
os.path.dirname(os.path.dirname(system_clang)), "lib", "libLTO.dylib"
816+
)
807817
args.extend(["-isysroot", self.apple_sdk])
818+
args.extend(["-Wl,-lto_library", "-Wl," + system_liblto])
819+
808820
elif self.objc_gnustep_lib:
809821
args.extend(["-L", self.objc_gnustep_lib, "-lobjc"])
810822
if sys.platform == "linux":

llvm/include/llvm/Support/SpecialCaseList.h

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,16 @@ class SpecialCaseList {
126126
SpecialCaseList &operator=(SpecialCaseList const &) = delete;
127127

128128
private:
129+
using Match = std::pair<StringRef, unsigned>;
130+
static constexpr Match NotMatched = {"", 0};
131+
129132
// Lagacy v1 matcher.
130133
class RegexMatcher {
131134
public:
132135
LLVM_ABI Error insert(StringRef Pattern, unsigned LineNumber);
133136
LLVM_ABI void preprocess(bool BySize);
134137

135-
LLVM_ABI void
136-
match(StringRef Query,
137-
llvm::function_ref<void(StringRef Rule, unsigned LineNo)> Cb) const;
138+
LLVM_ABI Match match(StringRef Query) const;
138139

139140
struct Reg {
140141
Reg(StringRef Name, unsigned LineNo, Regex &&Rg)
@@ -152,9 +153,7 @@ class SpecialCaseList {
152153
LLVM_ABI Error insert(StringRef Pattern, unsigned LineNumber);
153154
LLVM_ABI void preprocess(bool BySize);
154155

155-
LLVM_ABI void
156-
match(StringRef Query,
157-
llvm::function_ref<void(StringRef Rule, unsigned LineNo)> Cb) const;
156+
LLVM_ABI Match match(StringRef Query) const;
158157

159158
struct Glob {
160159
Glob(StringRef Name, unsigned LineNo, GlobPattern &&Pattern)
@@ -168,11 +167,10 @@ class SpecialCaseList {
168167

169168
RadixTree<iterator_range<StringRef::const_iterator>,
170169
RadixTree<iterator_range<StringRef::const_reverse_iterator>,
171-
SmallVector<const GlobMatcher::Glob *, 1>>>
170+
SmallVector<int, 1>>>
172171
PrefixSuffixToGlob;
173172

174-
RadixTree<iterator_range<StringRef::const_iterator>,
175-
SmallVector<const GlobMatcher::Glob *, 1>>
173+
RadixTree<iterator_range<StringRef::const_iterator>, SmallVector<int, 1>>
176174
SubstrToGlob;
177175
};
178176

@@ -184,14 +182,10 @@ class SpecialCaseList {
184182
LLVM_ABI Error insert(StringRef Pattern, unsigned LineNumber);
185183
LLVM_ABI void preprocess(bool BySize);
186184

187-
LLVM_ABI void
188-
match(StringRef Query,
189-
llvm::function_ref<void(StringRef Rule, unsigned LineNo)> Cb) const;
185+
LLVM_ABI Match match(StringRef Query) const;
190186

191187
LLVM_ABI bool matchAny(StringRef Query) const {
192-
bool R = false;
193-
match(Query, [&](StringRef, unsigned) { R = true; });
194-
return R;
188+
return match(Query) != NotMatched;
195189
}
196190

197191
std::variant<RegexMatcher, GlobMatcher> M;

0 commit comments

Comments
 (0)