Skip to content

Commit 9d1ba9e

Browse files
committed
Merge commit '55029f017d80a9f10882cdcdd19db92274ea93fa' into feature/merge-upstream-20220113
2 parents 1391300 + 55029f0 commit 9d1ba9e

File tree

629 files changed

+24851
-14723
lines changed

Some content is hidden

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

629 files changed

+24851
-14723
lines changed

bolt/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ encounter any issues.
3737

3838
### Docker Image
3939

40-
You can build and use the docker image containing BOLT using our [docker file](./bolt/utils/docker/Dockerfile).
40+
You can build and use the docker image containing BOLT using our [docker file](utils/docker/Dockerfile).
4141
Alternatively, you can build BOLT manually using the steps below.
4242

4343
### Manual Build
@@ -77,7 +77,7 @@ Or if you rather use tcmalloc:
7777

7878
## Usage
7979

80-
For a complete practical guide of using BOLT see [Optimizing Clang with BOLT](./bolt/docs/OptimizingClang.md).
80+
For a complete practical guide of using BOLT see [Optimizing Clang with BOLT](docs/OptimizingClang.md).
8181

8282
### Step 0
8383

bolt/utils/docker/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ RUN apt-get update && \
1111

1212
WORKDIR /home/bolt
1313

14-
RUN git clone --depth 1 https://github.com/facebookincubator/BOLT llvm-project
14+
RUN git clone --depth 1 https://github.com/llvm/llvm-project
1515

1616
RUN mkdir build && \
1717
cd build && \

