Set alignment of .llvmbc and .llvmcmd to 1

Otherwise their alignment is dependent on the size of the section.  If the size
is large than 16, the alignment will be 16.

16 is a bad choice for both .llvmbc and .llvmcmd because the padding between two
contributions from input sections is of a variable size.

A bitstream is actually guaranteed to be 4-byte aligned, but consumers don't
need this property.
This commit is contained in:
Fangrui Song 2020-08-29 18:27:34 -07:00
parent 4fbf0636a2
commit 6ae7b403c3
4 changed files with 12 additions and 8 deletions

View File

@ -43,9 +43,9 @@
; RUN: | FileCheck %s -check-prefix=CHECK-WARNING
; CHECK-ELF: @llvm.embedded.module
; CHECK-ELF: section ".llvmbc"
; CHECK-ELF-SAME: section ".llvmbc", align 1
; CHECK-ELF: @llvm.cmdline
; CHECK-ELF: section ".llvmcmd"
; CHECK-ELF-SAME: section ".llvmcmd", align 1
; CHECK-ONLY-BITCODE: @llvm.embedded.module = private constant
; CHECK-ONLY-BITCODE: c"\DE\C0\17\0B

View File

@ -43,17 +43,17 @@
; CHECK: section "__LLVM,__cmdline"
; CHECK-ELF: @llvm.embedded.module
; CHECK-ELF: section ".llvmbc"
; CHECK-ELF-SAME: section ".llvmbc", align 1
; CHECK-ELF: @llvm.cmdline
; CHECK-ELF: section ".llvmcmd"
; CHECK-ELF-SAME: section ".llvmcmd", align 1
; CHECK-ELF-MARKER: @llvm.embedded.module
; CHECK-ELF-MARKER: constant [0 x i8] zeroinitializer
; CHECK-ELF-MARKER: @llvm.cmdline
; CHECK-ELF-MARKER: section ".llvmcmd"
; CHECK-ELF-MARKER: section ".llvmcmd", align 1
; CHECK-ELF-ONLY-BITCODE: @llvm.embedded.module
; CHECK-ELF-ONLY-BITCODE: section ".llvmbc"
; CHECK-ELF-ONLY-BITCODE-SAME: section ".llvmbc", align 1
; CHECK-ELF-ONLY-BITCODE-NOT: @llvm.cmdline
; CHECK-ELF-ONLY-BITCODE-NOT: section ".llvmcmd"

View File

@ -4852,6 +4852,9 @@ void llvm::EmbedBitcodeInModule(llvm::Module &M, llvm::MemoryBufferRef Buf,
M, ModuleConstant->getType(), true, llvm::GlobalValue::PrivateLinkage,
ModuleConstant);
GV->setSection(getSectionNameForBitcode(T));
// Set alignment to 1 to prevent padding between two contributions from input
// sections after linking.
GV->setAlignment(Align(1));
UsedArray.push_back(
ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV, UsedElementType));
if (llvm::GlobalVariable *Old =
@ -4875,6 +4878,7 @@ void llvm::EmbedBitcodeInModule(llvm::Module &M, llvm::MemoryBufferRef Buf,
llvm::GlobalValue::PrivateLinkage,
CmdConstant);
GV->setSection(getSectionNameForCommandline(T));
GV->setAlignment(Align(1));
UsedArray.push_back(
ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV, UsedElementType));
if (llvm::GlobalVariable *Old = M.getGlobalVariable("llvm.cmdline", true)) {

View File

@ -5,6 +5,6 @@
; CHECK-NEXT: .llvmbc PROGBITS 0000000000000000 [[#%x,OFF:]] 000004 00 0
; CHECK-NEXT: .llvmcmd PROGBITS 0000000000000000 [[#%x,OFF:]] 000005 00 0
@llvm.embedded.module = private constant [4 x i8] c"BC\C0\DE", section ".llvmbc"
@llvm.cmdline = private constant [5 x i8] c"-cc1\00", section ".llvmcmd"
@llvm.embedded.module = private constant [4 x i8] c"BC\C0\DE", section ".llvmbc", align 1
@llvm.cmdline = private constant [5 x i8] c"-cc1\00", section ".llvmcmd", align 1
@llvm.compiler.used = appending global [2 x i8*] [i8* getelementptr inbounds ([4 x i8], [4 x i8]* @llvm.embedded.module, i32 0, i32 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @llvm.cmdline, i32 0, i32 0)], section "llvm.metadata"