[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:
Vladislav Khmelevsky 2022-03-20 15:31:16 +03:00
parent 1c5663458b
commit fed958c6cc
3 changed files with 37 additions and 1 deletions

View File

@ -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)

View File

@ -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());
};

View File

@ -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;
}