[lld] r190840 - [lld][ELF] Assign sectionChoice properly to ELF atoms
Shankar Easwaran
shankare at codeaurora.org
Mon Sep 16 19:56:22 PDT 2013
Author: shankare
Date: Mon Sep 16 21:56:22 2013
New Revision: 190840
URL: http://llvm.org/viewvc/llvm-project?rev=190840&view=rev
Log:
[lld][ELF] Assign sectionChoice properly to ELF atoms
This sets the sectionChoice property for DefinedAtoms. The output section name
is derived by the property of the atom. This also decreases native file size.
Adds a test.
Added:
lld/trunk/test/elf/X86_64/sectionchoice.test
Modified:
lld/trunk/lib/ReaderWriter/ELF/Atoms.h
lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h
lld/trunk/test/elf/mergeconstants.test
Modified: lld/trunk/lib/ReaderWriter/ELF/Atoms.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Atoms.h?rev=190840&r1=190839&r2=190840&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Atoms.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Atoms.h Mon Sep 16 21:56:22 2013
@@ -16,6 +16,7 @@
#include "lld/ReaderWriter/Simple.h"
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/StringSwitch.h"
#include <memory>
#include <vector>
@@ -376,9 +377,20 @@ public:
// Do we have a choice for ELF? All symbols live in explicit sections.
virtual SectionChoice sectionChoice() const {
- if (_symbol->st_shndx > llvm::ELF::SHN_LORESERVE)
- return sectionBasedOnContent;
-
+ switch (contentType()) {
+ case typeCode:
+ case typeData:
+ case typeZeroFill:
+ case typeThreadZeroFill:
+ case typeThreadData:
+ case typeConstant:
+ if ((_sectionName == ".text") || (_sectionName == ".data") ||
+ (_sectionName == ".bss") || (_sectionName == ".rodata") ||
+ (_sectionName == ".tdata") || (_sectionName == ".tbss"))
+ return sectionBasedOnContent;
+ default:
+ break;
+ }
return sectionCustomRequired;
}
Modified: lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h?rev=190840&r1=190839&r2=190840&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h Mon Sep 16 21:56:22 2013
@@ -172,8 +172,7 @@ public:
int32_t contentPermissions);
/// \brief This maps the input sections to the output section names
- virtual StringRef getSectionName(StringRef name, const int32_t contentType,
- const int32_t contentPermissions);
+ virtual StringRef getSectionName(const DefinedAtom *da) const;
/// \brief Gets or creates a section.
AtomSection<ELFT> *getSection(
@@ -372,29 +371,35 @@ Layout::SectionOrder DefaultLayout<ELFT>
/// \brief This maps the input sections to the output section names
template <class ELFT>
-StringRef DefaultLayout<ELFT>::getSectionName(
- StringRef name, const int32_t contentType,
- const int32_t contentPermissions) {
- if ((contentType == DefinedAtom::typeZeroFill) ||
- (contentType == DefinedAtom::typeZeroFillFast))
- return ".bss";
- if (name.startswith(".text"))
- return ".text";
- if (name.startswith(".rodata"))
- return ".rodata";
- if (name.startswith(".gcc_except_table"))
- return ".gcc_except_table";
- if (name.startswith(".data.rel.ro"))
- return ".data.rel.ro";
- if (name.startswith(".data.rel.local"))
- return ".data.rel.local";
- if (name.startswith(".data"))
- return ".data";
- if (name.startswith(".tdata"))
- return ".tdata";
- if (name.startswith(".tbss"))
- return ".tbss";
- return name;
+StringRef DefaultLayout<ELFT>::getSectionName(const DefinedAtom *da) const {
+ if (da->sectionChoice() == DefinedAtom::sectionBasedOnContent) {
+ switch (da->contentType()) {
+ case DefinedAtom::typeCode:
+ return ".text";
+ case DefinedAtom::typeData:
+ return ".data";
+ case DefinedAtom::typeConstant:
+ return ".rodata";
+ case DefinedAtom::typeZeroFill:
+ return ".bss";
+ case DefinedAtom::typeThreadData:
+ return ".tdata";
+ case DefinedAtom::typeThreadZeroFill:
+ return ".tbss";
+ default:
+ break;
+ }
+ }
+ return llvm::StringSwitch<StringRef>(da->customSectionName())
+ .StartsWith(".text", ".text")
+ .StartsWith(".rodata", ".rodata")
+ .StartsWith(".gcc_except_table", ".gcc_except_table")
+ .StartsWith(".data.rel.ro", ".data.rel.ro")
+ .StartsWith(".data.rel.local", ".data.rel.local")
+ .StartsWith(".data", ".data")
+ .StartsWith(".tdata", ".tdata")
+ .StartsWith(".tbss", ".tbss")
+ .Default(da->customSectionName());
}
/// \brief Gets the segment for a output section
@@ -519,12 +524,11 @@ ErrorOr<const lld::AtomLayout &> Default
// -noinhibit-exec.
if (definedAtom->contentType() == DefinedAtom::typeUnknown)
return make_error_code(llvm::errc::invalid_argument);
- StringRef sectionName = definedAtom->customSectionName();
const DefinedAtom::ContentPermissions permissions =
definedAtom->permissions();
const DefinedAtom::ContentType contentType = definedAtom->contentType();
- sectionName = getSectionName(sectionName, contentType, permissions);
+ StringRef sectionName = getSectionName(definedAtom);
AtomSection<ELFT> *section =
getSection(sectionName, contentType, permissions);
// Add runtime relocations to the .rela section.
Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h?rev=190840&r1=190839&r2=190840&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h Mon Sep 16 21:56:22 2013
@@ -103,13 +103,15 @@ public:
}
/// \brief This maps the input sections to the output section names
- virtual StringRef getSectionName(StringRef name, const int32_t contentType,
- const int32_t contentPermissions) {
- if ((contentType == DefinedAtom::typeDataFast) ||
- (contentType == DefinedAtom::typeZeroFillFast))
+ virtual StringRef getSectionName(const DefinedAtom *da) const {
+ switch (da->contentType()) {
+ case DefinedAtom::typeDataFast:
+ case DefinedAtom::typeZeroFillFast:
return ".sdata";
- return DefaultLayout<HexagonELFType>::getSectionName(name, contentType,
- contentPermissions);
+ default:
+ break;
+ }
+ return DefaultLayout<HexagonELFType>::getSectionName(da);
}
/// \brief Gets or creates a section.
Added: lld/trunk/test/elf/X86_64/sectionchoice.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/sectionchoice.test?rev=190840&view=auto
==============================================================================
--- lld/trunk/test/elf/X86_64/sectionchoice.test (added)
+++ lld/trunk/test/elf/X86_64/sectionchoice.test Mon Sep 16 21:56:22 2013
@@ -0,0 +1,7 @@
+# This tests that we are able to properly set the sectionChoice for DefinedAtoms
+RUN: lld -flavor gnu -target x86_64-linux %p/Inputs/zerosizedsection.o \
+RUN: --noinhibit-exec -o %t -emit-yaml
+RUN: FileCheck %s < %t
+
+CHECK-NOT: section-choice: sectionCustomRequired
+
Modified: lld/trunk/test/elf/mergeconstants.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/mergeconstants.test?rev=190840&r1=190839&r2=190840&view=diff
==============================================================================
--- lld/trunk/test/elf/mergeconstants.test (original)
+++ lld/trunk/test/elf/mergeconstants.test Mon Sep 16 21:56:22 2013
@@ -12,8 +12,6 @@ mergeAtoms: scope: global
mergeAtoms: type: data
mergeAtoms: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
mergeAtoms: alignment: 2^3
-mergeAtoms: section-choice: custom-required
-mergeAtoms: section-name: .data
mergeAtoms: references:
mergeAtoms: - kind: R_X86_64_64
mergeAtoms: offset: 3
More information about the llvm-commits
mailing list