diff options
Diffstat (limited to 'bolt')
| -rw-r--r-- | bolt/lib/Core/BinaryEmitter.cpp | 23 | ||||
| -rw-r--r-- | bolt/lib/Core/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | bolt/lib/Passes/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | bolt/lib/Passes/ReorderFunctions.cpp | 15 | ||||
| -rw-r--r-- | bolt/lib/Profile/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | bolt/lib/Rewrite/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | bolt/lib/RuntimeLibs/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | bolt/lib/Target/AArch64/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | bolt/lib/Target/RISCV/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | bolt/lib/Target/X86/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | bolt/lib/Utils/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | bolt/test/AArch64/pad-before-funcs.s | 21 |
12 files changed, 51 insertions, 18 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()); diff --git a/bolt/lib/Core/CMakeLists.txt b/bolt/lib/Core/CMakeLists.txt index bb58667066fd..8c1f5d0bb37b 100644 --- a/bolt/lib/Core/CMakeLists.txt +++ b/bolt/lib/Core/CMakeLists.txt @@ -35,6 +35,7 @@ add_llvm_library(LLVMBOLTCore ParallelUtilities.cpp Relocation.cpp + NO_EXPORT DISABLE_LLVM_LINK_LLVM_DYLIB LINK_LIBS ${LLVM_PTHREAD_LIB} diff --git a/bolt/lib/Passes/CMakeLists.txt b/bolt/lib/Passes/CMakeLists.txt index 1c1273b3d242..1e3289484a5b 100644 --- a/bolt/lib/Passes/CMakeLists.txt +++ b/bolt/lib/Passes/CMakeLists.txt @@ -46,6 +46,7 @@ add_llvm_library(LLVMBOLTPasses VeneerElimination.cpp RetpolineInsertion.cpp + NO_EXPORT DISABLE_LLVM_LINK_LLVM_DYLIB LINK_LIBS diff --git a/bolt/lib/Passes/ReorderFunctions.cpp b/bolt/lib/Passes/ReorderFunctions.cpp index f8f6a01526dc..35c5acfdecdb 100644 --- a/bolt/lib/Passes/ReorderFunctions.cpp +++ b/bolt/lib/Passes/ReorderFunctions.cpp @@ -28,9 +28,8 @@ extern cl::OptionCategory BoltOptCategory; extern cl::opt<unsigned> Verbosity; extern cl::opt<uint32_t> RandomSeed; -extern size_t padFunction(const cl::list<std::string> &Spec, - const bolt::BinaryFunction &Function); -extern cl::list<std::string> FunctionPadSpec, FunctionPadBeforeSpec; +extern size_t padFunctionBefore(const bolt::BinaryFunction &Function); +extern size_t padFunctionAfter(const bolt::BinaryFunction &Function); extern cl::opt<bolt::ReorderFunctions::ReorderType> ReorderFunctions; cl::opt<bolt::ReorderFunctions::ReorderType> ReorderFunctions( @@ -306,12 +305,10 @@ Error ReorderFunctions::runOnFunctions(BinaryContext &BC) { return false; if (B->isIgnored()) return true; - const size_t PadA = - opts::padFunction(opts::FunctionPadSpec, *A) + - opts::padFunction(opts::FunctionPadBeforeSpec, *A); - const size_t PadB = - opts::padFunction(opts::FunctionPadSpec, *B) + - opts::padFunction(opts::FunctionPadBeforeSpec, *B); + const size_t PadA = opts::padFunctionBefore(*A) + + opts::padFunctionAfter(*A); + const size_t PadB = opts::padFunctionBefore(*B) + + opts::padFunctionAfter(*B); if (!PadA || !PadB) { if (PadA) return true; diff --git a/bolt/lib/Profile/CMakeLists.txt b/bolt/lib/Profile/CMakeLists.txt index 9aa4ba0490b0..a2bb4aa074c7 100644 --- a/bolt/lib/Profile/CMakeLists.txt +++ b/bolt/lib/Profile/CMakeLists.txt @@ -7,6 +7,7 @@ add_llvm_library(LLVMBOLTProfile YAMLProfileReader.cpp YAMLProfileWriter.cpp + NO_EXPORT DISABLE_LLVM_LINK_LLVM_DYLIB LINK_COMPONENTS diff --git a/bolt/lib/Rewrite/CMakeLists.txt b/bolt/lib/Rewrite/CMakeLists.txt index 5d114925f59b..c83cf3698216 100644 --- a/bolt/lib/Rewrite/CMakeLists.txt +++ b/bolt/lib/Rewrite/CMakeLists.txt @@ -25,6 +25,7 @@ add_llvm_library(LLVMBOLTRewrite RewriteInstance.cpp SDTRewriter.cpp + NO_EXPORT DISABLE_LLVM_LINK_LLVM_DYLIB LINK_LIBS diff --git a/bolt/lib/RuntimeLibs/CMakeLists.txt b/bolt/lib/RuntimeLibs/CMakeLists.txt index d3ac71d3e797..b8db7e4a1553 100644 --- a/bolt/lib/RuntimeLibs/CMakeLists.txt +++ b/bolt/lib/RuntimeLibs/CMakeLists.txt @@ -11,6 +11,7 @@ add_llvm_library(LLVMBOLTRuntimeLibs HugifyRuntimeLibrary.cpp InstrumentationRuntimeLibrary.cpp + NO_EXPORT DISABLE_LLVM_LINK_LLVM_DYLIB ) diff --git a/bolt/lib/Target/AArch64/CMakeLists.txt b/bolt/lib/Target/AArch64/CMakeLists.txt index 7e2d33e09b5a..8435ea7245e7 100644 --- a/bolt/lib/Target/AArch64/CMakeLists.txt +++ b/bolt/lib/Target/AArch64/CMakeLists.txt @@ -19,6 +19,7 @@ endif() add_llvm_library(LLVMBOLTTargetAArch64 AArch64MCPlusBuilder.cpp + NO_EXPORT DISABLE_LLVM_LINK_LLVM_DYLIB DEPENDS diff --git a/bolt/lib/Target/RISCV/CMakeLists.txt b/bolt/lib/Target/RISCV/CMakeLists.txt index 5d19d38717de..6c3a196f8a1f 100644 --- a/bolt/lib/Target/RISCV/CMakeLists.txt +++ b/bolt/lib/Target/RISCV/CMakeLists.txt @@ -20,6 +20,7 @@ endif() add_llvm_library(LLVMBOLTTargetRISCV RISCVMCPlusBuilder.cpp + NO_EXPORT DISABLE_LLVM_LINK_LLVM_DYLIB DEPENDS diff --git a/bolt/lib/Target/X86/CMakeLists.txt b/bolt/lib/Target/X86/CMakeLists.txt index b274716e89a4..6d1accb5e815 100644 --- a/bolt/lib/Target/X86/CMakeLists.txt +++ b/bolt/lib/Target/X86/CMakeLists.txt @@ -21,6 +21,7 @@ add_llvm_library(LLVMBOLTTargetX86 X86MCPlusBuilder.cpp X86MCSymbolizer.cpp + NO_EXPORT DISABLE_LLVM_LINK_LLVM_DYLIB DEPENDS diff --git a/bolt/lib/Utils/CMakeLists.txt b/bolt/lib/Utils/CMakeLists.txt index c452c1fac377..efba6d54449d 100644 --- a/bolt/lib/Utils/CMakeLists.txt +++ b/bolt/lib/Utils/CMakeLists.txt @@ -29,6 +29,8 @@ add_llvm_library(LLVMBOLTUtils CommandLineOpts.cpp Utils.cpp ${version_inc} + + NO_EXPORT DISABLE_LLVM_LINK_LLVM_DYLIB LINK_LIBS diff --git a/bolt/test/AArch64/pad-before-funcs.s b/bolt/test/AArch64/pad-before-funcs.s index 3ce0ee5e3838..f3e8a23ddfdd 100644 --- a/bolt/test/AArch64/pad-before-funcs.s +++ b/bolt/test/AArch64/pad-before-funcs.s @@ -2,11 +2,18 @@ # It should be able to introduce a configurable offset for the _start symbol. # It should reject requests which don't obey the code alignment requirement. +# Tests check inserting padding before _start; and additionally a test where +# padding is inserted after start. In each case, check that the following +# symbol ends up in the expected place as well. + + # RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown %s -o %t.o # RUN: %clang %cflags %t.o -o %t.exe -Wl,-q -Wl,--section-start=.text=0x4000 # RUN: llvm-bolt %t.exe -o %t.bolt.0 --pad-funcs-before=_start:0 # RUN: llvm-bolt %t.exe -o %t.bolt.4 --pad-funcs-before=_start:4 # RUN: llvm-bolt %t.exe -o %t.bolt.8 --pad-funcs-before=_start:8 +# RUN: llvm-bolt %t.exe -o %t.bolt.4.4 --pad-funcs-before=_start:4 --pad-funcs=_start:4 +# RUN: llvm-bolt %t.exe -o %t.bolt.4.8 --pad-funcs-before=_start:4 --pad-funcs=_start:8 # RUN: not llvm-bolt %t.exe -o %t.bolt.8 --pad-funcs-before=_start:1 2>&1 | FileCheck --check-prefix=CHECK-BAD-ALIGN %s @@ -15,15 +22,27 @@ # RUN: llvm-objdump --section=.text --disassemble %t.bolt.0 | FileCheck --check-prefix=CHECK-0 %s # RUN: llvm-objdump --section=.text --disassemble %t.bolt.4 | FileCheck --check-prefix=CHECK-4 %s # RUN: llvm-objdump --section=.text --disassemble %t.bolt.8 | FileCheck --check-prefix=CHECK-8 %s +# RUN: llvm-objdump --section=.text --disassemble %t.bolt.4.4 | FileCheck --check-prefix=CHECK-4-4 %s +# RUN: llvm-objdump --section=.text --disassemble %t.bolt.4.8 | FileCheck --check-prefix=CHECK-4-8 %s # Trigger relocation mode in bolt. .reloc 0, R_AARCH64_NONE .section .text -.globl _start # CHECK-0: 0000000000400000 <_start> # CHECK-4: 0000000000400004 <_start> +# CHECK-4-4: 0000000000400004 <_start> # CHECK-8: 0000000000400008 <_start> +.globl _start _start: ret + +# CHECK-0: 0000000000400004 <_subsequent> +# CHECK-4: 0000000000400008 <_subsequent> +# CHECK-4-4: 000000000040000c <_subsequent> +# CHECK-4-8: 0000000000400010 <_subsequent> +# CHECK-8: 000000000040000c <_subsequent> +.globl _subsequent +_subsequent: + ret |
