Mehdi,

I think your second approach is the better option. Going with the first option 
means we would need to remove references to llvm-config.h in ADT, which I don't 
think is a simple task.

-Chris

> On Nov 18, 2016, at 4:23 PM, Mehdi Amini via llvm-dev 
> <llvm-...@lists.llvm.org> wrote:
> 
> 
>> On Nov 18, 2016, at 3:45 PM, Mehdi Amini <mehdi.am...@apple.com 
>> <mailto:mehdi.am...@apple.com>> wrote:
>> 
>> Hi,
>> 
>> I had to revert it, because it breaks building LLDB on MacOS.
>> 
>> It turns out it would break any client that is including llvm-config.h but 
>> not linking to libLLVMSupport.
>> So either:
>> 
>> - we shouldn’t allow to include llvm-config.h without linking to LLVM, in 
>> which case I need to look a bit closer as of why lldb includes this header 
>> in a context where they don’t link LLVM.
>> - we should allow to include llvm-config.h without linking to LLVM (at least 
>> libSupport). In which case we need a new solution for this feature: it can 
>> be to use another header dedicated to this flag, that would be included only 
>> from headers that contain the ABI break.
> 
> The second approach is implemented here:  https://reviews.llvm.org/D26876 
> <https://reviews.llvm.org/D26876>
> 
> I extracted the LLVM_ENABLE_ABI_BREAKING_CHECKS to its own header to have a 
> fine granularity on which client needs to include the check.
> 
> — 
> Mehdi
> 
> 
> 
> 
>> 
>> 
>>> On Nov 16, 2016, at 12:12 PM, Mehdi Amini via llvm-dev 
>>> <llvm-...@lists.llvm.org <mailto:llvm-...@lists.llvm.org>> wrote:
>>> 
>>>> 
>>>> On Nov 16, 2016, at 12:05 PM, Jonathan Roelofs <jonat...@codesourcery.com 
>>>> <mailto:jonat...@codesourcery.com>> wrote:
>>>> 
>>>> 
>>>> 
>>>> On 11/16/16 11:48 AM, Mehdi Amini via llvm-dev wrote:
>>>>> Hi all,
>>>>> 
>>>>> An issue that come up from time to time and has cost hours for debug for
>>>>> many of us and users of LLVM is that an assert build isn’t ABI
>>>>> compatible with a release build.
>>>>> 
>>>>> The CMake flags that controls this behavior is LLVM_ABI_BREAKING_CHECKS (
>>>>> 
>>>>> *LLVM_ABI_BREAKING_CHECKS*:STRING
>>>>>    Used to decide if LLVM should be built with ABI breaking checks or
>>>>>    not. Allowed values
>>>>>    are WITH_ASSERTS (default), FORCE_ON and FORCE_OFF.  WITH_ASSERTS turns
>>>>>    on ABI breaking checks in an assertion enabled
>>>>>    build.  FORCE_ON (FORCE_OFF) turns them on (off) irrespective of
>>>>>    whether normal (NDEBUG-based) assertions are enabled or not. A
>>>>>    version of LLVM built with ABI breaking checks is not ABI compatible
>>>>>    with a version built without it.
>>>>> 
>>>>> 
>>>>> I propose to add a runtime check to detect when we have incorrectly
>>>>> setup build.
>>>>> 
>>>>> The idea is that every translation unit that includes such header will
>>>>> get a weak definition of a symbol with an initializer calling the
>>>>> runtime check. The symbol name would be different if the ABI break is
>>>>> enabled or not.
>>>> 
>>>> Can it be made into a link-time check instead? I'm imagining something 
>>>> like:
>>> 
>>> I’d love to, but didn’t find a universal solution unfortunately :(
>>> 
>>>>  #if LLVM_ENABLE_ABI_BREAKING_CHECKS
>>>>  extern int EnableABIBreakingChecks;
>>>>  __attribute__((weak)) int *VerifyEnableABIBreakingChecks = 
>>>> &EnableABIBreakingChecks;
>>>>  #else
>>>>  extern int DisableABIBreakingChecks;
>>>>  __attribute__((weak)) int *VerifyDisableABIBreakingChecks = 
>>>> &VDisableABIBreakingChecks;
>>>>  #endif
>>>> 
>>>> in llvm-config.h.cmake, and:
>>>> 
>>>>  #if LLVM_ENABLE_ABI_BREAKING_CHECKS
>>>>  int EnableABIBreakingChecks;
>>>>  #else
>>>>  int DisableABIBreakingChecks;
>>>>  #endif
>>>> 
>>>> in Error.cpp.
>>>> 
>>>> Then it'll only link if Error.cpp's TU's setting of 
>>>> LLVM_ENABLE_ABI_BREAKING_CHECKS matches that of the TU that includes 
>>>> llvm-config.h
>>> 
>>> It seems that this work, I thought I tried exactly this but got lost on the 
>>> whiteboard at some point!
>>> 
>>> Maybe because one drawback that I tried to avoid is that the export-list of 
>>> a LLVM dylib would depend on the value of LLVM_ENABLE_ABI_BREAKING_CHECKS 
>>> with this.
>>> 
>>> Thanks,
>>> 
>>> — 
>>> Mehdi
>>> 
>>> 
>>> 
>>> 
>>> 
>>>> 
>>>> 
>>>>> 
>>>>> The runtime check maintains two boolean to track if it there is in the
>>>>> image at least a translation unit for each value of this flag. If both
>>>>> flags are set the process is aborted.
>>>>> 
>>>>> The cost is *one* static initializer per DSO (or per image I believe).
>>>>> 
>>>>> A straw-man patch (likely not windows compatible because of weak) is:
>>>>> 
>>>>> diff --git a/llvm/include/llvm/Config/llvm-config.h.cmake
>>>>> b/llvm/include/llvm/Config/llvm-config.h.cmake
>>>>> index 4121e865ea00..4274c942d3b6 100644
>>>>> --- a/llvm/include/llvm/Config/llvm-config.h.cmake
>>>>> +++ b/llvm/include/llvm/Config/llvm-config.h.cmake
>>>>> @@ -80,4 +80,18 @@
>>>>> /* LLVM version string */
>>>>> #define LLVM_VERSION_STRING "${PACKAGE_VERSION}"
>>>>> 
>>>>> +
>>>>> +#ifdef __cplusplus
>>>>> +namespace llvm {
>>>>> +bool setABIBreakingChecks(bool Enabled);
>>>>> +__attribute__((weak))
>>>>> +#if LLVM_ENABLE_ABI_BREAKING_CHECKS
>>>>> +bool
>>>>> +ABICheckEnabled = setABIBreakingChecks(true);
>>>>> +#else
>>>>> +bool ABICheckDisabled = setABIBreakingChecks(true);
>>>> 
>>>> Do you mean `false` here ^ ?
>>>> 
>>>>> +#endif
>>>>> +}
>>>>> +#endif
>>>>> +
>>>>> #endif
>>>>> diff --git a/llvm/lib/Support/Error.cpp b/llvm/lib/Support/Error.cpp
>>>>> index 7436a1fd38ee..151fcdcbfb27 100644
>>>>> --- a/llvm/lib/Support/Error.cpp
>>>>> +++ b/llvm/lib/Support/Error.cpp
>>>>> @@ -112,3 +112,17 @@ void report_fatal_error(Error Err, bool 
>>>>> GenCrashDiag) {
>>>>> }
>>>>> 
>>>>> }
>>>>> +
>>>>> +
>>>>> +bool llvm::setABIBreakingChecks(bool Enabled) {
>>>>> +  static char abi_breaking_checks_enabled = 0;
>>>>> +  static char abi_breaking_checks_disabled = 0;
>>>>> +  if (Enabled)
>>>>> +    abi_breaking_checks_enabled = 1;
>>>>> +  else
>>>>> +    abi_breaking_checks_disabled = 1;
>>>>> +  if (abi_breaking_checks_enabled && abi_breaking_checks_disabled)
>>>>> +    report_fatal_error("Error initializing LLVM: mixing translation
>>>>> units built"
>>>>> +                       "with and without LLVM_ABI_BREAKING_CHECKS");
>>>>> +  return true;
>>>>> +}
>>>>> 
>>>>> 
>>>>> 
>>>>> —
>>>>> Mehdi
>>>>> 
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> LLVM Developers mailing list
>>>>> llvm-...@lists.llvm.org <mailto:llvm-...@lists.llvm.org>
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev 
>>>>> <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>>>>> 
>>>> 
>>>> -- 
>>>> Jon Roelofs
>>>> jonat...@codesourcery.com <mailto:jonat...@codesourcery.com>
>>>> CodeSourcery / Mentor Embedded
>>> 
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-...@lists.llvm.org <mailto:llvm-...@lists.llvm.org>
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev 
>>> <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
> 
> _______________________________________________
> LLVM Developers mailing list
> llvm-...@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

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

Reply via email to