Skip to content

Commit aeac2e4

Browse files
committed
[llvm] Replace llvm::Any with std::any
llvm::Any had several bugs in the past, due to being sensitive to symbol visibility. (See D101972 and D108943) Even with these fixes applied, I still encounter the same issue on Windows. Similar to llvm::Optional going away in favor of std::optional, we can use std::any from C++17. Using std::any fixes the problem and puts the burden to do it correctly on the standard library. Differential Revision: https://reviews.llvm.org/D139532
1 parent 3528e63 commit aeac2e4

File tree

13 files changed

+251
-252
lines changed

13 files changed

+251
-252
lines changed

llvm/include/llvm/IR/PassInstrumentation.h

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
/// executed and IRUnit it works on. There can be different schemes of
3636
/// providing names in future, currently it is just a name() of the pass.
3737
///
38-
/// - PassInstrumentation wraps address of IRUnit into llvm::Any and passes
38+
/// - PassInstrumentation wraps address of IRUnit into std::any and passes
3939
/// control to all the registered callbacks. Note that we specifically wrap
4040
/// 'const IRUnitT*' so as to avoid any accidental changes to IR in
4141
/// instrumenting callbacks.
@@ -49,10 +49,10 @@
4949
#ifndef LLVM_IR_PASSINSTRUMENTATION_H
5050
#define LLVM_IR_PASSINSTRUMENTATION_H
5151

52-
#include "llvm/ADT/Any.h"
5352
#include "llvm/ADT/FunctionExtras.h"
5453
#include "llvm/ADT/SmallVector.h"
5554
#include "llvm/ADT/StringMap.h"
55+
#include <any>
5656
#include <type_traits>
5757
#include <vector>
5858

