Skip to content

Commit 9b2bded

Browse files
author
iclsrc
committed
Merge from 'main' to 'sycl-web'
2 parents 2bdccf6 + ca4be0f commit 9b2bded

File tree

67 files changed

+2859
-2382
lines changed

Some content is hidden

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

67 files changed

+2859
-2382
lines changed

clang/docs/ClangCommandLineReference.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -875,7 +875,7 @@ Inline functions which are (explicitly or implicitly) marked inline
875875

876876
.. option:: -flegacy-pass-manager, -fno-experimental-new-pass-manager, -fno-legacy-pass-manager
877877

878-
Use the legacy pass manager in LLVM
878+
Use the legacy pass manager in LLVM (deprecated, to be removed in a future release)
879879

880880
.. option:: -fno-crash-diagnostics
881881

clang/include/clang/Basic/BuiltinsNVPTX.def

+7-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,11 @@
3939
#pragma push_macro("PTX70")
4040
#pragma push_macro("PTX71")
4141
#pragma push_macro("PTX72")
42-
#define PTX72 "ptx72"
42+
#pragma push_macro("PTX73")
43+
#pragma push_macro("PTX74")
44+
#define PTX74 "ptx74"
45+
#define PTX73 "ptx73|" PTX74
46+
#define PTX72 "ptx72|" PTX73
4347
#define PTX71 "ptx71|" PTX72
4448
#define PTX70 "ptx70|" PTX71
4549
#define PTX65 "ptx65|" PTX70
@@ -818,3 +822,5 @@ TARGET_BUILTIN(__nvvm_cp_async_wait_all, "v", "", AND(SM_80,PTX70))
818822
#pragma pop_macro("PTX70")
819823
#pragma pop_macro("PTX71")
820824
#pragma pop_macro("PTX72")
825+
#pragma pop_macro("PTX73")
826+
#pragma pop_macro("PTX74")

clang/include/clang/Driver/Options.td

+1-1
Original file line numberDiff line numberDiff line change
@@ -1895,7 +1895,7 @@ def fexperimental_isel : Flag<["-"], "fexperimental-isel">, Group<f_clang_Group>
18951895
Alias<fglobal_isel>;
18961896
defm legacy_pass_manager : BoolOption<"f", "legacy-pass-manager",
18971897
CodeGenOpts<"LegacyPassManager">, Default<"!static_cast<unsigned>(LLVM_ENABLE_NEW_PASS_MANAGER)">,
1898-
PosFlag<SetTrue, [], "Use the legacy pass manager in LLVM">,
1898+
PosFlag<SetTrue, [], "Use the legacy pass manager in LLVM (deprecated, to be removed in a future release)">,
18991899
NegFlag<SetFalse, [], "Use the new pass manager in LLVM">,
19001900
BothFlags<[CC1Option]>>, Group<f_clang_Group>;
19011901
def fexperimental_new_pass_manager : Flag<["-"], "fexperimental-new-pass-manager">,

clang/lib/AST/Decl.cpp

