[SampleProfileInference] Work around odr-use of const non-inline static data member...
authorFangrui Song <i@maskray.me>
Tue, 8 Mar 2022 22:34:53 +0000 (14:34 -0800)
committerFangrui Song <i@maskray.me>
Tue, 8 Mar 2022 22:34:53 +0000 (14:34 -0800)
MinBaseDistance may be odr-used by std::max, leading to an undefined symbol linker error:

```
ld.lld: error: undefined symbol: (anonymous namespace)::MinCostMaxFlow::MinBaseDistance
>>> referenced by SampleProfileInference.cpp:744 (/home/ray/llvm-project/llvm/lib/Transforms/Utils/SampleProfileInference.cpp:744)
>>>               lib/Transforms/Utils/CMakeFiles/LLVMTransformUtils.dir/SampleProfileInference.cpp.o:((anonymous namespace)::FlowAdjuster::jumpDistance(llvm::FlowJump*) const)
```

Since llvm-project is still using C++ 14, workaround it with a cast.

llvm/lib/Transforms/Utils/SampleProfileInference.cpp

index 298c36b..6f56f1c 100644 (file)
@@ -741,7 +741,7 @@ private:
   /// parts to a multiple of 1 / BaseDistance.
   int64_t jumpDistance(FlowJump *Jump) const {
     uint64_t BaseDistance =
-        std::max(MinCostMaxFlow::MinBaseDistance,
+        std::max(static_cast<uint64_t>(MinCostMaxFlow::MinBaseDistance),
                  std::min(Func.Blocks[Func.Entry].Flow,
                           MinCostMaxFlow::AuxCostUnlikely / NumBlocks()));
     if (Jump->IsUnlikely)