@@ -66,7 +66,7 @@ class StringRef;
6666
class PassInstrumentationCallbacks {
6767
public:
6868
// Before/After callbacks accept IRUnits whenever appropriate, so they need
69-
// to take them as constant pointers, wrapped with llvm::Any.
69+
// to take them as constant pointers, wrapped with std::any.
7070
// For the case when IRUnit has been invalidated there is a different
7171
// callback to use - AfterPassInvalidated.
7272
// We call all BeforePassFuncs to determine if a pass should run or not.
@@ -75,14 +75,14 @@ class PassInstrumentationCallbacks {
7575
// already invalidated IRUnit is unsafe. There are ways to handle invalidated
7676
// IRUnits in a safe way, and we might pursue that as soon as there is a
7777
// useful instrumentation that needs it.
78-
using BeforePassFunc = bool(StringRef, Any);
79-
using BeforeSkippedPassFunc = void(StringRef, Any);
80-
using BeforeNonSkippedPassFunc = void(StringRef, Any);
81-
using AfterPassFunc = void(StringRef, Any, const PreservedAnalyses &);
78+
using BeforePassFunc = bool(StringRef, std::any);
79+
using BeforeSkippedPassFunc = void(StringRef, std::any);
80+
using BeforeNonSkippedPassFunc = void(StringRef, std::any);
81+
using AfterPassFunc = void(StringRef, std::any, const PreservedAnalyses &);
8282
using AfterPassInvalidatedFunc = void(StringRef, const PreservedAnalyses &);
83-
using BeforeAnalysisFunc = void(StringRef, Any);
84-
using AfterAnalysisFunc = void(StringRef, Any);
85-
using AnalysisInvalidatedFunc = void(StringRef, Any);
83+
using BeforeAnalysisFunc = void(StringRef, std::any);
84+
using AfterAnalysisFunc = void(StringRef, std::any);
85+
using AnalysisInvalidatedFunc = void(StringRef, std::any);
8686
using AnalysesClearedFunc = void(StringRef);
8787

8888
public:
@@ -233,15 +233,15 @@ class PassInstrumentation {
233233
bool ShouldRun = true;
234234
if (!isRequired(Pass)) {
235235
for (auto &C : Callbacks->ShouldRunOptionalPassCallbacks)
236-
ShouldRun &= C(Pass.name(), llvm::Any(&IR));
236+
ShouldRun &= C(Pass.name(), std::any(&IR));
237237
}
238238

239239
if (ShouldRun) {
240240
for (auto &C : Callbacks->BeforeNonSkippedPassCallbacks)
241-
C(Pass.name(), llvm::Any(&IR));
241+
C(Pass.name(), std::any(&IR));
242242
} else {
243243
for (auto &C : Callbacks->BeforeSkippedPassCallbacks)
244-
C(Pass.name(), llvm::Any(&IR));
244+
C(Pass.name(), std::any(&IR));
245245
}
246246

247247
return ShouldRun;
@@ -255,7 +255,7 @@ class PassInstrumentation {
255255
const PreservedAnalyses &PA) const {
256256
if (Callbacks)
257257
for (auto &C : Callbacks->AfterPassCallbacks)
258-
C(Pass.name(), llvm::Any(&IR), PA);
258+
C(Pass.name(), std::any(&IR), PA);
259259
}
260260

261261
/// AfterPassInvalidated instrumentation point - takes \p Pass instance
@@ -275,7 +275,7 @@ class PassInstrumentation {
275275
void runBeforeAnalysis(const PassT &Analysis, const IRUnitT &IR) const {
276276
if (Callbacks)
277277
for (auto &C : Callbacks->BeforeAnalysisCallbacks)
278-
C(Analysis.name(), llvm::Any(&IR));
278+
C(Analysis.name(), std::any(&IR));
279279
}
280280

281281
/// AfterAnalysis instrumentation point - takes \p Analysis instance
@@ -284,7 +284,7 @@ class PassInstrumentation {
284284
void runAfterAnalysis(const PassT &Analysis, const IRUnitT &IR) const {
285285
if (Callbacks)
286286
for (auto &C : Callbacks->AfterAnalysisCallbacks)
287-
C(Analysis.name(), llvm::Any(&IR));
287+
C(Analysis.name(), std::any(&IR));
288288
}
289289

290290
/// AnalysisInvalidated instrumentation point - takes \p Analysis instance
@@ -294,7 +294,7 @@ class PassInstrumentation {
294294
void runAnalysisInvalidated(const PassT &Analysis, const IRUnitT &IR) const {
295295
if (Callbacks)
296296
for (auto &C : Callbacks->AnalysisInvalidatedCallbacks)
297-
C(Analysis.name(), llvm::Any(&IR));
297+
C(Analysis.name(), std::any(&IR));
298298
}
299299

300300
/// AnalysesCleared instrumentation point - takes name of IR that analyses

llvm/include/llvm/Passes/StandardInstrumentations.h

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,16 @@ class PrintIRInstrumentation {
4646
void registerCallbacks(PassInstrumentationCallbacks &PIC);
4747

4848
private:
49-
void printBeforePass(StringRef PassID, Any IR);
50-
void printAfterPass(StringRef PassID, Any IR);
49+
void printBeforePass(StringRef PassID, std::any IR);
50+
void printAfterPass(StringRef PassID, std::any IR);
5151
void printAfterPassInvalidated(StringRef PassID);
5252

5353
bool shouldPrintBeforePass(StringRef PassID);
5454
bool shouldPrintAfterPass(StringRef PassID);
5555

5656
using PrintModuleDesc = std::tuple<const Module *, std::string, StringRef>;
5757

58-
void pushModuleDesc(StringRef PassID, Any IR);
58+
void pushModuleDesc(StringRef PassID, std::any IR);
5959
PrintModuleDesc popModuleDesc(StringRef PassID);
6060

6161
PassInstrumentationCallbacks *PIC;
@@ -71,15 +71,15 @@ class OptNoneInstrumentation {
7171

7272
private:
7373
bool DebugLogging;
74-
bool shouldRun(StringRef PassID, Any IR);
74+
bool shouldRun(StringRef PassID, std::any IR);
7575
};
7676

7777
class OptPassGateInstrumentation {
7878
LLVMContext &Context;
7979
bool HasWrittenIR = false;
8080
public:
8181
OptPassGateInstrumentation(LLVMContext &Context) : Context(Context) {}
82-
bool shouldRun(StringRef PassName, Any IR);
82+
bool shouldRun(StringRef PassName, std::any IR);
8383
void registerCallbacks(PassInstrumentationCallbacks &PIC);
8484
};
8585

@@ -181,9 +181,9 @@ template <typename IRUnitT> class ChangeReporter {
181181

182182
// Determine if this pass/IR is interesting and if so, save the IR
183183
// otherwise it is left on the stack without data.
184-
void saveIRBeforePass(Any IR, StringRef PassID, StringRef PassName);
184+
void saveIRBeforePass(std::any IR, StringRef PassID, StringRef PassName);
185185
// Compare the IR from before the pass after the pass.
186-
void handleIRAfterPass(Any IR, StringRef PassID, StringRef PassName);
186+
void handleIRAfterPass(std::any IR, StringRef PassID, StringRef PassName);
187187
// Handle the situation where a pass is invalidated.
188188
void handleInvalidatedPass(StringRef PassID);
189189

@@ -192,16 +192,16 @@ template <typename IRUnitT> class ChangeReporter {
192192
void registerRequiredCallbacks(PassInstrumentationCallbacks &PIC);
193193

194194
// Called on the first IR processed.
195-
virtual void handleInitialIR(Any IR) = 0;
195+
virtual void handleInitialIR(std::any IR) = 0;
196196
// Called before and after a pass to get the representation of the IR.
197-
virtual void generateIRRepresentation(Any IR, StringRef PassID,
197+
virtual void generateIRRepresentation(std::any IR, StringRef PassID,
198198
IRUnitT &Output) = 0;
199199
// Called when the pass is not iteresting.
200200
virtual void omitAfter(StringRef PassID, std::string &Name) = 0;
201201
// Called when an interesting IR has changed.
202202
virtual void handleAfter(StringRef PassID, std::string &Name,
203203
const IRUnitT &Before, const IRUnitT &After,
204-
Any) = 0;
204+
std::any) = 0;
205205
// Called when an interesting pass is invalidated.
206206
virtual void handleInvalidated(StringRef PassID) = 0;
207207
// Called when the IR or pass is not interesting.
@@ -226,7 +226,7 @@ class TextChangeReporter : public ChangeReporter<IRUnitT> {
226226
TextChangeReporter(bool Verbose);
227227

228228
// Print a module dump of the first IR that is changed.
229-
void handleInitialIR(Any IR) override;
229+
void handleInitialIR(std::any IR) override;
230230
// Report that the IR was omitted because it did not change.
231231
void omitAfter(StringRef PassID, std::string &Name) override;
232232
// Report that the pass was invalidated.
@@ -254,12 +254,12 @@ class IRChangedPrinter : public TextChangeReporter<std::string> {
254254

255255
protected:
256256
// Called before and after a pass to get the representation of the IR.
257-
void generateIRRepresentation(Any IR, StringRef PassID,
257+
void generateIRRepresentation(std::any IR, StringRef PassID,
258258
std::string &Output) override;
259259
// Called when an interesting IR has changed.
260260
void handleAfter(StringRef PassID, std::string &Name,
261261
const std::string &Before, const std::string &After,
262-
Any) override;
262+
std::any) override;
263263
};
264264

265265
class IRChangedTester : public IRChangedPrinter {
@@ -272,7 +272,7 @@ class IRChangedTester : public IRChangedPrinter {
272272
void handleIR(const std::string &IR, StringRef PassID);
273273

274274
// Check initial IR
275-
void handleInitialIR(Any IR) override;
275+
void handleInitialIR(std::any IR) override;
276276
// Do nothing.
277277
void omitAfter(StringRef PassID, std::string &Name) override;
278278
// Do nothing.
@@ -285,7 +285,7 @@ class IRChangedTester : public IRChangedPrinter {
285285
// Call test as interesting IR has changed.
286286
void handleAfter(StringRef PassID, std::string &Name,
287287
const std::string &Before, const std::string &After,
288-
Any) override;
288+
std::any) override;
289289
};
290290

291291
// Information that needs to be saved for a basic block in order to compare
@@ -385,7 +385,7 @@ template <typename T> class IRComparer {
385385
CompareFunc);
386386

387387
// Analyze \p IR and build the IR representation in \p Data.
388-
static void analyzeIR(Any IR, IRDataT<T> &Data);
388+
static void analyzeIR(std::any IR, IRDataT<T> &Data);
389389

390390
protected:
391391
// Generate the data for \p F into \p Data.
@@ -411,13 +411,13 @@ class InLineChangePrinter : public TextChangeReporter<IRDataT<EmptyData>> {
411411

412412
protected:
413413
// Create a representation of the IR.
414-
void generateIRRepresentation(Any IR, StringRef PassID,
414+
void generateIRRepresentation(std::any IR, StringRef PassID,
415415
IRDataT<EmptyData> &Output) override;
416416

417417
// Called when an interesting IR has changed.
418418
void handleAfter(StringRef PassID, std::string &Name,
419419
const IRDataT<EmptyData> &Before,
420-
const IRDataT<EmptyData> &After, Any) override;
420+
const IRDataT<EmptyData> &After, std::any) override;
421421

422422
void handleFunctionCompare(StringRef Name, StringRef Prefix, StringRef PassID,
423423
StringRef Divider, bool InModule, unsigned Minor,
@@ -449,7 +449,7 @@ class TimeProfilingPassesHandler {
449449

450450
private:
451451
// Implementation of pass instrumentation callbacks.
452-
void runBeforePass(StringRef PassID, Any IR);
452+
void runBeforePass(StringRef PassID, std::any IR);
453453
void runAfterPass();
454454
};
455455

@@ -497,16 +497,16 @@ class DotCfgChangeReporter : public ChangeReporter<IRDataT<DCData>> {
497497
bool initializeHTML();
498498

499499
// Called on the first IR processed.
500-
void handleInitialIR(Any IR) override;
500+
void handleInitialIR(std::any IR) override;
501501
// Called before and after a pass to get the representation of the IR.
502-
void generateIRRepresentation(Any IR, StringRef PassID,
502+
void generateIRRepresentation(std::any IR, StringRef PassID,
503503
IRDataT<DCData> &Output) override;
504504
// Called when the pass is not iteresting.
505505
void omitAfter(StringRef PassID, std::string &Name) override;
506506
// Called when an interesting IR has changed.
507507
void handleAfter(StringRef PassID, std::string &Name,
508508
const IRDataT<DCData> &Before, const IRDataT<DCData> &After,
509-
Any) override;
509+
std::any) override;
510510
// Called when an interesting pass is invalidated.
511511
void handleInvalidated(StringRef PassID) override;
512512
// Called when the IR or pass is not interesting.

llvm/include/llvm/Transforms/IPO/SampleProfileProbe.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class PseudoProbeVerifier {
6161
void registerCallbacks(PassInstrumentationCallbacks &PIC);
6262

6363
// Implementation of pass instrumentation callbacks for new pass manager.
64-
void runAfterPass(StringRef PassID, Any IR);
64+
void runAfterPass(StringRef PassID, std::any IR);
6565

6666
private:
6767
// Allow a little bias due the rounding to integral factors.

llvm/lib/CodeGen/MachinePassManager.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#include "llvm/CodeGen/MachineModuleInfo.h"
1616
#include "llvm/IR/PassManagerImpl.h"
1717

18+
#include <any>
19+
1820
using namespace llvm;
1921

2022
namespace llvm {
@@ -40,12 +42,12 @@ Error MachineFunctionPassManager::run(Module &M,
4042
// No need to pop this callback later since MIR pipeline is flat which means
4143
// current pipeline is the top-level pipeline. Callbacks are not used after
4244
// current pipeline.
43-
PI.pushBeforeNonSkippedPassCallback([&MFAM](StringRef PassID, Any IR) {
44-
assert(any_isa<const MachineFunction *>(IR));
45-
const MachineFunction *MF = any_cast<const MachineFunction *>(IR);
45+
PI.pushBeforeNonSkippedPassCallback([&MFAM](StringRef PassID, std::any IR) {
46+
assert(std::any_cast<const MachineFunction *>(&IR));
47+
const MachineFunction **MF = std::any_cast<const MachineFunction *>(&IR);
4648
assert(MF && "Machine function should be valid for printing");
4749
std::string Banner = std::string("After ") + std::string(PassID);
48-
verifyMachineFunction(&MFAM, Banner, *MF);
50+
verifyMachineFunction(&MFAM, Banner, **MF);
4951
});
5052
}
5153

llvm/lib/CodeGen/TargetPassConfig.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ static void registerPartialPipelineCallback(PassInstrumentationCallbacks &PIC,
551551
[=, EnableCurrent = StartBefore.empty() && StartAfter.empty(),
552552
EnableNext = std::optional<bool>(), StartBeforeCount = 0u,
553553
StartAfterCount = 0u, StopBeforeCount = 0u,
554-
StopAfterCount = 0u](StringRef P, Any) mutable {
554+
StopAfterCount = 0u](StringRef P, std::any) mutable {
555555
bool StartBeforePass = !StartBefore.empty() && P.contains(StartBefore);
556556
bool StartAfterPass = !StartAfter.empty() && P.contains(StartAfter);
557557
bool StopBeforePass = !StopBefore.empty() && P.contains(StopBefore);
@@ -586,7 +586,7 @@ void llvm::registerCodeGenCallback(PassInstrumentationCallbacks &PIC,
586586
LLVMTargetMachine &LLVMTM) {
587587

588588
// Register a callback for disabling passes.
589-
PIC.registerShouldRunOptionalPassCallback([](StringRef P, Any) {
589+
PIC.registerShouldRunOptionalPassCallback([](StringRef P, std::any) {
590590

591591
#define DISABLE_PASS(Option, Name) \
592592
if (Option && P.contains(#Name)) \

llvm/lib/IR/LLVMContextImpl.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#include "ConstantsContext.h"
1818
#include "llvm/ADT/APFloat.h"
1919
#include "llvm/ADT/APInt.h"
20-
#include "llvm/ADT/Any.h"
2120
#include "llvm/ADT/ArrayRef.h"
2221
#include "llvm/ADT/DenseMap.h"
2322
#include "llvm/ADT/DenseMapInfo.h"

llvm/lib/IR/PassTimingInfo.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "llvm/Support/Mutex.h"
2727
#include "llvm/Support/TypeName.h"
2828
#include "llvm/Support/raw_ostream.h"
29+
#include <any>
2930
#include <string>
3031

3132
using namespace llvm;
@@ -301,19 +302,19 @@ void TimePassesHandler::registerCallbacks(PassInstrumentationCallbacks &PIC) {
301302
return;
302303

303304
PIC.registerBeforeNonSkippedPassCallback(
304-
[this](StringRef P, Any) { this->startPassTimer(P); });
305+
[this](StringRef P, std::any) { this->startPassTimer(P); });
305306
PIC.registerAfterPassCallback(
306-
[this](StringRef P, Any, const PreservedAnalyses &) {
307+
[this](StringRef P, std::any, const PreservedAnalyses &) {
307308
this->stopPassTimer(P);
308309
});
309310
PIC.registerAfterPassInvalidatedCallback(
310311
[this](StringRef P, const PreservedAnalyses &) {
311312
this->stopPassTimer(P);
312313
});
313314
PIC.registerBeforeAnalysisCallback(
314-
[this](StringRef P, Any) { this->startAnalysisTimer(P); });
315+
[this](StringRef P, std::any) { this->startAnalysisTimer(P); });
315316
PIC.registerAfterAnalysisCallback(
316-
[this](StringRef P, Any) { this->stopAnalysisTimer(P); });
317+
[this](StringRef P, std::any) { this->stopAnalysisTimer(P); });
317318
}
318319

319320
} // namespace llvm

0 commit comments

Comments
 (0)