<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>