diff --git a/bolt/lib/Core/BinaryEmitter.cpp b/bolt/lib/Core/BinaryEmitter.cpp --- a/bolt/lib/Core/BinaryEmitter.cpp +++ b/bolt/lib/Core/BinaryEmitter.cpp @@ -277,7 +277,7 @@ } 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) diff --git a/bolt/lib/Passes/Aligner.cpp b/bolt/lib/Passes/Aligner.cpp --- a/bolt/lib/Passes/Aligner.cpp +++ b/bolt/lib/Passes/Aligner.cpp @@ -172,6 +172,20 @@ 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()); }; diff --git a/bolt/test/AArch64/text-data.c b/bolt/test/AArch64/text-data.c new file mode 100644 --- /dev/null +++ b/bolt/test/AArch64/text-data.c @@ -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: {{.*}} : + +#include + +typedef void (*FooPtr)(); + +void exitOk() { exit(0); } + +__attribute__((section(".text"))) const FooPtr arr[] = {exitOk, NULL}; + +int main() { + arr[0](); + return -1; +}