logan added inline comments.

================
Comment at: lib/Headers/unwind.h:61
@@ +60,3 @@
+#define _UNWIND_ARM_EHABI 0
+#endif
+
----------------
compnerd wrote:
> logan wrote:
> > logan wrote:
> > > compnerd wrote:
> > > > logan wrote:
> > > > > compnerd wrote:
> > > > > > logan wrote:
> > > > > > > Since this is `unwind.h`, I feel that we can get a step further 
> > > > > > > and use `__ARM_EABI_UNWINDER__` to get more compatibility to 
> > > > > > > GCC's unwind.h.
> > > > > > > 
> > > > > > > Here's the change:
> > > > > > > 
> > > > > > > ```
> > > > > > > #if defined(__arm__) && !defined(__USING_SJLJ_EXCEPTIONS__) && \
> > > > > > >     !defined(__ARM_DWARF_EH__)
> > > > > > > #define __ARM_EABI_UNWINDER__ 1
> > > > > > > #endif
> > > > > > > ```
> > > > > > I dont know if we really need to imitate GCC's macros here.  Am I 
> > > > > > mistaken in that they assume that `__ARM_EABI_UNWINDER__` has been 
> > > > > > set to 1 externally if targeting such an environment?  I think that 
> > > > > > it is better to use the reserved namespace and intrude into 
> > > > > > libunwind's namespace as already done here.
> > > > > > Am I mistaken in that they assume that `__ARM_EABI_UNWINDER__` has 
> > > > > > been set to 1 externally if targeting such an environment?
> > > > > 
> > > > > Although this is an implementation detail, it was defined by 
> > > > > `unwind.h` in the implementation of GCC.
> > > > > 
> > > > > Remark: `__ARM_EABI_UNWINDER__` is not a pre-defined macro in GCC and 
> > > > > Clang (can be checked with ` gcc -dM -E - < /dev/null`.)
> > > > > 
> > > > > BTW, some applications or libraries need this macro to be defined 
> > > > > after including `<unwind.h>` (such as uclibc, boost, or libc++abi 
> > > > > 3.0.)  I remembered that someone suggested to use 
> > > > > `__ARM_EABI_UNWINDER__` instead of  `LIBCXXABI_ARM_EHABI` when I was 
> > > > > fixing libc++abi several years ago.  I chose `LIBCXXABI_ARM_EHABI` 
> > > > > simply because `__ARM_EABI_UNWINDER__` wasn't provided by clang at 
> > > > > that time.
> > > > > 
> > > > > I am less concerned to namespace pollution, because this is already 
> > > > > the de facto implementation in GCC world and the macro names start 
> > > > > with underscores are reserved for compiler or standard libraries by 
> > > > > convention.
> > > > > 
> > > > > Since this is file a public header and will be used for a long time, 
> > > > > I personally believe that it will be better to use an existing name 
> > > > > with the same meaning instead of introducing a new name.  In 
> > > > > addition, this will make it easier to port the application between 
> > > > > gcc and clang.
> > > > I just checked, libc++abi has no use of this macro, nor does boost 
> > > > 1.60.  uclibc only defines `__ARM_EABI_UNWINDER__`, but does not use 
> > > > it.  I also checked glibc and musl, and glibc like uclibc defines it 
> > > > while musl has no references to it.  This is injecting itself into the 
> > > > compiler namespace and is misleading, so I think I would really rather 
> > > > prefer the current patch as is.
> > > > I just checked, libc++abi has no use of this macro, nor does boost 
> > > > 1.60. uclibc only defines __ARM_EABI_UNWINDER__, but does not use it. I 
> > > > also checked glibc and musl, and glibc like uclibc defines it while 
> > > > musl has no references to it.
> > > 
> > > For uClibc++ and Boost I only did a simple Google search while writing 
> > > the previous reply.  Sorry for the brevity.
> > > 
> > > Although uClibc++ itself does not use `__ARM_EABI_UNWINDER__`, some 
> > > third-party ARM ports are using this macro.  For example, 
> > > [toyroot](https://github.com/luckboy/toyroot), a small build system for 
> > > small linux distribution, is maintaining a [local 
> > > patch](https://github.com/luckboy/toyroot/blob/master/patch/uClibc%2B%2B-0.2.4-arm-eabi-unwinder.patch).
> > >   Yet another example, [Aboriginal Linux](http://landley.net/aboriginal/) 
> > > has [another 
> > > patch](http://www.landley.net/hg/aboriginal/file/tip/sources/patches/uClibc%2B%2B-unwind-cxx.patch)
> > >  that requires this macro.  Someone even sent a 
> > > [patch](http://lists.uclibc.org/pipermail/uclibc/2012-June/046915.html) 
> > > to uClibc++ mailing list.
> > > 
> > > For Boost, I am referring to [this 
> > > thread](http://lists.boost.org/Archives/boost/2008/04/136332.php), 
> > > although it seems not being committed.
> > > 
> > > For libc++abi, I am referring to the [earlier 
> > > version](http://llvm.org/klaus/libcxxabi/blob/8b547a338373b6e149d8ceed34bbf6a979a1e10d/src/cxa_exception.hpp)
> > >  (roughly 3.4.)  You won't find `__ARM_EABI_UNWINDER__` in libc++abi 
> > > master branch because I removed it in 
> > > [05d51bcf07](http://llvm.org/klaus/libcxxabi/commit/05d51bcf07d0ec1c40785b4a860fd917410b4be1/)
> > >  when I was implementing the ARM EHABI support.  I remembered in the 
> > > [review 
> > > comments](http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20140414/103125.html)
> > >  Jonathan even suggested me to use `__ARM_EABI_UNWINDER__` instead.  I 
> > > couldn't do  so because `__ARM_EABI_UNWINDER__` was not defined by 
> > > `<clang-src>/lib/Headers/unwind.h`.
> > > 
> > > The main purpose to mention these projects is to demonstrate that 
> > > `__ARM_EABI_UNWINDER__` is a common knownledge between unwinder or 
> > > personality developers.  Many of us will come up with 
> > > `__ARM_EABI_UNWINDER__` when we need to distinguish ARM EHABI code and 
> > > Itanium code.
> > > 
> > > > This is injecting itself into the compiler namespace and is misleading, 
> > > > so I think I would really rather prefer the current patch as is.
> > > 
> > > I have a completely opposite point of view.  Please notice that the 
> > > subject we are referring to is the unwind.h distributed with clang 
> > > (`<clang-src>/lib/Headers/unwind.h`) which will usually be installed at 
> > > `<llvm-install-prefix>/lib/clang/<version>/include/unwind.h`.  This file 
> > > is a part of compiler and maintained by the compiler developer.  Thus, 
> > > IMO, we SHOULD keep macros in compiler namespace.
> > > 
> > > BTW, IMO, both `_UNWIND_ARM_EHABI` and `__ARM_EABI_UNWINDER__` belongs to 
> > > compiler namespace (both of them start with a underscore), so this 
> > > criteria is not the reason to flavor one over the other.
> > > 
> > > ```
> > > #if defined(__arm__) && !defined(__USING_SJLJ_EXCEPTIONS__) && \
> > >     !defined(__ARM_DWARF_EH__)
> > > #define _UNWIND_ARM_EHABI 1
> > > #else
> > > #define _UNWIND_ARM_EHABI 0
> > > #endif
> > > ```
> > > 
> > > Let's get back to these `#if` and `#define`.  I have two arguments 
> > > against the changes in the second revision:
> > > 
> > > 1. As a public header provided by compiler, I believe it will be better 
> > > to eliminate every unnecessary macros.  This macro is not a must-have for 
> > > non-ARM platforms.  We can simply change the upcoming `#if` to `#ifdef` 
> > > or `#if defined(...)`.  In the other words, IMO, we don't need the 
> > > `#else` part.
> > > 
> > > 2. I prefer `__ARM_EABI_UNWINDER__` to `_UNWIND_ARM_EABI` for four 
> > > reasons:
> > > 
> > >    a. As mentioned earlier, some application code relies on 
> > > `__ARM_EABI_UNWINDER__`.  Using `__ARM_EABI_UNWINDER__` can reduce the 
> > > effort to port the program around.
> > > 
> > >    b. `__ARM_EABI_UNWINDER__` is battle tested.  If a program which 
> > > includes `<unwind.h>` has been compiled with `arm-linux-gnueabi-g++`, we 
> > > can make sure that the program is not using `__ARM_EABI_UNWINDER__` as 
> > > identifier.  On the contrary, although the possibility is low, someone 
> > > may name his variable with `_UNWIND_ARM_EHABI` and introducing 
> > > `_UNWIND_ARM_EHABI` to compiler header will break his program.
> > > 
> > >    c. Using `__ARM_EABI_UNWINDER__` can reduce the divergence between gcc 
> > > and clang.
> > > 
> > >    d. I personally prefer `__ARM_EABI_UNWINDER__` because it looks 
> > > similar to architecture-specific pre-defined macros, such as 
> > > `__ARM_EABI__` and `__ARM_ARCH_7A__`.
> > Hi @compnerd,
> > 
> > I know that my arguments for `__ARM_EABI_UNWINDER__` are mainly due to the 
> > historical reason and are not inherent to the name itself.  If the history 
> > were different (e.g. some GCC developer chose `_UNWIND_ARM_EHABI`), then I 
> > will favor `_UNWIND_ARM_EHABI` over `__ARM_EABI_UNWINDER__`.  But, 
> > unfortunately, we are living in the world that `__ARM_EABI_UNWINDER__` was 
> > coined first.  IMHO, it will really be an advantage to reduce the 
> > divergence.
> > 
> > Or, do you have other concerns that I haven't addressed or thought of?  
> > Thanks for your understanding.
> Exactly, its historical only.  There is no good reason to continue with it, 
> and i don't really see how this is a benefit.  How would we deal with a 
> similar macro being defined by the compiler?  I really think that it is 
> significantly safer to use the current proposed name (_UNWIND_ARM_EABI).  We 
> could also duplicate the check to eschew the selection of a name.
> 
> Either way, I don't think that we should further hold up this patch on this.  
> This is reasonable, and I can see it simplifying things for people so we 
> should get this merged.
> We could also duplicate the check to eschew the selection of a name.

OK.  I agree that this is a fine compromise to reach out.

@timonvo: would you mind to update the patch by replacing `_UNWIND_ARM_EHABI` 
with following preprocessor condition?  I will accept the revised patch as soon 
as possible.

```
#if defined(__arm__) && !defined(__USING_SJLJ_EXCEPTIONS__) && \
    !defined(__ARM_DWARF_EH__)
...
#endif
```

> Either way, I don't think that we should further hold up this patch on this. 
> This is reasonable, and I can see it simplifying things for people so we 
> should get this merged.

Yeah.  I wish to move forward as soon as possible as well.


http://reviews.llvm.org/D15883



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to