diff options
| author | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 18:39:43 +0900 |
|---|---|---|
| committer | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 18:39:43 +0900 |
| commit | c36c84047e92587931e74aea1b3d91342617400b (patch) | |
| tree | 3d25b78796205b1f3f1ee5f9c55da298f6449ce8 /bolt/lib/Core/BinaryEmitter.cpp | |
| parent | 122393694892e7a718e8c612b5650388075e2833 (diff) | |
| parent | bdcf47e4bcb92889665825654bb80a8bbe30379e (diff) | |
Merge branch 'users/chapuni/cov/single/base' into users/chapuni/cov/single/condopusers/chapuni/cov/single/condop
Conflicts:
clang/lib/CodeGen/CoverageMappingGen.cpp
Diffstat (limited to 'bolt/lib/Core/BinaryEmitter.cpp')
| -rw-r--r-- | bolt/lib/Core/BinaryEmitter.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/bolt/lib/Core/BinaryEmitter.cpp b/bolt/lib/Core/BinaryEmitter.cpp index 5019cf31beee..1aad25242712 100644 --- a/bolt/lib/Core/BinaryEmitter.cpp +++ b/bolt/lib/Core/BinaryEmitter.cpp @@ -46,13 +46,13 @@ BreakFunctionNames("break-funcs", cl::Hidden, cl::cat(BoltCategory)); -cl::list<std::string> +static cl::list<std::string> FunctionPadSpec("pad-funcs", cl::CommaSeparated, cl::desc("list of functions to pad with amount of bytes"), cl::value_desc("func1:pad1,func2:pad2,func3:pad3,..."), cl::Hidden, cl::cat(BoltCategory)); -cl::list<std::string> FunctionPadBeforeSpec( +static cl::list<std::string> FunctionPadBeforeSpec( "pad-funcs-before", cl::CommaSeparated, cl::desc("list of functions to pad with amount of bytes"), cl::value_desc("func1:pad1,func2:pad2,func3:pad3,..."), cl::Hidden, @@ -74,10 +74,9 @@ X86AlignBranchBoundaryHotOnly("x86-align-branch-boundary-hot-only", cl::init(true), cl::cat(BoltOptCategory)); -size_t padFunction(const cl::list<std::string> &Spec, +size_t padFunction(std::map<std::string, size_t> &FunctionPadding, + const cl::list<std::string> &Spec, const BinaryFunction &Function) { - static std::map<std::string, size_t> FunctionPadding; - if (FunctionPadding.empty() && !Spec.empty()) { for (const std::string &Spec : Spec) { size_t N = Spec.find(':'); @@ -99,6 +98,15 @@ size_t padFunction(const cl::list<std::string> &Spec, return 0; } +size_t padFunctionBefore(const BinaryFunction &Function) { + static std::map<std::string, size_t> CacheFunctionPadding; + return padFunction(CacheFunctionPadding, FunctionPadBeforeSpec, Function); +} +size_t padFunctionAfter(const BinaryFunction &Function) { + static std::map<std::string, size_t> CacheFunctionPadding; + return padFunction(CacheFunctionPadding, FunctionPadSpec, Function); +} + } // namespace opts namespace { @@ -324,8 +332,7 @@ bool BinaryEmitter::emitFunction(BinaryFunction &Function, Streamer.emitCodeAlignment(Function.getAlign(), &*BC.STI); } - if (size_t Padding = - opts::padFunction(opts::FunctionPadBeforeSpec, Function)) { + if (size_t Padding = opts::padFunctionBefore(Function)) { // Handle padFuncsBefore after the above alignment logic but before // symbol addresses are decided. if (!BC.HasRelocations) { @@ -404,7 +411,7 @@ bool BinaryEmitter::emitFunction(BinaryFunction &Function, emitFunctionBody(Function, FF, /*EmitCodeOnly=*/false); // Emit padding if requested. - if (size_t Padding = opts::padFunction(opts::FunctionPadSpec, Function)) { + if (size_t Padding = opts::padFunctionAfter(Function)) { LLVM_DEBUG(dbgs() << "BOLT-DEBUG: padding function " << Function << " with " << Padding << " bytes\n"); Streamer.emitFill(Padding, MAI->getTextAlignFillValue()); |
