New issue
Advanced search Search tips

Issue 599980 link

Starred by 1 user

Issue metadata

Status: Fixed
Owner:
Closed: Dec 2016
Cc:
EstimatedDays: ----
NextAction: ----
OS: iOS , Mac
Pri: 2
Type: Bug



Sign in to add a comment

Different behaviour between clang ToT and Xcode with __attribute((ns_consumed))

Project Member Reported by sdefresne@chromium.org, Apr 1 2016

Issue description

So I reproduced and minimised the linking error I got when building with __attribute((ns_consumed)).

The reason you could not reproduce locally was because the error only happens with ToT clang and not with Xcode clang. To reproduce, you can unzip the attached archive and you'll see that the compilation with ToT clang fails with the following linking error:

Undefined symbols for architecture x86_64:
  "i::t::t(objc_object* ns_consumed)", referenced from:
      t<NSObject* __strong>::t(NSObject* ns_consumed) in m.o

In fact, we can see that the method has a different signature when built with ARC (m.o) or not (t.o):

$ nm ToT/t.o|c++filt|grep 'i::t::t('
0000000000000020 T i::t::t(objc_object*)
0000000000000000 T i::t::t(objc_object*)
[sdefresne@sdefresne-macbookpro] [~/Developer/upstream/src/repro] (ios-arc)
$ nm ToT/m.o|c++filt|grep 'i::t::t('
                 U i::t::t(objc_object* ns_consumed)


 
ns_consumed.zip
1.4 KB Download
Cc: stkhapugin@chromium.org
This is still the case with clang version 3.9.0 (trunk 266294).
It looks like the ns_consumed annotation was supposed to be part of the mangled name but was not due to a bug fixed with revision 262278:

$ svn log -r 262278
------------------------------------------------------------------------
r262278 | rjmccall | 2016-03-01 01:49:02 +0100 (Tue, 01 Mar 2016) | 5 lines

Generalize the consumed-parameter array on FunctionProtoType
to allow arbitrary data to be associated with a parameter.

Also, fix a bug where we apparently haven't been serializing
this information for the last N years.
------------------------------------------------------------------------

However, the code adding the annotation to the parameter is gated behind a check for LangOpts.ObjCAutoRefCount, which cause the link failure. I think this test is incorrect, and the following patch do fix the link failure:

$ svn diff 
Index: lib/Sema/SemaType.cpp
===================================================================
--- lib/Sema/SemaType.cpp	(revision 268373)
+++ lib/Sema/SemaType.cpp	(working copy)
@@ -4222,7 +4222,7 @@
             }
           }
 
-          if (LangOpts.ObjCAutoRefCount && Param->hasAttr<NSConsumedAttr>()) {
+          if (Param->hasAttr<NSConsumedAttr>()) {
             ExtParameterInfos[i] = ExtParameterInfos[i].withIsConsumed(true);
             HasAnyInterestingExtParameterInfos = true;
           }

With it, the example links on my machine, the code generated does not change (i.e. ns_consumed is still correctly used) and all tests of clang do pass (at least the tests that are run when I use "LLVM_FORCE_HEAD_REVISION=1 tools/clang/scripts/update.py --run-tests" in a Chromium checkout).

thakis: how should I go to get this patch in clang repository? Should I create a bug there and propose my CL to fix it? Or can you take care of it?
Cc: thakis@chromium.org
Owner: sdefresne@chromium.org
Status: Started (was: Assigned)
Sent upstream change set http://reviews.llvm.org/D20113.
Found another problem with ns_consumed. It appears that the codegen is incorrect for constructors (possibly other methods too) were it insert a superfluous objc_release without a corresponding obcj_retain.

Reported as https://llvm.org/bugs/show_bug.cgi?id=27887.
Status: Fixed (was: Started)
External dependency fixed. Will need to wait till next version of Xcode (probably during 2017Q3).

Sign in to add a comment