clang-tools-extra/clang-tidy/bugprone/StringConstructorCheck.cpp

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ removeNamespaces(const std::vector<std::string> &Names) {
4343
StringConstructorCheck::StringConstructorCheck(StringRef Name,
4444
ClangTidyContext *Context)
4545
: ClangTidyCheck(Name, Context),
46+
IsStringviewNullptrCheckEnabled(
47+
Context->isCheckEnabled("bugprone-stringview-nullptr")),
4648
WarnOnLargeLength(Options.get("WarnOnLargeLength", true)),
4749
LargeLengthThreshold(Options.get("LargeLengthThreshold", 0x800000)),
4850
StringNames(utils::options::parseStringList(
@@ -121,17 +123,20 @@ void StringConstructorCheck::registerMatchers(MatchFinder *Finder) {
121123
// Check the literal string constructor with char pointer.
122124
// [i.e. string (const char* s);]
123125
Finder->addMatcher(
124-
traverse(TK_AsIs,
125-
cxxConstructExpr(
126-
hasDeclaration(cxxConstructorDecl(ofClass(cxxRecordDecl(
127-
hasAnyName(removeNamespaces(StringNames)))))),
128-
hasArgument(0, expr().bind("from-ptr")),
129-
// do not match std::string(ptr, int)
130-
// match std::string(ptr, alloc)
131-
// match std::string(ptr)
132-
anyOf(hasArgument(1, unless(hasType(isInteger()))),
133-
argumentCountIs(1)))
134-
.bind("constructor")),
126+
traverse(
127+
TK_AsIs,
128+
cxxConstructExpr(
129+
hasDeclaration(cxxConstructorDecl(ofClass(anyOf(
130+
cxxRecordDecl(hasName("basic_string_view"))
131+
.bind("basic_string_view_decl"),
132+
cxxRecordDecl(hasAnyName(removeNamespaces(StringNames))))))),
133+
hasArgument(0, expr().bind("from-ptr")),
134+
// do not match std::string(ptr, int)
135+
// match std::string(ptr, alloc)
136+
// match std::string(ptr)
137+
anyOf(hasArgument(1, unless(hasType(isInteger()))),
138+
argumentCountIs(1)))
139+
.bind("constructor")),
135140
this);
136141
}
137142

@@ -167,6 +172,12 @@ void StringConstructorCheck::check(const MatchFinder::MatchResult &Result) {
167172
Ptr->EvaluateAsRValue(ConstPtr, Ctx) &&
168173
((ConstPtr.Val.isInt() && ConstPtr.Val.getInt().isZero()) ||
169174
(ConstPtr.Val.isLValue() && ConstPtr.Val.isNullPointer()))) {
175+
if (IsStringviewNullptrCheckEnabled &&
176+
Result.Nodes.getNodeAs<CXXRecordDecl>("basic_string_view_decl")) {
177+
// Filter out `basic_string_view` to avoid conflicts with
178+
// `bugprone-stringview-nullptr`
179+
return;
180+
}
170181
diag(Loc, "constructing string from nullptr is undefined behaviour");
171182
}
172183
}

clang-tools-extra/clang-tidy/bugprone/StringConstructorCheck.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class StringConstructorCheck : public ClangTidyCheck {
3030
void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
3131

3232
private:
33+
const bool IsStringviewNullptrCheckEnabled;
3334
const bool WarnOnLargeLength;
3435
const unsigned int LargeLengthThreshold;
3536
std::vector<std::string> StringNames;

clang-tools-extra/clang-tidy/bugprone/StringviewNullptrCheck.cpp

Lines changed: 205 additions & 90 deletions
Large diffs are not rendered by default.

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

Lines changed: 103 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,12 @@ namespace {
2020

2121
// Determine if the given QualType is a nullary function or pointer to same.
2222
bool protoTypeHasNoParms(QualType QT) {
23-
if (const auto *PT = QT->getAs<PointerType>()) {
23+
if (const auto *PT = QT->getAs<PointerType>())
2424
QT = PT->getPointeeType();
25-
}
26-
if (auto *MPT = QT->getAs<MemberPointerType>()) {
25+
if (auto *MPT = QT->getAs<MemberPointerType>())
2726
QT = MPT->getPointeeType();
28-
}
29-
if (const auto *FP = QT->getAs<FunctionProtoType>()) {
27+
if (const auto *FP = QT->getAs<FunctionProtoType>())
3028
return FP->getNumParams() == 0;
31-
}
3229
return false;
3330
}
3431

@@ -48,7 +45,8 @@ void RedundantVoidArgCheck::registerMatchers(MatchFinder *Finder) {
4845
unless(isInstantiated()), unless(isExternC()))
4946
.bind(FunctionId),
5047
this);
51-
Finder->addMatcher(typedefNameDecl().bind(TypedefId), this);
48+
Finder->addMatcher(typedefNameDecl(unless(isImplicit())).bind(TypedefId),
49+
this);
5250
auto ParenFunctionType = parenType(innerType(functionType()));
5351
auto PointerToFunctionType = pointee(ParenFunctionType);
5452
auto FunctionOrMemberPointer =
@@ -72,34 +70,36 @@ void RedundantVoidArgCheck::registerMatchers(MatchFinder *Finder) {
7270

7371
void RedundantVoidArgCheck::check(const MatchFinder::MatchResult &Result) {
7472
const BoundNodes &Nodes = Result.Nodes;
75-
if (const auto *Function = Nodes.getNodeAs<FunctionDecl>(FunctionId)) {
73+
if (const auto *Function = Nodes.getNodeAs<FunctionDecl>(FunctionId))
7674
processFunctionDecl(Result, Function);
77-
} else if (const auto *TypedefName =
78-
Nodes.getNodeAs<TypedefNameDecl>(TypedefId)) {
75+
else if (const auto *TypedefName =
76+
Nodes.getNodeAs<TypedefNameDecl>(TypedefId))
7977
processTypedefNameDecl(Result, TypedefName);
80-
} else if (const auto *Member = Nodes.getNodeAs<FieldDecl>(FieldId)) {
78+
else if (const auto *Member = Nodes.getNodeAs<FieldDecl>(FieldId))
8179
processFieldDecl(Result, Member);
82-
} else if (const auto *Var = Nodes.getNodeAs<VarDecl>(VarId)) {
80+
else if (const auto *Var = Nodes.getNodeAs<VarDecl>(VarId))
8381
processVarDecl(Result, Var);
84-
} else if (const auto *NamedCast =
85-
Nodes.getNodeAs<CXXNamedCastExpr>(NamedCastId)) {
82+
else if (const auto *NamedCast =
83+
Nodes.getNodeAs<CXXNamedCastExpr>(NamedCastId))
8684
processNamedCastExpr(Result, NamedCast);
87-
} else if (const auto *CStyleCast =
88-
Nodes.getNodeAs<CStyleCastExpr>(CStyleCastId)) {
85+
else if (const auto *CStyleCast =
86+
Nodes.getNodeAs<CStyleCastExpr>(CStyleCastId))
8987
processExplicitCastExpr(Result, CStyleCast);
90-
} else if (const auto *ExplicitCast =
91-
Nodes.getNodeAs<ExplicitCastExpr>(ExplicitCastId)) {
88+
else if (const auto *ExplicitCast =
89+
Nodes.getNodeAs<ExplicitCastExpr>(ExplicitCastId))
9290
processExplicitCastExpr(Result, ExplicitCast);
93-
} else if (const auto *Lambda = Nodes.getNodeAs<LambdaExpr>(LambdaId)) {
91+
else if (const auto *Lambda = Nodes.getNodeAs<LambdaExpr>(LambdaId))
9492
processLambdaExpr(Result, Lambda);
95-
}
9693
}
9794

9895
void RedundantVoidArgCheck::processFunctionDecl(
9996
const MatchFinder::MatchResult &Result, const FunctionDecl *Function) {
97+
const auto *Method = dyn_cast<CXXMethodDecl>(Function);
98+
SourceLocation Start = Method && Method->getParent()->isLambda()
99+
? Method->getBeginLoc()
100+
: Function->getLocation();
101+
SourceLocation End = Function->getEndLoc();
100102
if (Function->isThisDeclarationADefinition()) {
101-
SourceLocation Start = Function->getBeginLoc();
102-
SourceLocation End = Function->getEndLoc();
103103
if (const Stmt *Body = Function->getBody()) {
104104
End = Body->getBeginLoc();
105105
if (End.isMacroID() &&
@@ -109,10 +109,20 @@ void RedundantVoidArgCheck::processFunctionDecl(
109109
}
110110
removeVoidArgumentTokens(Result, SourceRange(Start, End),
111111
"function definition");
112-
} else {
113-
removeVoidArgumentTokens(Result, Function->getSourceRange(),
112+
} else
113+
removeVoidArgumentTokens(Result, SourceRange(Start, End),
114114
"function declaration");
115-
}
115+
}
116+
117+
bool isMacroIdentifier(const IdentifierTable &Idents, const Token &ProtoToken) {
118+
if (!ProtoToken.is(tok::TokenKind::raw_identifier))
119+
return false;
120+
121+
IdentifierTable::iterator It = Idents.find(ProtoToken.getRawIdentifier());
122+
if (It == Idents.end())
123+
return false;
124+
125+
return It->second->hadMacroDefinition();
116126
}
117127

118128
void RedundantVoidArgCheck::removeVoidArgumentTokens(
@@ -127,49 +137,86 @@ void RedundantVoidArgCheck::removeVoidArgumentTokens(
127137
.str();
128138
Lexer PrototypeLexer(CharRange.getBegin(), getLangOpts(), DeclText.data(),
129139
DeclText.data(), DeclText.data() + DeclText.size());
130-
enum TokenState {
131-
NothingYet,
132-
SawLeftParen,
133-
SawVoid,
140+
enum class TokenState {
141+
Start,
142+
MacroId,
143+
MacroLeftParen,
144+
MacroArguments,
145+
LeftParen,
146+
Void,
134147
};
135-
TokenState State = NothingYet;
148+
TokenState State = TokenState::Start;
136149
Token VoidToken;
137150
Token ProtoToken;
151+
const IdentifierTable &Idents = Result.Context->Idents;
152+
int MacroLevel = 0;
138153
std::string Diagnostic =
139154
("redundant void argument list in " + GrammarLocation).str();
140155

141156
while (!PrototypeLexer.LexFromRawLexer(ProtoToken)) {
142157
switch (State) {
143-
case NothingYet:
144-
if (ProtoToken.is(tok::TokenKind::l_paren)) {
145-
State = SawLeftParen;
146-
}
158+
case TokenState::Start:
159+
if (ProtoToken.is(tok::TokenKind::l_paren))
160+
State = TokenState::LeftParen;
161+
else if (isMacroIdentifier(Idents, ProtoToken))
162+
State = TokenState::MacroId;
163+
break;
164+
case TokenState::MacroId:
165+
if (ProtoToken.is(tok::TokenKind::l_paren))
166+
State = TokenState::MacroLeftParen;
167+
else
168+
State = TokenState::Start;
169+
break;
170+
case TokenState::MacroLeftParen:
171+
++MacroLevel;
172+
if (ProtoToken.is(tok::TokenKind::raw_identifier)) {
173+
if (isMacroIdentifier(Idents, ProtoToken))
174+
State = TokenState::MacroId;
175+
else
176+
State = TokenState::MacroArguments;
177+
} else if (ProtoToken.is(tok::TokenKind::r_paren)) {
178+
--MacroLevel;
179+
if (MacroLevel == 0)
180+
State = TokenState::Start;
181+
else
182+
State = TokenState::MacroId;
183+
} else
184+
State = TokenState::MacroArguments;
147185
break;
148-
case SawLeftParen:
149-
if (ProtoToken.is(tok::TokenKind::raw_identifier) &&
150-
ProtoToken.getRawIdentifier() == "void") {
151-
State = SawVoid;
152-
VoidToken = ProtoToken;
153-
} else if (ProtoToken.is(tok::TokenKind::l_paren)) {
154-
State = SawLeftParen;
155-
} else {
156-
State = NothingYet;
186+
case TokenState::MacroArguments:
187+
if (isMacroIdentifier(Idents, ProtoToken))
188+
State = TokenState::MacroLeftParen;
189+
else if (ProtoToken.is(tok::TokenKind::r_paren)) {
190+
--MacroLevel;
191+
if (MacroLevel == 0)
192+
State = TokenState::Start;
157193
}
158194
break;
159-
case SawVoid:
160-
State = NothingYet;
161-
if (ProtoToken.is(tok::TokenKind::r_paren)) {
195+
case TokenState::LeftParen:
196+
if (ProtoToken.is(tok::TokenKind::raw_identifier)) {
197+
if (isMacroIdentifier(Idents, ProtoToken))
198+
State = TokenState::MacroId;
199+
else if (ProtoToken.getRawIdentifier() == "void") {
200+
State = TokenState::Void;
201+
VoidToken = ProtoToken;
202+
}
203+
} else if (ProtoToken.is(tok::TokenKind::l_paren))
204+
State = TokenState::LeftParen;
205+
else
206+
State = TokenState::Start;
207+
break;
208+
case TokenState::Void:
209+
State = TokenState::Start;
210+
if (ProtoToken.is(tok::TokenKind::r_paren))
162211
removeVoidToken(VoidToken, Diagnostic);
163-
} else if (ProtoToken.is(tok::TokenKind::l_paren)) {
164-
State = SawLeftParen;
165-
}
212+
else if (ProtoToken.is(tok::TokenKind::l_paren))
213+
State = TokenState::LeftParen;
166214
break;
167215
}
168216
}
169217

170-
if (State == SawVoid && ProtoToken.is(tok::TokenKind::r_paren)) {
218+
if (State == TokenState::Void && ProtoToken.is(tok::TokenKind::r_paren))
171219
removeVoidToken(VoidToken, Diagnostic);
172-
}
173220
}
174221

175222
void RedundantVoidArgCheck::removeVoidToken(Token VoidToken,
@@ -181,19 +228,17 @@ void RedundantVoidArgCheck::removeVoidToken(Token VoidToken,
181228
void RedundantVoidArgCheck::processTypedefNameDecl(
182229
const MatchFinder::MatchResult &Result,
183230
const TypedefNameDecl *TypedefName) {
184-
if (protoTypeHasNoParms(TypedefName->getUnderlyingType())) {
231+
if (protoTypeHasNoParms(TypedefName->getUnderlyingType()))
185232
removeVoidArgumentTokens(Result, TypedefName->getSourceRange(),
186233
isa<TypedefDecl>(TypedefName) ? "typedef"
187234
: "type alias");
188-
}
189235
}
190236

191237
void RedundantVoidArgCheck::processFieldDecl(
192238
const MatchFinder::MatchResult &Result, const FieldDecl *Member) {
193-
if (protoTypeHasNoParms(Member->getType())) {
239+
if (protoTypeHasNoParms(Member->getType()))
194240
removeVoidArgumentTokens(Result, Member->getSourceRange(),
195241
"field declaration");
196-
}
197242
}
198243

199244
void RedundantVoidArgCheck::processVarDecl(
@@ -206,30 +251,27 @@ void RedundantVoidArgCheck::processVarDecl(
206251
.getLocWithOffset(-1);
207252
removeVoidArgumentTokens(Result, SourceRange(Begin, InitStart),
208253
"variable declaration with initializer");
209-
} else {
254+
} else
210255
removeVoidArgumentTokens(Result, Var->getSourceRange(),
211256
"variable declaration");
212-
}
213257
}
214258
}
215259

216260
void RedundantVoidArgCheck::processNamedCastExpr(
217261
const MatchFinder::MatchResult &Result, const CXXNamedCastExpr *NamedCast) {
218-
if (protoTypeHasNoParms(NamedCast->getTypeAsWritten())) {
262+
if (protoTypeHasNoParms(NamedCast->getTypeAsWritten()))
219263
removeVoidArgumentTokens(
220264
Result,
221265
NamedCast->getTypeInfoAsWritten()->getTypeLoc().getSourceRange(),
222266
"named cast");
223-
}
224267
}
225268

226269
void RedundantVoidArgCheck::processExplicitCastExpr(
227270
const MatchFinder::MatchResult &Result,
228271
const ExplicitCastExpr *ExplicitCast) {
229-
if (protoTypeHasNoParms(ExplicitCast->getTypeAsWritten())) {
272+
if (protoTypeHasNoParms(ExplicitCast->getTypeAsWritten()))
230273
removeVoidArgumentTokens(Result, ExplicitCast->getSourceRange(),
231274
"cast expression");
232-
}
233275
}
234276

235277
void RedundantVoidArgCheck::processLambdaExpr(

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ void UseDefaultMemberInitCheck::checkDefaultInit(
247247

248248
// Check whether we have multiple hand-written constructors and bomb out, as
249249
// it is hard to reconcile their sets of member initializers.
250-
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(Field->getParent());
250+
const auto *ClassDecl = cast<CXXRecordDecl>(Field->getParent());
251251
if (llvm::count_if(ClassDecl->ctors(), [](const CXXConstructorDecl *Ctor) {
252252
return !Ctor->isCopyOrMoveConstructor();
253253
}) > 1)

clang-tools-extra/clangd/ClangdLSPServer.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,7 @@ void ClangdLSPServer::onInitialize(const InitializeParams &Params,
576576
{"compilationDatabase", // clangd extension
577577
llvm::json::Object{{"automaticReload", true}}},
578578
{"callHierarchyProvider", true},
579+
{"clangdInlayHintsProvider", true},
579580
};
580581

581582
{
@@ -608,10 +609,6 @@ void ClangdLSPServer::onInitialize(const InitializeParams &Params,
608609
if (Opts.FoldingRanges)
609610
ServerCaps["foldingRangeProvider"] = true;
610611

611-
// FIXME: once inlayHints can be disabled in config, always advertise.
612-
if (Opts.InlayHints)
613-
ServerCaps["clangdInlayHintsProvider"] = true;
614-
615612
std::vector<llvm::StringRef> Commands;
616613
for (llvm::StringRef Command : Handlers.CommandHandlers.keys())
617614
Commands.push_back(Command);

0 commit comments

Comments
 (0)