Skip to content

Commit ced1593

Browse files
committed
Rebase onto #105602
Created using spr 1.3.5-bogner
2 parents 67a1cc9 + 52df5c4 commit ced1593

File tree

2,327 files changed

+96752
-28006
lines changed

Some content is hidden

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

2,327 files changed

+96752
-28006
lines changed

.github/workflows/commit-access-review.py

Lines changed: 418 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
name: Commit Access Review
2+
3+
on:
4+
workflow_dispatch:
5+
schedule:
6+
# * is a special character in YAML so you have to quote this string
7+
- cron: '0 7 1 * *'
8+
9+
permissions:
10+
contents: read
11+
12+
jobs:
13+
commit-access-review:
14+
if: github.repository_owner == 'llvm'
15+
runs-on: ubuntu-22.04
16+
steps:
17+
- name: Fetch LLVM sources
18+
uses: actions/checkout@v4
19+
20+
- name: Install dependencies
21+
run: |
22+
pip install --require-hashes -r ./llvm/utils/git/requirements.txt
23+
24+
- name: Run Script
25+
env:
26+
GITHUB_TOKEN: ${{ secrets.RELEASE_TASKS_USER_TOKEN }}
27+
run: |
28+
python3 .github/workflows/commit-access-review.py $GITHUB_TOKEN
29+
30+
- name: Upload Triage List
31+
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 #v4.3.0
32+
with:
33+
name: triagers
34+
path: triagers.log

.github/workflows/libcxx-build-and-test.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ jobs:
146146
'generic-no-experimental',
147147
'generic-no-filesystem',
148148
'generic-no-localization',
149+
'generic-no-terminal',
149150
'generic-no-random_device',
150151
'generic-no-threads',
151152
'generic-no-tzdb',

bolt/lib/Core/BinaryFunction.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2502,7 +2502,7 @@ void BinaryFunction::annotateCFIState() {
25022502
}
25032503
}
25042504

2505-
if (!StateStack.empty()) {
2505+
if (opts::Verbosity >= 1 && !StateStack.empty()) {
25062506
BC.errs() << "BOLT-WARNING: non-empty CFI stack at the end of " << *this
25072507
<< '\n';
25082508
}

bolt/lib/Core/BinaryFunctionProfile.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,8 @@ void BinaryFunction::inferFallThroughCounts() {
336336
if (SuccBI.Count == 0) {
337337
SuccBI.Count = Inferred;
338338
SuccBI.MispredictedCount = BinaryBasicBlock::COUNT_INFERRED;
339-
Succ->ExecutionCount += Inferred;
339+
Succ->ExecutionCount =
340+
std::max(Succ->getKnownExecutionCount(), Inferred);
340341
}
341342
}
342343
}

bolt/test/X86/infer-fall-throughs.s

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
## Test that infer-fall-throughs would correctly infer the wrong fall-through
2+
## edge count in the example
3+
4+
# RUN: llvm-mc --filetype=obj --triple x86_64-unknown-unknown %s -o %t.o
5+
# RUN: link_fdata %s %t.o %t.fdata
6+
# RUN: llvm-strip --strip-unneeded %t.o
7+
# RUN: %clang %cflags %t.o -o %t.exe -Wl,-q
8+
# RUN: llvm-bolt %t.exe -o %t.bolt \
9+
# RUN: --print-estimate-edge-counts --data=%t.fdata \
10+
# RUN: 2>&1 | FileCheck --check-prefix=WITHOUTINFERENCE %s
11+
# RUN: llvm-bolt %t.exe -o %t.bolt --infer-fall-throughs \
12+
# RUN: --print-estimate-edge-counts --data=%t.fdata \
13+
# RUN: 2>&1 | FileCheck --check-prefix=CORRECTINFERENCE %s
14+
15+
16+
# WITHOUTINFERENCE: Binary Function "main" after estimate-edge-counts
17+
# WITHOUTINFERENCE: {{^\.Ltmp0}}
18+
# WITHOUTINFERENCE: Successors: .Ltmp1 (mispreds: 0, count: 10), .LFT0 (mispreds: 0, count: 0)
19+
# WITHOUTINFERENCE: {{^\.LFT0}}
20+
# WITHOUTINFERENCE: Exec Count : 490
21+
22+
# CORRECTINFERENCE: Binary Function "main" after estimate-edge-counts
23+
# CORRECTINFERENCE: {{^\.Ltmp0}}
24+
# CORRECTINFERENCE: Successors: .Ltmp1 (mispreds: 0, count: 10), .LFT0 (inferred count: 490)
25+
# CORRECTINFERENCE: {{^\.LFT0}}
26+
# CORRECTINFERENCE: Exec Count : 490
27+
28+
29+
.globl main
30+
.type main, @function
31+
main:
32+
LLmain_LLstart:
33+
jmp LLstart
34+
# FDATA: 1 main #LLmain_LLstart# 1 main #LLstart# 0 500
35+
LLstart:
36+
jge LLexit
37+
# FDATA: 1 main #LLstart# 1 main #LLexit# 0 10
38+
# FDATA: 1 main #LLstart# 1 main #LLmore# 0 0
39+
LLmore:
40+
movl $5, %eax
41+
# FDATA: 1 main #LLmore# 1 main #LLexit# 0 490
42+
LLexit:
43+
ret
44+
.LLmain_end:
45+
.size main, .LLmain_end-main

