[ELF] Set ordinals properly to all atoms.

llvm-svn: 192939
This commit is contained in:
Shankar Easwaran 2013-10-18 02:12:17 +00:00
parent ffbc4decc2
commit b6c825a5cf
6 changed files with 42 additions and 6 deletions

View File

@ -516,7 +516,7 @@ public:
_referenceEndIndex = _referenceList.size();
}
void setOrdinal(uint64_t ord) { _ordinal = ord; }
virtual void setOrdinal(uint64_t ord) { _ordinal = ord; }
private:
const ELFFile<ELFT> &_owningFile;
@ -561,7 +561,7 @@ public:
virtual uint64_t offset() const { return _offset; }
void setOrdinal(uint64_t ord) { _ordinal = ord; }
virtual void setOrdinal(uint64_t ord) { _ordinal = ord; }
virtual uint64_t ordinal() const { return _ordinal; }
@ -645,9 +645,7 @@ public:
return _ordinal;
}
void setOrdinal(uint64_t ord) {
_ordinal = ord;
}
virtual void setOrdinal(uint64_t ord) { _ordinal = ord; }
virtual uint64_t size() const {
return _symbol->st_size;

View File

@ -302,7 +302,7 @@ public:
} else if (isCommonSymbol(&*SymI)) {
auto *newAtom = new (_readerStorage)
ELFCommonAtom<ELFT>(*this, *symbolName, &*SymI);
newAtom->setOrdinal(_ordinal++);
newAtom->setOrdinal(++_ordinal);
_definedAtoms._atoms.push_back(newAtom);
_symbolToAtomMapping.insert(std::make_pair(&*SymI, newAtom));
} else {
@ -361,6 +361,7 @@ public:
ELFDefinedAtom<ELFT> *newAtom = createSectionAtom(
section, *sectionName, secCont);
_definedAtoms._atoms.push_back(newAtom);
newAtom->setOrdinal(++_ordinal);
continue;
}
@ -408,6 +409,7 @@ public:
*this, symbolName, *sectionName, &**si, section, symbolData,
_references.size(), _references.size(), _references);
_definedAtoms._atoms.push_back(definedMergeAtom);
definedMergeAtom->setOrdinal(++_ordinal);
}
continue;
}

View File

@ -0,0 +1,3 @@
const char _nl_default_default_domain[] __attribute__ ((visibility ("hidden"))) = "messages";
const char *_nl_current_default_domain __attribute__ ((visibility ("hidden"))) = _nl_default_default_domain;
const char _nl_default_default_dirname[] = "/usr/local";

Binary file not shown.

View File

@ -0,0 +1,24 @@
.file "x.c"
.hidden _nl_default_default_domain
.globl _nl_default_default_domain
.section .rodata._nl_default_default_domain,"ams",@progbits,1
.type _nl_default_default_domain, @object
.size _nl_default_default_domain, 9
_nl_default_default_domain:
.string "messages"
.hidden _nl_current_default_domain
.globl _nl_current_default_domain
.section .data._nl_current_default_domain,"aw",@progbits
.align 8
.type _nl_current_default_domain, @object
.size _nl_current_default_domain, 8
_nl_current_default_domain:
.quad _nl_default_default_domain
.globl _nl_default_default_dirname
.section .rodata._nl_default_default_dirname,"ams",@progbits,1
.type _nl_default_default_dirname, @object
.size _nl_default_default_dirname, 11
_nl_default_default_dirname:
.string "/usr/local"
.ident "GCC: (Ubuntu 4.8.1-2ubuntu1~10.04.1) 4.8.1"
.section .note.GNU-stack,"",@progbits

View File

@ -0,0 +1,9 @@
# This tests that the ordinals for all merge atoms and defined atoms have been
# set properly
RUN: lld -flavor gnu -target x86_64 %p/Inputs/rodata.o --noinhibit-exec \
RUN: --merge-strings -static -o %t1
RUN: llvm-nm -n %t1 | FileCheck %s
CHECK: {{[0-9a-f]+}} R _nl_default_default_domain
CHECK: {{[0-9a-f]+}} R _nl_default_default_dirname