+9-5
Original file line numberDiff line numberDiff line change
@@ -2220,14 +2220,18 @@ VarDecl *VarDecl::getActingDefinition() {
22202220
return nullptr;
22212221

22222222
VarDecl *LastTentative = nullptr;
2223-
VarDecl *First = getFirstDecl();
2224-
for (auto I : First->redecls()) {
2225-
Kind = I->isThisDeclarationADefinition();
2223+
2224+
// Loop through the declaration chain, starting with the most recent.
2225+
for (VarDecl *Decl = getMostRecentDecl(); Decl;
2226+
Decl = Decl->getPreviousDecl()) {
2227+
Kind = Decl->isThisDeclarationADefinition();
22262228
if (Kind == Definition)
22272229
return nullptr;
2228-
if (Kind == TentativeDefinition)
2229-
LastTentative = I;
2230+
// Record the first (most recent) TentativeDefinition that is encountered.
2231+
if (Kind == TentativeDefinition && !LastTentative)
2232+
LastTentative = Decl;
22302233
}
2234+
22312235
return LastTentative;
22322236
}
22332237

clang/lib/CodeGen/CGDebugInfo.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -4374,8 +4374,10 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD,
43744374
// Create the descriptor for the variable.
43754375
llvm::DILocalVariable *D = nullptr;
43764376
if (ArgNo) {
4377+
llvm::DINodeArray Annotations = CollectBTFTagAnnotations(VD);
43774378
D = DBuilder.createParameterVariable(Scope, Name, *ArgNo, Unit, Line, Ty,
4378-
CGM.getLangOpts().Optimize, Flags);
4379+
CGM.getLangOpts().Optimize, Flags,
4380+
Annotations);
43794381
} else {
43804382
// For normal local variable, we will try to find out whether 'VD' is the
43814383
// copy parameter of coroutine.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// REQUIRES: x86-registered-target
2+
// RUN: %clang -target x86_64 -g -S -emit-llvm -o - %s | FileCheck %s
3+
4+
#define __tag1 __attribute__((btf_tag("tag1")))
5+
#define __tag2 __attribute__((btf_tag("tag2")))
6+
7+
struct t1 {
8+
int a;
9+
};
10+
11+
int foo(struct t1 __tag1 __tag2 *arg) {
12+
return arg->a;
13+
}
14+
15+
// CHECK: !DILocalVariable(name: "arg", arg: 1, scope: ![[#]], file: ![[#]], line: [[#]], type: ![[#]], annotations: ![[ANNOT:[0-9]+]])
16+
// CHECK: ![[ANNOT]] = !{![[TAG1:[0-9]+]], ![[TAG2:[0-9]+]]}
17+
// CHECK: ![[TAG1]] = !{!"btf_tag", !"tag1"}
18+
// CHECK: ![[TAG2]] = !{!"btf_tag", !"tag2"}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// RUN: %clang_cc1 -emit-llvm -triple x86_64-linux-unknown < %s | FileCheck %s
2+
3+
char arr[10];
4+
char arr[10] __attribute__((section("datadata")));
5+
char arr[10] __attribute__((aligned(16)));
6+
7+
// CHECK: @arr ={{.*}}section "datadata", align 16

compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc

+32-37
Original file line numberDiff line numberDiff line change
@@ -9951,13 +9951,17 @@ INTERCEPTOR(int, getentropy, void *buf, SIZE_T buflen) {
99519951

99529952
#if SANITIZER_INTERCEPT_QSORT_R
99539953
typedef int (*qsort_r_compar_f)(const void *, const void *, void *);
9954-
static THREADLOCAL qsort_r_compar_f qsort_r_compar;
9955-
static THREADLOCAL SIZE_T qsort_r_size;
9954+
struct qsort_r_compar_params {
9955+
SIZE_T size;
9956+
qsort_r_compar_f compar;
9957+
void *arg;
9958+
};
99569959
static int wrapped_qsort_r_compar(const void *a, const void *b, void *arg) {
9960+
qsort_r_compar_params *params = (qsort_r_compar_params *)arg;
99579961
COMMON_INTERCEPTOR_UNPOISON_PARAM(3);
9958-
COMMON_INTERCEPTOR_INITIALIZE_RANGE(a, qsort_r_size);
9959-
COMMON_INTERCEPTOR_INITIALIZE_RANGE(b, qsort_r_size);
9960-
return qsort_r_compar(a, b, arg);
9962+
COMMON_INTERCEPTOR_INITIALIZE_RANGE(a, params->size);
9963+
COMMON_INTERCEPTOR_INITIALIZE_RANGE(b, params->size);
9964+
return params->compar(a, b, params->arg);
99619965
}
99629966

99639967
INTERCEPTOR(void, qsort_r, void *base, SIZE_T nmemb, SIZE_T size,
@@ -9973,34 +9977,24 @@ INTERCEPTOR(void, qsort_r, void *base, SIZE_T nmemb, SIZE_T size,
99739977
compar(p, q, arg);
99749978
}
99759979
}
9976-
qsort_r_compar_f old_compar = qsort_r_compar;
9977-
SIZE_T old_size = qsort_r_size;
9978-
// Handle qsort_r() implementations that recurse using an
9979-
// interposable function call:
9980-
bool already_wrapped = compar == wrapped_qsort_r_compar;
9981-
if (already_wrapped) {
9982-
// This case should only happen if the qsort() implementation calls itself
9983-
// using a preemptible function call (e.g. the FreeBSD libc version).
9984-
// Check that the size and comparator arguments are as expected.
9985-
CHECK_NE(compar, qsort_r_compar);
9986-
CHECK_EQ(qsort_r_size, size);
9987-
} else {
9988-
qsort_r_compar = compar;
9989-
qsort_r_size = size;
9990-
}
9991-
REAL(qsort_r)(base, nmemb, size, wrapped_qsort_r_compar, arg);
9992-
if (!already_wrapped) {
9993-
qsort_r_compar = old_compar;
9994-
qsort_r_size = old_size;
9995-
}
9980+
qsort_r_compar_params params = {size, compar, arg};
9981+
REAL(qsort_r)(base, nmemb, size, wrapped_qsort_r_compar, &params);
99969982
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, base, nmemb * size);
99979983
}
99989984
# define INIT_QSORT_R COMMON_INTERCEPT_FUNCTION(qsort_r)
99999985
#else
100009986
# define INIT_QSORT_R
100019987
#endif
100029988

