r223455 - Driver: Objective-C should respect -fno-exceptions

Nico Weber thakis at chromium.org
Fri Dec 5 12:37:17 PST 2014


On Fri, Dec 5, 2014 at 11:55 AM, David Majnemer <david.majnemer at gmail.com>
wrote:

>
>
> On Fri, Dec 5, 2014 at 11:47 AM, Nico Weber <thakis at chromium.org> wrote:
>
>> On Fri, Dec 5, 2014 at 11:41 AM, David Majnemer <david.majnemer at gmail.com
>> > wrote:
>>
>>>
>>>
>>> On Fri, Dec 5, 2014 at 11:25 AM, Nico Weber <thakis at chromium.org> wrote:
>>>
>>>> On Fri, Dec 5, 2014 at 12:56 AM, David Majnemer <
>>>> david.majnemer at gmail.com> wrote:
>>>>
>>>>> Author: majnemer
>>>>> Date: Fri Dec  5 02:56:55 2014
>>>>> New Revision: 223455
>>>>>
>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=223455&view=rev
>>>>> Log:
>>>>> Driver: Objective-C should respect -fno-exceptions
>>>>>
>>>>> Clang attempted to replicate a GCC bug: -fobjc-exceptions forces
>>>>> -fexceptions to be enabled.  However, this has unintended effects and
>>>>> other awkard side effects that Clang doesn't "correctly" ape (e.g. it's
>>>>> impossible to turn off C++ exceptions in ObjC++ mode
>>>>
>>>>
>>>> What does "impossible to turn off exceptions" mean here?
>>>>
>>>> $ clang -c test.mm -fno-exceptions
>>>> test.mm:2:3: error: cannot use 'try' with exceptions disabled
>>>>   try {} catch (...) {}
>>>>   ^
>>>> 1 error generated.
>>>>
>>>
>>> You should try that with GCC, not clang :)
>>>
>>>
>>>>
>>>> ).
>>>>>
>>>>> Instead, -f[no]objc-exceptions and -f[no]cxx-exceptions now have an
>>>>> identical relationship with -f[no]exceptions.
>>>>>
>>>>
>>>> Did anyone from Apple review this? I thought the intention was that
>>>> -fno-exceptions disables c++ exceptions but keeps objc exceptions enabled,
>>>> since a) many people don't want c++ exceptions so they use -fno-exceptions
>>>> but b) cocoa uses exceptions so you can't really build without objc
>>>> exceptions.
>>>>
>>>> (I'm guessing I'm misunderstanding the patch somehow.)
>>>>
>>>
>>> The original code was trying to mimic GCC's behavior where
>>> -fobjc-exceptions _ignores_ -fno-exceptions.
>>> In GCC, this means that ObjC++ code cannot _ever_ opt out of C++
>>> exceptions because they don't have a -fcxx-exceptions, they just have
>>> -fexceptions.  Clang has a different dichotomy of exception
>>> enabling/disabling flags and it doesn't make sense to copy GCC's arbitrary
>>> behavior.
>>>
>>> If you want Objective-C exceptions but not C++ exceptions,
>>> -fobjc-exceptions -fno-cxx-exceptions should do the trick.
>>>
>>
>> I'm somewhat sure that when these flags got added they were explicitly
>> put in a state where -fno-exceptions disables c++ exceptions but not objc
>> exceptions, for the reason I mentioned above. I don't remember anything
>> about gcc compatibility.
>>
>
>
> http://llvm.org/klaus/clang/commit/d47ea693706f7b0ffa68e879b73a71609a337786/
>
> "Be compatible with GCC behavior in that -fno-exceptions *does not*
> disable Obj-C exceptions."
> "This is not necessarily sensible, but follows GCC."
>
>
>>
>> Most software doesn't use Objective-C, and when folks say -fno-exceptions
>> they mean "no c++ exceptions".
>>
>
> Sure, but that's not what -fno-exceptions does in GCC.
>
> In C, it disables -fexceptions; this will ensure that calls to
> __gcc_personality_v0 will not occur.  It also changes the behavior of
> __attribute__((cleanup)).
> In Objective C, it does nothing.
> In C++, it disables -fexceptions; this will ensure that calls to
> __gxx_personality_v0 will not occur. It makes it illegal to mention 'try'
> and 'catch'.
> In Objective C++, it does nothing.
>

