[lld] r205163 - [core] support .gnu.linkonce sections
Rui Ueyama
ruiu at google.com
Sun Mar 30 21:11:00 PDT 2014
This is not an obvious change to Core, not suitable for post-commit review.
Please roll it back until we reach a conclusion that this is the right
design.
On Sun, Mar 30, 2014 at 8:16 PM, Shankar Easwaran <shankarke at gmail.com>wrote:
> Author: shankare
> Date: Sun Mar 30 22:16:37 2014
> New Revision: 205163
>
> URL: http://llvm.org/viewvc/llvm-project?rev=205163&view=rev
> Log:
> [core] support .gnu.linkonce sections
>
> .gnu.linkonce sections are similar to section groups. They were supported
> before
> section groups existed and provided a way to resolve COMDAT sections using
> a
> different design. There are few implementations that use .gnu.linkonce
> sections
> to store simple floating point constants which doesnot require complex
> section
> group support but need a way to store only one copy of the floating point
> constant. .gnu.linkonce based symbol resolution achieves that.
>
> Added:
> lld/trunk/test/core/gnulinkonce-rearrange-resolve.objtxt
> lld/trunk/test/core/gnulinkonce-remaining-undef.objtxt
> lld/trunk/test/core/gnulinkonce-resolve.objtxt
> lld/trunk/test/core/gnulinkonce-simple.objtxt
> lld/trunk/test/core/sectiongroup-gnulinkonce-error.objtxt
> Modified:
> lld/trunk/include/lld/Core/DefinedAtom.h
> lld/trunk/include/lld/Core/Resolver.h
> lld/trunk/lib/Core/DefinedAtom.cpp
> lld/trunk/lib/Core/Resolver.cpp
> lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp
> lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
>
> Modified: lld/trunk/include/lld/Core/DefinedAtom.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/DefinedAtom.h?rev=205163&r1=205162&r2=205163&view=diff
>
> ==============================================================================
> --- lld/trunk/include/lld/Core/DefinedAtom.h (original)
> +++ lld/trunk/include/lld/Core/DefinedAtom.h Sun Mar 30 22:16:37 2014
> @@ -147,6 +147,7 @@ public:
> typeRWNote, // Identifies readwrite note sections [ELF]
> typeNoAlloc, // Identifies non allocatable sections [ELF]
> typeGroupComdat, // Identifies a section group [ELF, COFF]
> + typeGnuLinkOnce, // Identifies a gnu.linkonce section [ELF]
>
So you defined a new type for gnu.linkonce sections, but throughout this
patch typeGnuLinkOnce is not distinguished from typeGroupComdat. All if's
previously handled typeGroupComdat are now replaced with typeGroupComdat ||
typeGnuLinkOnce. That does not look good.
I don't see the reason we can't simply treat gnu.linkonce as
typeGroupComdat. If we treat gnu.linkonce such a way, only the ELF object
reader will have to handle gnu.linkonce sections and Resolver will remain
unchanged.
};
>
> // Permission bits for atoms and segments. The order of these values are
>
> Modified: lld/trunk/include/lld/Core/Resolver.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/Resolver.h?rev=205163&r1=205162&r2=205163&view=diff
>
> ==============================================================================
> --- lld/trunk/include/lld/Core/Resolver.h (original)
> +++ lld/trunk/include/lld/Core/Resolver.h Sun Mar 30 22:16:37 2014
> @@ -67,8 +67,8 @@ public:
> private:
> typedef std::function<void(StringRef, bool)> UndefCallback;
>
> - /// \brief Add section group if it does not exist previously.
> - void maybeAddSectionGroup(const DefinedAtom &atom);
> + /// \brief Add section group/.gnu.linkonce if it does not exist
> previously.
> + bool maybeAddSectionGroupOrGnuLinkOnce(const DefinedAtom &atom);
>
> /// \brief The main function that iterates over the files to resolve
> bool resolveUndefines();
>
> Modified: lld/trunk/lib/Core/DefinedAtom.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/DefinedAtom.cpp?rev=205163&r1=205162&r2=205163&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/Core/DefinedAtom.cpp (original)
> +++ lld/trunk/lib/Core/DefinedAtom.cpp Sun Mar 30 22:16:37 2014
> @@ -72,6 +72,7 @@ DefinedAtom::ContentPermissions DefinedA
> return permRW_L;
>
> case typeGroupComdat:
> + case typeGnuLinkOnce:
> case typeUnknown:
> case typeTempLTO:
> return permUnknown;
>
> Modified: lld/trunk/lib/Core/Resolver.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/Resolver.cpp?rev=205163&r1=205162&r2=205163&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/Core/Resolver.cpp (original)
> +++ lld/trunk/lib/Core/Resolver.cpp Sun Mar 30 22:16:37 2014
> @@ -184,11 +184,22 @@ void Resolver::doUndefinedAtom(const Und
> }
>
> /// \brief Add the section group and the group-child reference members.
> -void Resolver::maybeAddSectionGroup(const DefinedAtom &atom) {
> +bool Resolver::maybeAddSectionGroupOrGnuLinkOnce(const DefinedAtom &atom)
> {
> // First time adding a group ?
> bool isFirstTime = _symbolTable.addGroup(atom);
> - if (!isFirstTime)
> - return;
> +
> + if (!isFirstTime) {
> + // If duplicate symbols are allowed, select the first group.
> + if (_context.getAllowDuplicates())
> + return true;
> + const DefinedAtom *prevGroup =
> llvm::dyn_cast<DefinedAtom>(_symbolTable.findGroup(atom.name()));
> + assert(prevGroup && "Internal Error: The group atom could only be a
> defined atom");
> + // The atoms should be of the same content type, reject invalid group
> + // resolution behaviors.
> + if (atom.contentType() != prevGroup->contentType())
> + return false;
> + return true;
> + }
>
> for (const Reference *r : atom) {
> if ((r->kindNamespace() == lld::Reference::KindNamespace::all) &&
> @@ -200,6 +211,7 @@ void Resolver::maybeAddSectionGroup(cons
> _symbolTable.add(*target);
> }
> }
> + return true;
> }
>
> // called on each atom when a file is added
> @@ -229,8 +241,14 @@ void Resolver::doDefinedAtom(const Defin
> // add to list of known atoms
> _atoms.push_back(&atom);
>
> - if (atom.contentType() == DefinedAtom::typeGroupComdat)
> - maybeAddSectionGroup(atom);
> + if ((atom.contentType() == DefinedAtom::typeGroupComdat) ||
> + (atom.contentType() == DefinedAtom::typeGnuLinkOnce)) {
> + // Raise error if there exists a similar gnu linkonce section.
> + if (!maybeAddSectionGroupOrGnuLinkOnce(atom)) {
> + llvm::errs() << "SymbolTable: error while merging " << atom.name()
> << "\n";
> + llvm::report_fatal_error("duplicate symbol error");
> + }
> + }
> else
> _symbolTable.add(atom);
>
>
> Modified: lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp?rev=205163&r1=205162&r2=205163&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp Sun Mar 30 22:16:37
> 2014
> @@ -41,7 +41,8 @@ public:
> // We are trying to process all atoms, but the defined() iterator
> does not
> // return group children. So, when a group parent is found, we need
> to
> // handle each child atom.
> - if (defAtom->contentType() == DefinedAtom::typeGroupComdat) {
> + if (defAtom->contentType() == DefinedAtom::typeGroupComdat ||
> + defAtom->contentType() == DefinedAtom::typeGnuLinkOnce) {
> for (const Reference *r : *defAtom) {
> if (r->kindNamespace() != lld::Reference::KindNamespace::all)
> continue;
>
> Modified: lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp?rev=205163&r1=205162&r2=205163&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp Sun Mar 30
> 22:16:37 2014
> @@ -71,7 +71,9 @@ public:
> if (!atom->name().empty())
> buildDuplicateNameMap(*atom);
>
> - if (atom->contentType() == DefinedAtom::typeGroupComdat) {
> + if (atom->contentType() == DefinedAtom::typeGroupComdat ||
> + atom->contentType() == DefinedAtom::typeGnuLinkOnce) {
> +
> for (const lld::Reference *ref : *atom) {
> if (ref->kindNamespace() != lld::Reference::KindNamespace::all)
> continue;
> @@ -229,7 +231,8 @@ private:
> }
>
> if (const lld::DefinedAtom *da = dyn_cast<DefinedAtom>(atom)) {
> - if (da->contentType() == DefinedAtom::typeGroupComdat) {
> + if (da->contentType() == DefinedAtom::typeGroupComdat ||
> + da->contentType() == DefinedAtom::typeGnuLinkOnce) {
> if (_groupMap.count(name)) {
> _io.setError(Twine("duplicate group name: ") + name);
> } else {
> @@ -476,7 +479,8 @@ template <> struct ScalarEnumerationTrai
> io.enumCase(value, "ro-note", DefinedAtom::typeRONote);
> io.enumCase(value, "rw-note", DefinedAtom::typeRWNote);
> io.enumCase(value, "no-alloc", DefinedAtom::typeNoAlloc);
> - io.enumCase(value, "group-comdat", DefinedAtom::typeGroupComdat);
> + io.enumCase(value, "group-comdat", DefinedAtom::typeGroupComdat);
> + io.enumCase(value, "gnu-linkonce", DefinedAtom::typeGnuLinkOnce);
> }
> };
>
>
> Added: lld/trunk/test/core/gnulinkonce-rearrange-resolve.objtxt
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/core/gnulinkonce-rearrange-resolve.objtxt?rev=205163&view=auto
>
> ==============================================================================
> --- lld/trunk/test/core/gnulinkonce-rearrange-resolve.objtxt (added)
> +++ lld/trunk/test/core/gnulinkonce-rearrange-resolve.objtxt Sun Mar 30
> 22:16:37 2014
> @@ -0,0 +1,115 @@
> +# RUN: lld -core %s | FileCheck %s
> +
> +#
> +# Test that gnu linkonce sections are parsed and the first section
> selected for symbol
> +# resolution
> +#
> +
> +---
> +defined-atoms:
> + - name: g1
> + scope: global
> + type: gnu-linkonce
> + references:
> + - kind: group-child
> + target: f1
> + - kind: group-child
> + target: f2
> + - kind: group-child
> + target: g1
> + - kind: group-child
> + target: d1
> + - name: f1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: f2
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: d1
> + scope: global
> + type: data
> + references:
> + - kind: group-parent
> + target: g1
> +---
> +defined-atoms:
> + - name: g1
> + scope: global
> + type: gnu-linkonce
> + references:
> + - kind: group-child
> + target: f1
> + - kind: group-child
> + target: f2
> + - kind: group-child
> + target: g1
> + - kind: group-child
> + target: d1
> + - name: f1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: f2
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: d1
> + scope: global
> + type: data
> + references:
> + - kind: group-parent
> + target: g1
> +...
> +
> +# CHECK: defined-atoms:
> +# CHECK: - name: g1
> +# CHECK: ref-name: [[PARENT:[a-zA-Z\.0-9_]+]]
> +# CHECK: type: gnu-linkonce
> +# CHECK: references:
> +# CHECK: - kind: group-child
> +# CHECK: target: f1
> +# CHECK: - kind: group-child
> +# CHECK: target: f2
> +# CHECK: - kind: group-child
> +# CHECK: target: [[CHILD:[a-zA-Z\.0-9_]+]]
> +# CHECK: - kind: group-child
> +# CHECK: target: d1
> +# CHECK: - name: f1
> +# CHECK: references:
> +# CHECK: - kind: group-parent
> +# CHECK: target: [[PARENT]]
> +# CHECK: - name: f2
> +# CHECK: references:
> +# CHECK: - kind: group-parent
> +# CHECK: target: [[PARENT]]
> +# CHECK: - name: g1
> +# CHECK: ref-name: [[CHILD]]
> +# CHECK: references:
> +# CHECK: - kind: group-parent
> +# CHECK: target: [[PARENT]]
> +# CHECK: - name: d1
> +# CHECK: references:
> +# CHECK: - kind: group-parent
> +# CHECK: target: [[PARENT]]
>
> Added: lld/trunk/test/core/gnulinkonce-remaining-undef.objtxt
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/core/gnulinkonce-remaining-undef.objtxt?rev=205163&view=auto
>
> ==============================================================================
> --- lld/trunk/test/core/gnulinkonce-remaining-undef.objtxt (added)
> +++ lld/trunk/test/core/gnulinkonce-remaining-undef.objtxt Sun Mar 30
> 22:16:37 2014
> @@ -0,0 +1,113 @@
> +# RUN: lld -core %s | FileCheck %s
> +
> +#
> +# Test that gnu linkonce sections are parsed and the first section
> selected for
> +# symbol resolution. The second file which has the same gnu linkonce
> section has
> +# a unresolved undefined symbol. lets make sure that the symbol is kept
> around
> +# in the final link and remains undefined.
> +#
> +
> +---
> +defined-atoms:
> + - name: f1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: f2
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: d1
> + scope: global
> + type: data
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: gnu-linkonce
> + references:
> + - kind: group-child
> + target: f1
> + - kind: group-child
> + target: f2
> + - kind: group-child
> + target: g1
> + - kind: group-child
> + target: d1
> +---
> +defined-atoms:
> + - name: anotherfunction
> + scope: global
> + type: data
> + references:
> + - kind: layout-before
> + target: f3
> + - name: f1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: f2
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: f3
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: d1
> + scope: global
> + type: data
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: gnu-linkonce
> + references:
> + - kind: group-child
> + target: f1
> + - kind: group-child
> + target: f2
> + - kind: group-child
> + target: f3
> + - kind: group-child
> + target: g1
> + - kind: group-child
> + target: d1
> +undefined-atoms:
> + - name: f3
> + can-be-null: never
> +...
> +
> +#CHECK: - name: anotherfunction
> +#CHECK: scope: global
> +#CHECK: type: data
> +#CHECK: references:
> +#CHECK: - kind: layout-before
> +#CHECK: offset: 0
> +#CHECK: target: f3
> +#CHECK: undefined-atoms:
> +#CHECK: - name: f3
>
> Added: lld/trunk/test/core/gnulinkonce-resolve.objtxt
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/core/gnulinkonce-resolve.objtxt?rev=205163&view=auto
>
> ==============================================================================
> --- lld/trunk/test/core/gnulinkonce-resolve.objtxt (added)
> +++ lld/trunk/test/core/gnulinkonce-resolve.objtxt Sun Mar 30 22:16:37 2014
> @@ -0,0 +1,133 @@
> +# RUN: lld -core %s | FileCheck %s
> +
> +#
> +# Test that gnu linkonce sections are parsed and the first section
> selected for symbol
> +# resolution
> +#
> +
> +---
> +defined-atoms:
> + - name: f1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: f2
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: d1
> + scope: global
> + type: data
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: gnu-linkonce
> + references:
> + - kind: group-child
> + target: f1
> + - kind: group-child
> + target: f2
> + - kind: group-child
> + target: g1
> + - kind: group-child
> + target: d1
> +---
> +defined-atoms:
> + - name: f1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: f2
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: d1
> + scope: global
> + type: data
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: gnu-linkonce
> + references:
> + - kind: group-child
> + target: f1
> + - kind: group-child
> + target: f2
> + - kind: group-child
> + target: g1
> + - kind: group-child
> + target: d1
> +...
> +
> +#CHECK: defined-atoms:
> +#CHECK: - name: g1
> +#CHECK: ref-name: [[PARENT:[a-zA-Z\.0-9_]+]]
> +#CHECK: scope: global
> +#CHECK: type: gnu-linkonce
> +#CHECK: references:
> +#CHECK: - kind: group-child
> +#CHECK: offset: 0
> +#CHECK: target: [[GCHILDONE:[a-zA-Z\.0-9_]+]]
> +#CHECK: - kind: group-child
> +#CHECK: offset: 0
> +#CHECK: target: [[GCHILDTWO:[a-zA-Z\.0-9_]+]]
> +#CHECK: - kind: group-child
> +#CHECK: offset: 0
> +#CHECK: target: [[GCHILDTHREE:[a-zA-Z\.0-9_]+]]
> +#CHECK: - kind: group-child
> +#CHECK: offset: 0
> +#CHECK: target: [[GCHILDFOUR:[a-zA-Z\.0-9_]+]]
> +#CHECK: - name: f1
> +#CHECK: ref-name: [[GCHILDONE]]
> +#CHECK: scope: global
> +#CHECK: references:
> +#CHECK: - kind: group-parent
> +#CHECK: offset: 0
> +#CHECK: target: [[PARENT]]
> +#CHECK: - name: f2
> +#CHECK: ref-name: [[GCHILDTWO]]
> +#CHECK: scope: global
> +#CHECK: references:
> +#CHECK: - kind: group-parent
> +#CHECK: offset: 0
> +#CHECK: target: [[PARENT]]
> +#CHECK: - name: g1
> +#CHECK: ref-name: [[GCHILDTHREE]]
> +#CHECK: scope: global
> +#CHECK: references:
> +#CHECK: - kind: group-parent
> +#CHECK: offset: 0
> +#CHECK: target: [[PARENT]]
> +#CHECK: - name: d1
> +#CHECK: ref-name: [[GCHILDFOUR]]
> +#CHECK: scope: global
> +#CHECK: type: data
> +#CHECK: references:
> +#CHECK: - kind: group-parent
> +#CHECK: offset: 0
> +#CHECK: target: [[PARENT]]
> +#CHECK: ...
>
> Added: lld/trunk/test/core/gnulinkonce-simple.objtxt
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/core/gnulinkonce-simple.objtxt?rev=205163&view=auto
>
> ==============================================================================
> --- lld/trunk/test/core/gnulinkonce-simple.objtxt (added)
> +++ lld/trunk/test/core/gnulinkonce-simple.objtxt Sun Mar 30 22:16:37 2014
> @@ -0,0 +1,112 @@
> +# RUN: lld -core %s | FileCheck %s
> +
> +#
> +# Test that gnu linkonce sections are parsed properly when there is a
> reference to a
> +# atom from outside the gnu linkonce section.
> +#
> +
> +---
> +defined-atoms:
> + - name: f1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: f2
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: d1
> + scope: global
> + type: data
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: gnu-linkonce
> + references:
> + - kind: group-child
> + target: f1
> + - kind: group-child
> + target: f2
> + - kind: group-child
> + target: d1
> + - kind: group-child
> + target: g1
> + - name: anotherfunction
> + scope: global
> + type: data
> + references:
> + - kind: layout-before
> + target: f1
> +
> +undefined-atoms:
> + - name: f1
> + can-be-null: never
> +...
> +
> +#CHECK: defined-atoms:
> +#CHECK: - name: g1
> +#CHECK: ref-name: [[PARENT:[a-zA-Z\.0-9_]+]]
> +#CHECK: scope: global
> +#CHECK: type: gnu-linkonce
> +#CHECK: references:
> +#CHECK: - kind: group-child
> +#CHECK: offset: 0
> +#CHECK: target: [[GCHILDONE:[a-zA-Z\.0-9_]+]]
> +#CHECK: - kind: group-child
> +#CHECK: offset: 0
> +#CHECK: target: [[GCHILDTWO:[a-zA-Z\.0-9_]+]]
> +#CHECK: - kind: group-child
> +#CHECK: offset: 0
> +#CHECK: target: [[GCHILDTHREE:[a-zA-Z\.0-9_]+]]
> +#CHECK: - kind: group-child
> +#CHECK: offset: 0
> +#CHECK: target: [[GCHILDFOUR:[a-zA-Z\.0-9_]+]]
> +#CHECK: - name: f1
> +#CHECK: ref-name: [[GCHILDONE]]
> +#CHECK: scope: global
> +#CHECK: references:
> +#CHECK: - kind: group-parent
> +#CHECK: offset: 0
> +#CHECK: target: [[PARENT]]
> +#CHECK: - name: f2
> +#CHECK: ref-name: [[GCHILDTWO]]
> +#CHECK: scope: global
> +#CHECK: references:
> +#CHECK: - kind: group-parent
> +#CHECK: offset: 0
> +#CHECK: target: [[PARENT]]
> +#CHECK: - name: d1
> +#CHECK: ref-name: [[GCHILDTHREE]]
> +#CHECK: scope: global
> +#CHECK: type: data
> +#CHECK: references:
> +#CHECK: - kind: group-parent
> +#CHECK: offset: 0
> +#CHECK: target: [[PARENT]]
> +#CHECK: - name: g1
> +#CHECK: ref-name: [[GCHILDFOUR]]
> +#CHECK: scope: global
> +#CHECK: references:
> +#CHECK: - kind: group-parent
> +#CHECK: offset: 0
> +#CHECK: target: [[PARENT]]
> +#CHECK: - name: anotherfunction
> +#CHECK: scope: global
> +#CHECK: type: data
> +#CHECK: references:
> +#CHECK: - kind: layout-before
> +#CHECK: offset: 0
> +#CHECK: target: [[GCHILDONE]]
> +#CHECK: ...
>
> Added: lld/trunk/test/core/sectiongroup-gnulinkonce-error.objtxt
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/core/sectiongroup-gnulinkonce-error.objtxt?rev=205163&view=auto
>
> ==============================================================================
> --- lld/trunk/test/core/sectiongroup-gnulinkonce-error.objtxt (added)
> +++ lld/trunk/test/core/sectiongroup-gnulinkonce-error.objtxt Sun Mar 30
> 22:16:37 2014
> @@ -0,0 +1,88 @@
> +# RUN: not lld -core %s 2>&1 | FileCheck %s
> +
> +#
> +# Test that section groups/gnu linkonce sections are parsed and a merge
> error
> +# is displayed at the time of symbol resolution.
> +#
> +
> +---
> +defined-atoms:
> + - name: f1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: f2
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: d1
> + scope: global
> + type: data
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: group-comdat
> + references:
> + - kind: group-child
> + target: f1
> + - kind: group-child
> + target: f2
> + - kind: group-child
> + target: g1
> + - kind: group-child
> + target: d1
> +---
> +defined-atoms:
> + - name: f1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: f2
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: code
> + references:
> + - kind: group-parent
> + target: g1
> + - name: d1
> + scope: global
> + type: data
> + references:
> + - kind: group-parent
> + target: g1
> + - name: g1
> + scope: global
> + type: gnu-linkonce
> + references:
> + - kind: group-child
> + target: f1
> + - kind: group-child
> + target: f2
> + - kind: group-child
> + target: g1
> + - kind: group-child
> + target: d1
> +...
> +
> +#CHECK: SymbolTable: error while merging g1
> +#CHECK: LLVM ERROR: duplicate symbol error
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140330/42acfc3c/attachment.html>
More information about the llvm-commits
mailing list