10003-
#if SANITIZER_INTERCEPT_QSORT
9989+
#if SANITIZER_INTERCEPT_QSORT && SANITIZER_INTERCEPT_QSORT_R
9990+
INTERCEPTOR(void, qsort, void *base, SIZE_T nmemb, SIZE_T size,
9991+
qsort_r_compar_f compar) {
9992+
void *ctx;
9993+
COMMON_INTERCEPTOR_ENTER(ctx, qsort, base, nmemb, size, compar);
9994+
WRAP(qsort_r)(base, nmemb, size, compar, nullptr);
9995+
}
9996+
# define INIT_QSORT COMMON_INTERCEPT_FUNCTION(qsort)
9997+
#elif SANITIZER_INTERCEPT_QSORT && !SANITIZER_INTERCEPT_QSORT_R
100049998
// Glibc qsort uses a temporary buffer allocated either on stack or on heap.
100059999
// Poisoned memory from there may get copied into the comparator arguments,
1000610000
// where it needs to be dealt with. But even that is not enough - the results of
@@ -10057,29 +10051,30 @@ INTERCEPTOR(void, qsort, void *base, SIZE_T nmemb, SIZE_T size,
1005710051
}
1005810052
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, base, nmemb * size);
1005910053
}
10060-
#define INIT_QSORT COMMON_INTERCEPT_FUNCTION(qsort)
10054+
# define INIT_QSORT COMMON_INTERCEPT_FUNCTION(qsort)
1006110055
#else
10062-
#define INIT_QSORT
10056+
# define INIT_QSORT
1006310057
#endif
1006410058

