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