forked from OSchip/llvm-project
[BOLT] AArch64: Emit text objects
BOLT treats aarch64 objects located in text as empty functions with contant islands. Emit them with at least 8-byte alignment to the new text section. Vladislav Khmelevsky, Advanced Software Technology Lab, Huawei Differential Revision: https://reviews.llvm.org/D122097
This commit is contained in:
parent
1c5663458b
commit
fed958c6cc
|
@ -277,7 +277,7 @@ void BinaryEmitter::emitFunctions() {
|
|||
}
|
||||
|
||||
bool BinaryEmitter::emitFunction(BinaryFunction &Function, bool EmitColdPart) {
|
||||
if (Function.size() == 0)
|
||||
if (Function.size() == 0 && !Function.hasIslandsInfo())
|
||||
return false;
|
||||
|
||||
if (Function.getState() == BinaryFunction::State::Empty)
|
||||
|
|
|
@ -172,6 +172,20 @@ void AlignerPass::runOnFunctions(BinaryContext &BC) {
|
|||
else
|
||||
alignMaxBytes(BF);
|
||||
|
||||
// Align objects that contains constant islands and no code
|
||||
// to at least 8 bytes.
|
||||
if (!BF.size() && BF.hasIslandsInfo()) {
|
||||
const uint16_t Alignment = BF.getConstantIslandAlignment();
|
||||
if (BF.getAlignment() < Alignment)
|
||||
BF.setAlignment(Alignment);
|
||||
|
||||
if (BF.getMaxAlignmentBytes() < Alignment)
|
||||
BF.setMaxAlignmentBytes(Alignment);
|
||||
|
||||
if (BF.getMaxColdAlignmentBytes() < Alignment)
|
||||
BF.setMaxColdAlignmentBytes(Alignment);
|
||||
}
|
||||
|
||||
if (opts::AlignBlocks && !opts::PreserveBlocksAlignment)
|
||||
alignBlocks(BF, Emitter.MCE.get());
|
||||
};
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
// This test checks that the data object located in text section
|
||||
// is properly emitted in the new section.
|
||||
|
||||
// RUN: %clang %cflags %s -o %t.exe -Wl,-q
|
||||
// RUN: llvm-bolt %t.exe -o %t.bolt -lite=0 -use-old-text=0
|
||||
// RUN: llvm-objdump -j .text -d --disassemble-symbols=arr %t.bolt | \
|
||||
// RUN: FileCheck %s
|
||||
|
||||
// CHECK: {{.*}} <arr>:
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef void (*FooPtr)();
|
||||
|
||||
void exitOk() { exit(0); }
|
||||
|
||||
__attribute__((section(".text"))) const FooPtr arr[] = {exitOk, NULL};
|
||||
|
||||
int main() {
|
||||
arr[0]();
|
||||
return -1;
|
||||
}
|
Loading…
Reference in New Issue