1006510059
#if SANITIZER_INTERCEPT_BSEARCH
1006610060
typedef int (*bsearch_compar_f)(const void *, const void *);
10067-
static THREADLOCAL bsearch_compar_f bsearch_compar;
10068-
static int wrapped_bsearch_compar(const void *a, const void *b) {
10061+
struct bsearch_compar_params {
10062+
const void *key;
10063+
bsearch_compar_f compar;
10064+
};
10065+
10066+
static int wrapped_bsearch_compar(const void *key, const void *b) {
10067+
const bsearch_compar_params *params = (const bsearch_compar_params *)key;
1006910068
COMMON_INTERCEPTOR_UNPOISON_PARAM(2);
10070-
return bsearch_compar(a, b);
10069+
return params->compar(params->key, b);
1007110070
}
1007210071

1007310072
INTERCEPTOR(void *, bsearch, const void *key, const void *base, SIZE_T nmemb,
1007410073
SIZE_T size, bsearch_compar_f compar) {
1007510074
void *ctx;
1007610075
COMMON_INTERCEPTOR_ENTER(ctx, bsearch, key, base, nmemb, size, compar);
10077-
// Unlike qsort, don't expect recursive implementation of bsearch.
10078-
CHECK_NE(compar, wrapped_bsearch_compar);
10079-
Swap(bsearch_compar, compar);
10080-
void *r = REAL(bsearch)(key, base, nmemb, size, wrapped_bsearch_compar);
10081-
bsearch_compar = compar;
10082-
return r;
10076+
bsearch_compar_params params = {key, compar};
10077+
return REAL(bsearch)(&params, base, nmemb, size, wrapped_bsearch_compar);
1008310078
}
1008410079
# define INIT_BSEARCH COMMON_INTERCEPT_FUNCTION(bsearch)
1008510080
#else

lld/MachO/Driver.cpp

+28-68
Original file line numberDiff line numberDiff line change
@@ -224,49 +224,6 @@ static llvm::CachePruningPolicy getLTOCachePolicy(InputArgList &args) {
224224
return CHECK(parseCachePruningPolicy(ltoPolicy), "invalid LTO cache policy");
225225
}
226226

227-
namespace {
228-
struct ArchiveMember {
229-
MemoryBufferRef mbref;
230-
uint32_t modTime;
231-
uint64_t offsetInArchive;
232-
};
233-
} // namespace
234-
235-
// Returns slices of MB by parsing MB as an archive file.
236-
// Each slice consists of a member file in the archive.
237-
static std::vector<ArchiveMember> getArchiveMembers(MemoryBufferRef mb) {
238-
std::unique_ptr<Archive> file =
239-
CHECK(Archive::create(mb),
240-
mb.getBufferIdentifier() + ": failed to parse archive");
241-
Archive *archive = file.get();
242-
make<std::unique_ptr<Archive>>(std::move(file)); // take ownership
243-
244-
std::vector<ArchiveMember> v;
245-
Error err = Error::success();
246-
247-
// Thin archives refer to .o files, so --reproduce needs the .o files too.
248-
bool addToTar = archive->isThin() && tar;
249-
250-
for (const Archive::Child &c : archive->children(err)) {
251-
MemoryBufferRef mbref =
252-
CHECK(c.getMemoryBufferRef(),
253-
mb.getBufferIdentifier() +
254-
": could not get the buffer for a child of the archive");
255-
if (addToTar)
256-
tar->append(relativeToRoot(check(c.getFullName())), mbref.getBuffer());
257-
uint32_t modTime = toTimeT(
258-
CHECK(c.getLastModified(), mb.getBufferIdentifier() +
259-
": could not get the modification "
260-
"time for a child of the archive"));
261-
v.push_back({mbref, modTime, c.getChildOffset()});
262-
}
263-
if (err)
264-
fatal(mb.getBufferIdentifier() +
265-
": Archive::children failed: " + toString(std::move(err)));
266-
267-
return v;
268-
}
269-
270227
static DenseMap<StringRef, ArchiveFile *> loadedArchives;
271228

272229
static InputFile *addFile(StringRef path, bool forceLoadArchive,
@@ -289,48 +246,51 @@ static InputFile *addFile(StringRef path, bool forceLoadArchive,
289246
if (ArchiveFile *cachedFile = loadedArchives[path])
290247
return cachedFile;
291248

292-
std::unique_ptr<object::Archive> file = CHECK(
249+
std::unique_ptr<object::Archive> archive = CHECK(
293250
object::Archive::create(mbref), path + ": failed to parse archive");
294251

295-
if (!file->isEmpty() && !file->hasSymbolTable())
252+
if (!archive->isEmpty() && !archive->hasSymbolTable())
296253
error(path + ": archive has no index; run ranlib to add one");
297254

255+
auto *file = make<ArchiveFile>(std::move(archive));
298256
if (config->allLoad || forceLoadArchive) {
299257
if (Optional<MemoryBufferRef> buffer = readFile(path)) {
300-
for (const ArchiveMember &member : getArchiveMembers(*buffer)) {
301-
if (Optional<InputFile *> file = loadArchiveMember(
302-
member.mbref, member.modTime, path, /*objCOnly=*/false,
303-
member.offsetInArchive)) {
304-
inputFiles.insert(*file);
305-
printArchiveMemberLoad(
306-
(forceLoadArchive ? "-force_load" : "-all_load"),
307-
inputFiles.back());
308-
}
258+
Error e = Error::success();
259+
for (const object::Archive::Child &c : file->getArchive().children(e)) {
260+
StringRef reason = forceLoadArchive ? "-force_load" : "-all_load";
261+
if (Error e = file->fetch(c, reason))
262+
error(toString(file) + ": " + reason +
263+
" failed to load archive member: " + toString(std::move(e)));
309264
}
265+
if (e)
266+
error(toString(file) +
267+
": Archive::children failed: " + toString(std::move(e)));
310268
}
311269
} else if (config->forceLoadObjC) {
312-
for (const object::Archive::Symbol &sym : file->symbols())
270+
for (const object::Archive::Symbol &sym : file->getArchive().symbols())
313271
if (sym.getName().startswith(objc::klass))
314-
symtab->addUndefined(sym.getName(), /*file=*/nullptr,
315-
/*isWeakRef=*/false);
272+
file->fetch(sym);
316273

317274
// TODO: no need to look for ObjC sections for a given archive member if
318-
// we already found that it contains an ObjC symbol. We should also
319-
// consider creating a LazyObjFile class in order to avoid double-loading
320-
// these files here and below (as part of the ArchiveFile).
275+
// we already found that it contains an ObjC symbol.
321276
if (Optional<MemoryBufferRef> buffer = readFile(path)) {
322-
for (const ArchiveMember &member : getArchiveMembers(*buffer)) {
323-
if (Optional<InputFile *> file = loadArchiveMember(
324-
member.mbref, member.modTime, path, /*objCOnly=*/true,
325-
member.offsetInArchive)) {
326-
inputFiles.insert(*file);
327-
printArchiveMemberLoad("-ObjC", inputFiles.back());
328-
}
277+
Error e = Error::success();
278+
for (const object::Archive::Child &c : file->getArchive().children(e)) {
279+
Expected<MemoryBufferRef> mb = c.getMemoryBufferRef();
280+
if (!mb || !hasObjCSection(*mb))
281+
continue;
282+
if (Error e = file->fetch(c, "-ObjC"))
283+
error(toString(file) + ": -ObjC failed to load archive member: " +
284+
toString(std::move(e)));
329285
}
286+
if (e)
287+
error(toString(file) +
288+
": Archive::children failed: " + toString(std::move(e)));
330289
}
331290
}
332291

333-
newFile = loadedArchives[path] = make<ArchiveFile>(std::move(file));
292+
file->addLazySymbols();
293+
newFile = loadedArchives[path] = file;
334294
break;
335295
}
336296
case file_magic::macho_object:

lld/MachO/Driver.h

-5
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,6 @@ findPathCombination(const llvm::Twine &name,
6868
// rerooted.
6969
llvm::StringRef rerootPath(llvm::StringRef path);
7070

71-
llvm::Optional<InputFile *> loadArchiveMember(MemoryBufferRef, uint32_t modTime,
72-
StringRef archiveName,
73-
bool objCOnly,
74-
uint64_t offsetInArchive);
75-
7671
uint32_t getModTime(llvm::StringRef path);
7772

7873
void printArchiveMemberLoad(StringRef reason, const InputFile *);

lld/MachO/DriverUtils.cpp

-25
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#include "lld/Common/Reproduce.h"
1919
#include "llvm/ADT/CachedHashString.h"
2020
#include "llvm/ADT/DenseMap.h"
21-
#include "llvm/Bitcode/BitcodeReader.h"
2221
#include "llvm/LTO/LTO.h"
2322
#include "llvm/Option/Arg.h"
2423
#include "llvm/Option/ArgList.h"
@@ -277,30 +276,6 @@ StringRef macho::rerootPath(StringRef path) {
277276
return path;
278277
}
279278

280-
Optional<InputFile *> macho::loadArchiveMember(MemoryBufferRef mb,
281-
uint32_t modTime,
282-
StringRef archiveName,
283-
bool objCOnly,
284-
uint64_t offsetInArchive) {
285-
if (config->zeroModTime)
286-
modTime = 0;
287-
288-
switch (identify_magic(mb.getBuffer())) {
289-
case file_magic::macho_object:
290-
if (!objCOnly || hasObjCSection(mb))
291-
return make<ObjFile>(mb, modTime, archiveName);
292-
return None;
293-
case file_magic::bitcode:
294-
if (!objCOnly || check(isBitcodeContainingObjCCategory(mb)))
295-
return make<BitcodeFile>(mb, archiveName, offsetInArchive);
296-
return None;
297-
default:
298-
error(archiveName + ": archive member " + mb.getBufferIdentifier() +
299-
" has unhandled file type");
300-
return None;
301-
}
302-
}
303-
304279
uint32_t macho::getModTime(StringRef path) {
305280
if (config->zeroModTime)
306281
return 0;

0 commit comments

Comments
 (0)