clang-tools-extra/clang-doc/BitcodeReader.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,10 @@ template <> llvm::Expected<CommentInfo *> getCommentInfo(TypedefInfo *I) {
415415
return &I->Description.emplace_back();
416416
}
417417

418+
template <> llvm::Expected<CommentInfo *> getCommentInfo(EnumValueInfo *I) {
419+
return &I->Description.emplace_back();
420+
}
421+
418422
template <> llvm::Expected<CommentInfo *> getCommentInfo(CommentInfo *I) {
419423
I->Children.emplace_back(std::make_unique<CommentInfo>());
420424
return I->Children.back().get();

clang-tools-extra/clang-doc/BitcodeWriter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,8 @@ void ClangDocBitcodeWriter::emitBlock(const EnumValueInfo &I) {
536536
emitRecord(I.Name, ENUM_VALUE_NAME);
537537
emitRecord(I.Value, ENUM_VALUE_VALUE);
538538
emitRecord(I.ValueExpr, ENUM_VALUE_EXPR);
539+
for (const auto &CI : I.Description)
540+
emitBlock(CI);
539541
}
540542

541543
void ClangDocBitcodeWriter::emitBlock(const RecordInfo &I) {

clang-tools-extra/clang-doc/HTMLGenerator.cpp

Lines changed: 84 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ class HTMLTag {
4848
TAG_SPAN,
4949
TAG_TITLE,
5050
TAG_UL,
51+
TAG_TABLE,
52+
TAG_THEAD,
53+
TAG_TBODY,
54+
TAG_TR,
55+
TAG_TD,
56+
TAG_TH
5157
};
5258

5359
HTMLTag() = default;
@@ -133,6 +139,12 @@ bool HTMLTag::isSelfClosing() const {
133139
case HTMLTag::TAG_SPAN:
134140
case HTMLTag::TAG_TITLE:
135141
case HTMLTag::TAG_UL:
142+
case HTMLTag::TAG_TABLE:
143+
case HTMLTag::TAG_THEAD:
144+
case HTMLTag::TAG_TBODY:
145+
case HTMLTag::TAG_TR:
146+
case HTMLTag::TAG_TD:
147+
case HTMLTag::TAG_TH:
136148
return false;
137149
}
138150
llvm_unreachable("Unhandled HTMLTag::TagType");
@@ -174,6 +186,18 @@ StringRef HTMLTag::toString() const {
174186
return "title";
175187
case HTMLTag::TAG_UL:
176188
return "ul";
189+
case HTMLTag::TAG_TABLE:
190+
return "table";
191+
case HTMLTag::TAG_THEAD:
192+
return "thead";
193+
case HTMLTag::TAG_TBODY:
194+
return "tbody";
195+
case HTMLTag::TAG_TR:
196+
return "tr";
197+
case HTMLTag::TAG_TD:
198+
return "td";
199+
case HTMLTag::TAG_TH:
200+
return "th";
177201
}
178202
llvm_unreachable("Unhandled HTMLTag::TagType");
179203
}
@@ -377,10 +401,27 @@ genEnumMembersBlock(const llvm::SmallVector<EnumValueInfo, 4> &Members) {
377401
if (Members.empty())
378402
return nullptr;
379403

380-
auto List = std::make_unique<TagNode>(HTMLTag::TAG_UL);
381-
for (const auto &M : Members)
382-
List->Children.emplace_back(
383-
std::make_unique<TagNode>(HTMLTag::TAG_LI, M.Name));
404+
auto List = std::make_unique<TagNode>(HTMLTag::TAG_TBODY);
405+
406+
for (const auto &M : Members) {
407+
auto TRNode = std::make_unique<TagNode>(HTMLTag::TAG_TR);
408+
TRNode->Children.emplace_back(
409+
std::make_unique<TagNode>(HTMLTag::TAG_TD, M.Name));
410+
// Use user supplied value if it exists, otherwise use the value
411+
if (!M.ValueExpr.empty()) {
412+
TRNode->Children.emplace_back(
413+
std::make_unique<TagNode>(HTMLTag::TAG_TD, M.ValueExpr));
414+
} else {
415+
TRNode->Children.emplace_back(
416+
std::make_unique<TagNode>(HTMLTag::TAG_TD, M.Value));
417+
}
418+
if (!M.Description.empty()) {
419+
auto TD = std::make_unique<TagNode>(HTMLTag::TAG_TD);
420+
TD->Children.emplace_back(genHTML(M.Description));
421+
TRNode->Children.emplace_back(std::move(TD));
422+
}
423+
List->Children.emplace_back(std::move(TRNode));
424+
}
384425
return List;
385426
}
386427

@@ -624,7 +665,7 @@ static std::unique_ptr<HTMLNode> genHTML(const CommentInfo &I) {
624665
}
625666
return std::move(FullComment);
626667
}
627-
668+
628669
if (I.Kind == "ParagraphComment") {
629670
auto ParagraphComment = std::make_unique<TagNode>(HTMLTag::TAG_P);
630671
for (const auto &Child : I.Children) {
@@ -637,6 +678,19 @@ static std::unique_ptr<HTMLNode> genHTML(const CommentInfo &I) {
637678
return std::move(ParagraphComment);
638679
}
639680

681+
if (I.Kind == "BlockCommandComment") {
682+
auto BlockComment = std::make_unique<TagNode>(HTMLTag::TAG_DIV);
683+
BlockComment->Children.emplace_back(
684+
std::make_unique<TagNode>(HTMLTag::TAG_DIV, I.Name));
685+
for (const auto &Child : I.Children) {
686+
std::unique_ptr<HTMLNode> Node = genHTML(*Child);
687+
if (Node)
688+
BlockComment->Children.emplace_back(std::move(Node));
689+
}
690+
if (BlockComment->Children.empty())
691+
return nullptr;
692+
return std::move(BlockComment);
693+
}
640694
if (I.Kind == "TextComment") {
641695
if (I.Text == "")
642696
return nullptr;
@@ -658,22 +712,36 @@ static std::vector<std::unique_ptr<TagNode>>
658712
genHTML(const EnumInfo &I, const ClangDocContext &CDCtx) {
659713
std::vector<std::unique_ptr<TagNode>> Out;
660714
std::string EnumType = I.Scoped ? "enum class " : "enum ";
661-
662-
Out.emplace_back(
663-
std::make_unique<TagNode>(HTMLTag::TAG_H3, EnumType + I.Name));
664-
Out.back()->Attributes.emplace_back("id",
665-
llvm::toHex(llvm::toStringRef(I.USR)));
666-
667-
std::unique_ptr<TagNode> Node = genEnumMembersBlock(I.Members);
668-
if (Node)
669-
Out.emplace_back(std::move(Node));
715+
// Determine if enum members have comments attached
716+
bool HasComments = std::any_of(
717+
I.Members.begin(), I.Members.end(),
718+
[](const EnumValueInfo &M) { return !M.Description.empty(); });
719+
std::unique_ptr<TagNode> Table =
720+
std::make_unique<TagNode>(HTMLTag::TAG_TABLE);
721+
std::unique_ptr<TagNode> THead =
722+
std::make_unique<TagNode>(HTMLTag::TAG_THEAD);
723+
std::unique_ptr<TagNode> TRow = std::make_unique<TagNode>(HTMLTag::TAG_TR);
724+
std::unique_ptr<TagNode> TD =
725+
std::make_unique<TagNode>(HTMLTag::TAG_TH, EnumType + I.Name);
726+
// Span 3 columns if enum has comments
727+
TD->Attributes.emplace_back("colspan", HasComments ? "3" : "2");
728+
729+
Table->Attributes.emplace_back("id", llvm::toHex(llvm::toStringRef(I.USR)));
730+
TRow->Children.emplace_back(std::move(TD));
731+
THead->Children.emplace_back(std::move(TRow));
732+
Table->Children.emplace_back(std::move(THead));
733+
734+
if (std::unique_ptr<TagNode> Node = genEnumMembersBlock(I.Members))
735+
Table->Children.emplace_back(std::move(Node));
736+
737+
Out.emplace_back(std::move(Table));
670738

671739
if (I.DefLoc) {
672740
if (!CDCtx.RepositoryUrl)
673741
Out.emplace_back(writeFileDefinition(*I.DefLoc));
674742
else
675-
Out.emplace_back(writeFileDefinition(
676-
*I.DefLoc, StringRef{*CDCtx.RepositoryUrl}));
743+
Out.emplace_back(
744+
writeFileDefinition(*I.DefLoc, StringRef{*CDCtx.RepositoryUrl}));
677745
}
678746

679747
std::string Description;

clang-tools-extra/clang-doc/Representation.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ void SymbolInfo::merge(SymbolInfo &&Other) {
221221
}
222222

223223
NamespaceInfo::NamespaceInfo(SymbolID USR, StringRef Name, StringRef Path)
224-
: Info(InfoType::IT_namespace, USR, Name, Path) {}
224+
: Info(InfoType::IT_namespace, USR, Name, Path) {}
225225

226226
void NamespaceInfo::merge(NamespaceInfo &&Other) {
227227
assert(mergeable(Other));

clang-tools-extra/clang-doc/Representation.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,8 @@ struct EnumValueInfo {
455455
// Stores the user-supplied initialization expression for this enumeration
456456
// constant. This will be empty for implicit enumeration values.
457457
SmallString<16> ValueExpr;
458+
459+
std::vector<CommentInfo> Description; /// Comment description of this field.
458460
};
459461

460462
// TODO: Expand to allow for documenting templating.

clang-tools-extra/clang-doc/Serialize.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -394,10 +394,20 @@ static void parseEnumerators(EnumInfo &I, const EnumDecl *D) {
394394
std::string ValueExpr;
395395
if (const Expr *InitExpr = E->getInitExpr())
396396
ValueExpr = getSourceCode(D, InitExpr->getSourceRange());
397-
398397
SmallString<16> ValueStr;
399398
E->getInitVal().toString(ValueStr);
400-
I.Members.emplace_back(E->getNameAsString(), ValueStr, ValueExpr);
399+
I.Members.emplace_back(E->getNameAsString(), ValueStr.str(), ValueExpr);
400+
ASTContext &Context = E->getASTContext();
401+
if (RawComment *Comment =
402+
E->getASTContext().getRawCommentForDeclNoCache(E)) {
403+
CommentInfo CInfo;
404+
Comment->setAttached();
405+
if (comments::FullComment *Fc = Comment->parse(Context, nullptr, E)) {
406+
EnumValueInfo &Member = I.Members.back();
407+
Member.Description.emplace_back();
408+
parseFullComment(Fc, Member.Description.back());
409+
}
410+
}
401411
}
402412
}
403413

@@ -566,7 +576,7 @@ static void populateMemberTypeInfo(MemberTypeInfo &I, const FieldDecl *D) {
566576
return;
567577

568578
Comment->setAttached();
569-
if (comments::FullComment* fc = Comment->parse(Context, nullptr, D)) {
579+
if (comments::FullComment *fc = Comment->parse(Context, nullptr, D)) {
570580
I.Description.emplace_back();
571581
parseFullComment(fc, I.Description.back());
572582
}

clang-tools-extra/clang-tidy/modernize/UseStdFormatCheck.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ void UseStdFormatCheck::registerMatchers(MatchFinder *Finder) {
5050
Finder->addMatcher(
5151
callExpr(argumentCountAtLeast(1),
5252
hasArgument(0, stringLiteral(isOrdinary())),
53-
callee(functionDecl(unless(cxxMethodDecl()),
54-
matchers::matchesAnyListedName(
53+
callee(functionDecl(matchers::matchesAnyListedName(
5554
StrFormatLikeFunctions))
5655
.bind("func_decl")))
5756
.bind("strformat"),
@@ -93,7 +92,8 @@ void UseStdFormatCheck::check(const MatchFinder::MatchResult &Result) {
9392
diag(StrFormatCall->getBeginLoc(), "use '%0' instead of %1")
9493
<< ReplacementFormatFunction << OldFunction->getIdentifier();
9594
Diag << FixItHint::CreateReplacement(
96-
CharSourceRange::getTokenRange(StrFormatCall->getSourceRange()),
95+
CharSourceRange::getTokenRange(StrFormatCall->getExprLoc(),
96+
StrFormatCall->getEndLoc()),
9797
ReplacementFormatFunction);
9898
Converter.applyFixes(Diag, *Result.SourceManager);
9999

clang-tools-extra/clang-tidy/modernize/UseStdPrintCheck.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,7 @@ void UseStdPrintCheck::registerMatchers(MatchFinder *Finder) {
100100
unusedReturnValue(
101101
callExpr(argumentCountAtLeast(1),
102102
hasArgument(0, stringLiteral(isOrdinary())),
103-
callee(functionDecl(unless(cxxMethodDecl()),
104-
matchers::matchesAnyListedName(
103+
callee(functionDecl(matchers::matchesAnyListedName(
105104
PrintfLikeFunctions))
106105
.bind("func_decl")))
107106
.bind("printf")),
@@ -112,8 +111,7 @@ void UseStdPrintCheck::registerMatchers(MatchFinder *Finder) {
112111
unusedReturnValue(
113112
callExpr(argumentCountAtLeast(2),
114113
hasArgument(1, stringLiteral(isOrdinary())),
115-
callee(functionDecl(unless(cxxMethodDecl()),
116-
matchers::matchesAnyListedName(
114+
callee(functionDecl(matchers::matchesAnyListedName(
117115
FprintfLikeFunctions))
118116
.bind("func_decl")))
119117
.bind("fprintf")),
@@ -152,7 +150,7 @@ void UseStdPrintCheck::check(const MatchFinder::MatchResult &Result) {
152150
<< ReplacementFunction << OldFunction->getIdentifier();
153151

154152
Diag << FixItHint::CreateReplacement(
155-
CharSourceRange::getTokenRange(PrintfCall->getBeginLoc(),
153+
CharSourceRange::getTokenRange(PrintfCall->getExprLoc(),
156154
PrintfCall->getEndLoc()),
157155
ReplacementFunction);
158156
Converter.applyFixes(Diag, *Result.SourceManager);

clang-tools-extra/clangd/ParsedAST.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -512,8 +512,8 @@ ParsedAST::build(llvm::StringRef Filename, const ParseInputs &Inputs,
512512
auto Action = std::make_unique<ClangdFrontendAction>();
513513
const FrontendInputFile &MainInput = Clang->getFrontendOpts().Inputs[0];
514514
if (!Action->BeginSourceFile(*Clang, MainInput)) {
515-
log("BeginSourceFile() failed when building AST for {0}",
516-
MainInput.getFile());
515+
elog("BeginSourceFile() failed when building AST for {0}",
516+
MainInput.getFile());
517517
return std::nullopt;
518518
}
519519
// If we saw an include guard in the preamble section of the main file,

0 commit comments

Comments
 (0)