What gcc does for Objective-C nowadays doesn't matter much, almost everyone
building Objective-C code uses clang. The gcc behavior is nonsensical,
clang's previous behavior wasn't.

This commit changes behavior fairly severely, without much of a motivation
from what I understand.

I think clang's previous behavior makes a lot of sense: You have
-fno-exceptions in all your build files, and you want that to disable c++
exceptions on linux. You want the same flag mean the same thing on OS X in
.mm files. If you're writing regular mac apps, you can't realistically
disable objc exceptions as some framework apis use them.

Having said that, from what I can tell this commit doesn't help with what I
think it was supposed to help with:

$ ~/src/llvm-build/bin/clang -fno-exceptions -fobjc-exceptions
-fno-cxx-exceptions -E -dM -x objective-c++ /dev/null | grep EXCEP
#define OBJC_ZEROCOST_EXCEPTIONS 1
#define __EXCEPTIONS 1


>
>>
>>
>>>
>>>
>>>>
>>>>>
>>>>> Added:
>>>>>     cfe/trunk/test/Driver/exceptions.mm
>>>>> Removed:
>>>>>     cfe/trunk/test/Driver/exceptions.m
>>>>> Modified:
>>>>>     cfe/trunk/lib/Driver/Tools.cpp
>>>>>     cfe/trunk/test/Driver/rewrite-legacy-objc.m
>>>>>
>>>>> Modified: cfe/trunk/lib/Driver/Tools.cpp
>>>>> URL:
>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=223455&r1=223454&r2=223455&view=diff
>>>>>
>>>>> ==============================================================================
>>>>> --- cfe/trunk/lib/Driver/Tools.cpp (original)
>>>>> +++ cfe/trunk/lib/Driver/Tools.cpp Fri Dec  5 02:56:55 2014
>>>>> @@ -1894,23 +1894,6 @@ static void getTargetFeatures(const Driv
>>>>>    }
>>>>>  }
>>>>>
>>>>> -static bool
>>>>> -shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
>>>>> -                                          const llvm::Triple &Triple)
>>>>> {
>>>>> -  // We use the zero-cost exception tables for Objective-C if the
>>>>> non-fragile
>>>>> -  // ABI is enabled or when compiling for x86_64 and ARM on Snow
>>>>> Leopard and
>>>>> -  // later.
>>>>> -  if (runtime.isNonFragile())
>>>>> -    return true;
>>>>> -
>>>>> -  if (!Triple.isMacOSX())
>>>>> -    return false;
>>>>> -
>>>>> -  return (!Triple.isMacOSXVersionLT(10,5) &&
>>>>> -          (Triple.getArch() == llvm::Triple::x86_64 ||
>>>>> -           Triple.getArch() == llvm::Triple::arm));
>>>>> -}
>>>>> -
>>>>>  // exceptionSettings() exists to share the logic between -cc1 and
>>>>> linker
>>>>>  // invocations.
>>>>>  static bool exceptionSettings(const ArgList &Args, const llvm::Triple
>>>>> &Triple) {
>>>>> @@ -1947,15 +1930,21 @@ static void addExceptionArgs(const ArgLi
>>>>>    // Gather the exception settings from the command line arguments.
>>>>>    bool EH = exceptionSettings(Args, Triple);
>>>>>
>>>>> -  // Obj-C exceptions are enabled by default, regardless of
>>>>> -fexceptions. This
>>>>> -  // is not necessarily sensible, but follows GCC.
>>>>> -  if (types::isObjC(InputType) &&
>>>>> -      Args.hasFlag(options::OPT_fobjc_exceptions,
>>>>> -                   options::OPT_fno_objc_exceptions,
>>>>> -                   true)) {
>>>>> -    CmdArgs.push_back("-fobjc-exceptions");
>>>>> +  if (types::isObjC(InputType)) {
>>>>> +    bool ObjCExceptionsEnabled = true;
>>>>> +    if (Arg *A = Args.getLastArg(options::OPT_fobjc_exceptions,
>>>>> +                                 options::OPT_fno_objc_exceptions,
>>>>> +                                 options::OPT_fexceptions,
>>>>> +                                 options::OPT_fno_exceptions))
>>>>> +      ObjCExceptionsEnabled =
>>>>> +          A->getOption().matches(options::OPT_fobjc_exceptions) ||
>>>>> +          A->getOption().matches(options::OPT_fexceptions);
>>>>> +
>>>>> +    if (ObjCExceptionsEnabled) {
>>>>> +      CmdArgs.push_back("-fobjc-exceptions");
>>>>>
>>>>> -    EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime,
>>>>> Triple);
>>>>> +      EH = true;
>>>>> +    }
>>>>>    }
>>>>>
>>>>>    if (types::isCXX(InputType)) {
>>>>>
>>>>> Removed: cfe/trunk/test/Driver/exceptions.m
>>>>> URL:
>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/exceptions.m?rev=223454&view=auto
>>>>>
>>>>> ==============================================================================
>>>>> --- cfe/trunk/test/Driver/exceptions.m (original)
>>>>> +++ cfe/trunk/test/Driver/exceptions.m (removed)
>>>>> @@ -1,19 +0,0 @@
>>>>> -// RUN: %clang -target x86_64-apple-darwin9 \
>>>>> -// RUN:   -fsyntax-only -fno-exceptions %s
>>>>> -
>>>>> -void f1() {
>>>>> -  @throw @"A";
>>>>> -}
>>>>> -
>>>>> -void f0() {
>>>>> -  @try {
>>>>> -    f1();
>>>>> -  } @catch (id x) {
>>>>> -    ;
>>>>> -  }
>>>>> -}
>>>>> -
>>>>> -int main() {
>>>>> -  f0();
>>>>> -  return 0;
>>>>> -}
>>>>>
>>>>> Added: cfe/trunk/test/Driver/exceptions.mm
>>>>> URL:
>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/exceptions.mm?rev=223455&view=auto
>>>>>
>>>>> ==============================================================================
>>>>> --- cfe/trunk/test/Driver/exceptions.mm (added)
>>>>> +++ cfe/trunk/test/Driver/exceptions.mm Fri Dec  5 02:56:55 2014
>>>>> @@ -0,0 +1,6 @@
>>>>> +// RUN: %clang -target x86_64-apple-darwin11 -fno-exceptions %s -o -
>>>>> -### 2>&1 | \
>>>>> +// RUN:   FileCheck %s
>>>>> +
>>>>> +CHECK-NOT: "-fobjc-exceptions"
>>>>> +CHECK-NOT: "-fcxx-exceptions"
>>>>> +CHECK-NOT: "-fexceptions"
>>>>>
>>>>> Modified: cfe/trunk/test/Driver/rewrite-legacy-objc.m
>>>>> URL:
>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/rewrite-legacy-objc.m?rev=223455&r1=223454&r2=223455&view=diff
>>>>>
>>>>> ==============================================================================
>>>>> --- cfe/trunk/test/Driver/rewrite-legacy-objc.m (original)
>>>>> +++ cfe/trunk/test/Driver/rewrite-legacy-objc.m Fri Dec  5 02:56:55
>>>>> 2014
>>>>> @@ -9,5 +9,5 @@
>>>>>  // RUN:   FileCheck -check-prefix=TEST1 %s
>>>>>  // RUN: %clang -no-canonical-prefixes -target i386-apple-macosx10.6.0
>>>>> -rewrite-legacy-objc %s -o - -### 2>&1 | \
>>>>>  // RUN:   FileCheck -check-prefix=TEST2 %s
>>>>> -// TEST1: "-fmessage-length" "0" "-stack-protector" "1"
>>>>> "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-fragile"
>>>>> "-fobjc-subscripting-legacy-runtime" "-fencode-extended-block-signature"
>>>>> "-fno-objc-infer-related-result-type" "-fobjc-exceptions"
>>>>> "-fmax-type-align=16" "-fdiagnostics-show-option"
>>>>> -// TEST2: "-fmessage-length" "0" "-stack-protector" "1"
>>>>> "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-fragile"
>>>>> "-fencode-extended-block-signature" "-fno-objc-infer-related-result-type"
>>>>> "-fobjc-exceptions" "-fmax-type-align=16" "-fdiagnostics-show-option"
>>>>> +// TEST1: "-fmessage-length" "0" "-stack-protector" "1"
>>>>> "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-fragile"
>>>>> "-fobjc-subscripting-legacy-runtime" "-fencode-extended-block-signature"
>>>>> "-fno-objc-infer-related-result-type" "-fobjc-exceptions" "-fexceptions"
>>>>> "-fmax-type-align=16" "-fdiagnostics-show-option"
>>>>> +// TEST2: "-fmessage-length" "0" "-stack-protector" "1"
>>>>> "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-fragile"
>>>>> "-fencode-extended-block-signature" "-fno-objc-infer-related-result-type"
>>>>> "-fobjc-exceptions" "-fexceptions" "-fmax-type-align=16"
>>>>> "-fdiagnostics-show-option"
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> cfe-commits mailing list
>>>>> cfe-commits at cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>>>
>>>>
>>>>
>>>
>>> On Fri, Dec 5, 2014 at 11:25 AM, Nico Weber <thakis at chromium.org> wrote:
>>>
>>>> On Fri, Dec 5, 2014 at 12:56 AM, David Majnemer <
>>>> david.majnemer at gmail.com> wrote:
>>>>
>>>>> Author: majnemer
>>>>> Date: Fri Dec  5 02:56:55 2014
>>>>> New Revision: 223455
>>>>>
>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=223455&view=rev
>>>>> Log:
>>>>> Driver: Objective-C should respect -fno-exceptions
>>>>>
>>>>> Clang attempted to replicate a GCC bug: -fobjc-exceptions forces
>>>>> -fexceptions to be enabled.  However, this has unintended effects and
>>>>> other awkard side effects that Clang doesn't "correctly" ape (e.g. it's
>>>>> impossible to turn off C++ exceptions in ObjC++ mode
>>>>
>>>>
>>>> What does "impossible to turn off exceptions" mean here?
>>>>
>>>> $ clang -c test.mm -fno-exceptions
>>>> test.mm:2:3: error: cannot use 'try' with exceptions disabled
>>>>   try {} catch (...) {}
>>>>   ^
>>>> 1 error generated.
>>>>
>>>> ).
>>>>>
>>>>> Instead, -f[no]objc-exceptions and -f[no]cxx-exceptions now have an
>>>>> identical relationship with -f[no]exceptions.
>>>>>
>>>>
>>>> Did anyone from Apple review this? I thought the intention was that
>>>> -fno-exceptions disables c++ exceptions but keeps objc exceptions enabled,
>>>> since a) many people don't want c++ exceptions so they use -fno-exceptions
>>>> but b) cocoa uses exceptions so you can't really build without objc
>>>> exceptions.
>>>>
>>>> (I'm guessing I'm misunderstanding the patch somehow.)
>>>>
>>>>
>>>>>
>>>>> Added:
>>>>>     cfe/trunk/test/Driver/exceptions.mm
>>>>> Removed:
>>>>>     cfe/trunk/test/Driver/exceptions.m
>>>>> Modified:
>>>>>     cfe/trunk/lib/Driver/Tools.cpp
>>>>>     cfe/trunk/test/Driver/rewrite-legacy-objc.m
>>>>>
>>>>> Modified: cfe/trunk/lib/Driver/Tools.cpp
>>>>> URL:
>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=223455&r1=223454&r2=223455&view=diff
>>>>>
>>>>> ==============================================================================
>>>>> --- cfe/trunk/lib/Driver/Tools.cpp (original)
>>>>> +++ cfe/trunk/lib/Driver/Tools.cpp Fri Dec  5 02:56:55 2014
>>>>> @@ -1894,23 +1894,6 @@ static void getTargetFeatures(const Driv
>>>>>    }
>>>>>  }
>>>>>
>>>>> -static bool
>>>>> -shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
>>>>> -                                          const llvm::Triple &Triple)
>>>>> {
>>>>> -  // We use the zero-cost exception tables for Objective-C if the
>>>>> non-fragile
>>>>> -  // ABI is enabled or when compiling for x86_64 and ARM on Snow
>>>>> Leopard and
>>>>> -  // later.
>>>>> -  if (runtime.isNonFragile())
>>>>> -    return true;
>>>>> -
>>>>> -  if (!Triple.isMacOSX())
>>>>> -    return false;
>>>>> -
>>>>> -  return (!Triple.isMacOSXVersionLT(10,5) &&
>>>>> -          (Triple.getArch() == llvm::Triple::x86_64 ||
>>>>> -           Triple.getArch() == llvm::Triple::arm));
>>>>> -}
>>>>> -
>>>>>  // exceptionSettings() exists to share the logic between -cc1 and
>>>>> linker
>>>>>  // invocations.
>>>>>  static bool exceptionSettings(const ArgList &Args, const llvm::Triple
>>>>> &Triple) {
>>>>> @@ -1947,15 +1930,21 @@ static void addExceptionArgs(const ArgLi
>>>>>    // Gather the exception settings from the command line arguments.
>>>>>    bool EH = exceptionSettings(Args, Triple);
>>>>>
>>>>> -  // Obj-C exceptions are enabled by default, regardless of
>>>>> -fexceptions. This
>>>>> -  // is not necessarily sensible, but follows GCC.
>>>>> -  if (types::isObjC(InputType) &&
>>>>> -      Args.hasFlag(options::OPT_fobjc_exceptions,
>>>>> -                   options::OPT_fno_objc_exceptions,
>>>>> -                   true)) {
>>>>> -    CmdArgs.push_back("-fobjc-exceptions");
>>>>> +  if (types::isObjC(InputType)) {
>>>>> +    bool ObjCExceptionsEnabled = true;
>>>>> +    if (Arg *A = Args.getLastArg(options::OPT_fobjc_exceptions,
>>>>> +                                 options::OPT_fno_objc_exceptions,
>>>>> +                                 options::OPT_fexceptions,
>>>>> +                                 options::OPT_fno_exceptions))
>>>>> +      ObjCExceptionsEnabled =
>>>>> +          A->getOption().matches(options::OPT_fobjc_exceptions) ||
>>>>> +          A->getOption().matches(options::OPT_fexceptions);
>>>>> +
>>>>> +    if (ObjCExceptionsEnabled) {
>>>>> +      CmdArgs.push_back("-fobjc-exceptions");
>>>>>
>>>>> -    EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime,
>>>>> Triple);
>>>>> +      EH = true;
>>>>> +    }
>>>>>    }
>>>>>
>>>>>    if (types::isCXX(InputType)) {
>>>>>
>>>>> Removed: cfe/trunk/test/Driver/exceptions.m
>>>>> URL:
>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/exceptions.m?rev=223454&view=auto
>>>>>
>>>>> ==============================================================================
>>>>> --- cfe/trunk/test/Driver/exceptions.m (original)
>>>>> +++ cfe/trunk/test/Driver/exceptions.m (removed)
>>>>> @@ -1,19 +0,0 @@
>>>>> -// RUN: %clang -target x86_64-apple-darwin9 \
>>>>> -// RUN:   -fsyntax-only -fno-exceptions %s
>>>>> -
>>>>> -void f1() {
>>>>> -  @throw @"A";
>>>>> -}
>>>>> -
>>>>> -void f0() {
>>>>> -  @try {
>>>>> -    f1();
>>>>> -  } @catch (id x) {
>>>>> -    ;
>>>>> -  }
>>>>> -}
>>>>> -
>>>>> -int main() {
>>>>> -  f0();
>>>>> -  return 0;
>>>>> -}
>>>>>
>>>>> Added: cfe/trunk/test/Driver/exceptions.mm
>>>>> URL:
>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/exceptions.mm?rev=223455&view=auto
>>>>>
>>>>> ==============================================================================
>>>>> --- cfe/trunk/test/Driver/exceptions.mm (added)
>>>>> +++ cfe/trunk/test/Driver/exceptions.mm Fri Dec  5 02:56:55 2014
>>>>> @@ -0,0 +1,6 @@
>>>>> +// RUN: %clang -target x86_64-apple-darwin11 -fno-exceptions %s -o -
>>>>> -### 2>&1 | \
>>>>> +// RUN:   FileCheck %s
>>>>> +
>>>>> +CHECK-NOT: "-fobjc-exceptions"
>>>>> +CHECK-NOT: "-fcxx-exceptions"
>>>>> +CHECK-NOT: "-fexceptions"
>>>>>
>>>>> Modified: cfe/trunk/test/Driver/rewrite-legacy-objc.m
>>>>> URL:
>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/rewrite-legacy-objc.m?rev=223455&r1=223454&r2=223455&view=diff
>>>>>
>>>>> ==============================================================================
>>>>> --- cfe/trunk/test/Driver/rewrite-legacy-objc.m (original)
>>>>> +++ cfe/trunk/test/Driver/rewrite-legacy-objc.m Fri Dec  5 02:56:55
>>>>> 2014
>>>>> @@ -9,5 +9,5 @@
>>>>>  // RUN:   FileCheck -check-prefix=TEST1 %s
>>>>>  // RUN: %clang -no-canonical-prefixes -target i386-apple-macosx10.6.0
>>>>> -rewrite-legacy-objc %s -o - -### 2>&1 | \
>>>>>  // RUN:   FileCheck -check-prefix=TEST2 %s
>>>>> -// TEST1: "-fmessage-length" "0" "-stack-protector" "1"
>>>>> "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-fragile"
>>>>> "-fobjc-subscripting-legacy-runtime" "-fencode-extended-block-signature"
>>>>> "-fno-objc-infer-related-result-type" "-fobjc-exceptions"
>>>>> "-fmax-type-align=16" "-fdiagnostics-show-option"
>>>>> -// TEST2: "-fmessage-length" "0" "-stack-protector" "1"
>>>>> "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-fragile"
>>>>> "-fencode-extended-block-signature" "-fno-objc-infer-related-result-type"
>>>>> "-fobjc-exceptions" "-fmax-type-align=16" "-fdiagnostics-show-option"
>>>>> +// TEST1: "-fmessage-length" "0" "-stack-protector" "1"
>>>>> "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-fragile"
>>>>> "-fobjc-subscripting-legacy-runtime" "-fencode-extended-block-signature"
>>>>> "-fno-objc-infer-related-result-type" "-fobjc-exceptions" "-fexceptions"
>>>>> "-fmax-type-align=16" "-fdiagnostics-show-option"
>>>>> +// TEST2: "-fmessage-length" "0" "-stack-protector" "1"
>>>>> "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-fragile"
>>>>> "-fencode-extended-block-signature" "-fno-objc-infer-related-result-type"
>>>>> "-fobjc-exceptions" "-fexceptions" "-fmax-type-align=16"
>>>>> "-fdiagnostics-show-option"
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> cfe-commits mailing list
>>>>> cfe-commits at cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>>>
>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141205/213a8097/attachment.html>


More information about the cfe-commits mailing list