diff options
| author | Will Newton <will.newton@linaro.org> | 2015-01-20 16:10:04 +0000 |
|---|---|---|
| committer | Will Newton <will.newton@linaro.org> | 2015-01-20 16:10:04 +0000 |
| commit | f1925f84ff5ea419c63143e78d7fd2b470c072f9 (patch) | |
| tree | 3116f7d8f8c365fc9f2fce01259111188f19290d | |
| parent | 9ebd858f6c8d20ec9f67017b761c2453298e794f (diff) | |
| download | bcm5719-llvm-f1925f84ff5ea419c63143e78d7fd2b470c072f9.tar.gz bcm5719-llvm-f1925f84ff5ea419c63143e78d7fd2b470c072f9.zip | |
ELF: Handle sh_addralign being set to zero
sh_addralign of zero is equivalent to sh_addralign of one, meaning
no alignment specified. Avoid calculating Log2 or modulus when
sh_addralign is zero as the results will not be useful.
llvm-svn: 226572
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/Atoms.h | 3 | ||||
| -rw-r--r-- | lld/test/elf/sh_addralign.test | 38 |
2 files changed, 41 insertions, 0 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Atoms.h b/lld/lib/ReaderWriter/ELF/Atoms.h index 23fa3f8940f..1aed34698f7 100644 --- a/lld/lib/ReaderWriter/ELF/Atoms.h +++ b/lld/lib/ReaderWriter/ELF/Atoms.h @@ -286,6 +286,9 @@ public: if ((_symbol->getType() == llvm::ELF::STT_COMMON) || _symbol->st_shndx == llvm::ELF::SHN_COMMON) { return Alignment(llvm::Log2_64(_symbol->st_value)); + } else if (_section->sh_addralign == 0) { + // sh_addralign of 0 means no alignment + return Alignment(0, _symbol->st_value); } return Alignment(llvm::Log2_64(_section->sh_addralign), _symbol->st_value % _section->sh_addralign); diff --git a/lld/test/elf/sh_addralign.test b/lld/test/elf/sh_addralign.test new file mode 100644 index 00000000000..404c676c833 --- /dev/null +++ b/lld/test/elf/sh_addralign.test @@ -0,0 +1,38 @@ +# Check handling of section alignment. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor gnu -target arm64 -o %t-exe %t-obj +# RUN: llvm-objdump -h %t-exe | FileCheck %s + +# CHECK: 8 .data 00000000 0000000000402000 DATA + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: '' + AddressAlign: 0 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 1 + Content: '' + Size: 0x80000000 +- Name: .data + Type: SHT_PROGBITS + Content: '' + AddressAlign: 4096 + Flags: [SHF_ALLOC, SHF_WRITE] + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 |

