[llvm] r178713 - Make it possible to include llvm-c without including C++ headers. Patch by Filip Pizlo.

Filip Pizlo fpizlo at apple.com
Wed Apr 3 20:51:09 PDT 2013


On Apr 3, 2013, at 7:03 PM, Eric Christopher <echristo at gmail.com> wrote:

> This seems like a pretty horrific hack.

I'm not sure I share your subjective assessment of this fix.

> I don't think we want to rely
> on the preprocessor to do this sort of thing.
> 
> I've got no objections to not naming unused parameters in headers, in
> fact, when I did this same sort of thing a while back I cleaned that
> up and it seems like a much better way to go.

Unused parameters wasn't the only warning that came up.  -Wmissing-noreturn is another, and that one is trickier to fix.

My intuition is that it's unwise to expect WebKit's use of -Wmissing-noreturn and -Wunused-param to be the last case of build failures in LLVM clients due to unexpected uses of warning C++ flags.  This change ensures that downstream clients can benefit from LLVM's C API even if they use these, and other, flags - since the C API headers themselves follow really good hygiene (mostly by virtue of not having any function bodies, and sticking to simple pure C declarations).  This change also preserves existing behavior for clients who use the C++ API instead of the C one, or who have already side-stepped the build warnings/errors by other means.

Do you disagree with this intuition, or do you believe that there exists a better long-term solution?

-Filip


> 
> -eric
> 
> On Wed, Apr 3, 2013 at 4:12 PM, Evan Cheng <evan.cheng at apple.com> wrote:
>> Author: evancheng
>> Date: Wed Apr  3 18:12:39 2013
>> New Revision: 178713
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=178713&view=rev
>> Log:
>> Make it possible to include llvm-c without including C++ headers. Patch by Filip Pizlo.
>> 
>> Modified:
>>    llvm/trunk/include/llvm-c/Core.h
>>    llvm/trunk/include/llvm-c/ExecutionEngine.h
>>    llvm/trunk/include/llvm-c/Object.h
>>    llvm/trunk/include/llvm-c/Target.h
>>    llvm/trunk/include/llvm-c/TargetMachine.h
>>    llvm/trunk/include/llvm-c/Transforms/PassManagerBuilder.h
>> 
>> Modified: llvm/trunk/include/llvm-c/Core.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Core.h?rev=178713&r1=178712&r2=178713&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm-c/Core.h (original)
>> +++ llvm/trunk/include/llvm-c/Core.h Wed Apr  3 18:12:39 2013
>> @@ -17,14 +17,15 @@
>> 
>> #include "llvm/Support/DataTypes.h"
>> 
>> -#ifdef __cplusplus
>> -
>> +#if defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS)
>> /* Need these includes to support the LLVM 'cast' template for the C++ 'wrap'
>>    and 'unwrap' conversion functions. */
>> #include "llvm/IR/IRBuilder.h"
>> #include "llvm/IR/Module.h"
>> #include "llvm/PassRegistry.h"
>> +#endif /* defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS) */
>> 
>> +#ifdef __cplusplus
>> extern "C" {
>> #endif
>> 
>> @@ -2669,7 +2670,9 @@ LLVMBool LLVMIsMultithreaded();
>> 
>> #ifdef __cplusplus
>> }
>> +#endif
>> 
>> +#if defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS)
>> namespace llvm {
>>   class MemoryBuffer;
>>   class PassManagerBase;
>> @@ -2763,6 +2766,6 @@ namespace llvm {
>>   }
>> }
>> 
>> -#endif /* !defined(__cplusplus) */
>> +#endif /* defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS) */
>> 
>> -#endif /* !defined(LLVM_C_CORE_H) */
>> +#endif /* defined(LLVM_C_CORE_H) */
>> 
>> Modified: llvm/trunk/include/llvm-c/ExecutionEngine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/ExecutionEngine.h?rev=178713&r1=178712&r2=178713&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm-c/ExecutionEngine.h (original)
>> +++ llvm/trunk/include/llvm-c/ExecutionEngine.h Wed Apr  3 18:12:39 2013
>> @@ -138,7 +138,9 @@ void *LLVMGetPointerToGlobal(LLVMExecuti
>> 
>> #ifdef __cplusplus
>> }
>> +#endif
>> 
>> +#if defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS)
>> namespace llvm {
>>   struct GenericValue;
>>   class ExecutionEngine;
>> @@ -157,7 +159,6 @@ namespace llvm {
>> 
>>   #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
>> }
>> -
>> -#endif /* defined(__cplusplus) */
>> +#endif /* defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS) */
>> 
>> #endif
>> 
>> Modified: llvm/trunk/include/llvm-c/Object.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Object.h?rev=178713&r1=178712&r2=178713&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm-c/Object.h (original)
>> +++ llvm/trunk/include/llvm-c/Object.h Wed Apr  3 18:12:39 2013
>> @@ -22,9 +22,11 @@
>> #include "llvm-c/Core.h"
>> #include "llvm/Config/llvm-config.h"
>> 
>> -#ifdef __cplusplus
>> +#if defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS)
>> #include "llvm/Object/ObjectFile.h"
>> +#endif /* defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS) */
>> 
>> +#ifdef __cplusplus
>> extern "C" {
>> #endif
>> 
>> @@ -99,7 +101,9 @@ const char *LLVMGetRelocationValueString
>> 
>> #ifdef __cplusplus
>> }
>> +#endif
>> 
>> +#if defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS)
>> namespace llvm {
>>   namespace object {
>>     inline ObjectFile *unwrap(LLVMObjectFileRef OF) {
>> @@ -142,8 +146,8 @@ namespace llvm {
>> 
>>   }
>> }
>> +#endif /* defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS) */
>> 
>> -#endif /* defined(__cplusplus) */
>> 
>> #endif
>> 
>> 
>> Modified: llvm/trunk/include/llvm-c/Target.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Target.h?rev=178713&r1=178712&r2=178713&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm-c/Target.h (original)
>> +++ llvm/trunk/include/llvm-c/Target.h Wed Apr  3 18:12:39 2013
>> @@ -235,7 +235,9 @@ void LLVMDisposeTargetData(LLVMTargetDat
>> 
>> #ifdef __cplusplus
>> }
>> +#endif
>> 
>> +#if defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS)
>> namespace llvm {
>>   class DataLayout;
>>   class TargetLibraryInfo;
>> @@ -257,7 +259,6 @@ namespace llvm {
>>     return reinterpret_cast<LLVMTargetLibraryInfoRef>(X);
>>   }
>> }
>> -
>> -#endif /* defined(__cplusplus) */
>> +#endif /* defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS) */
>> 
>> #endif
>> 
>> Modified: llvm/trunk/include/llvm-c/TargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/TargetMachine.h?rev=178713&r1=178712&r2=178713&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm-c/TargetMachine.h (original)
>> +++ llvm/trunk/include/llvm-c/TargetMachine.h Wed Apr  3 18:12:39 2013
>> @@ -119,7 +119,9 @@ LLVMBool LLVMTargetMachineEmitToFile(LLV
>> 
>> #ifdef __cplusplus
>> }
>> +#endif
>> 
>> +#if defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS)
>> namespace llvm {
>>   class TargetMachine;
>>   class Target;
>> @@ -138,6 +140,6 @@ namespace llvm {
>>     return reinterpret_cast<LLVMTargetRef>(const_cast<Target*>(P));
>>   }
>> }
>> -#endif
>> +#endif /* defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS) */
>> 
>> #endif
>> 
>> Modified: llvm/trunk/include/llvm-c/Transforms/PassManagerBuilder.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Transforms/PassManagerBuilder.h?rev=178713&r1=178712&r2=178713&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm-c/Transforms/PassManagerBuilder.h (original)
>> +++ llvm/trunk/include/llvm-c/Transforms/PassManagerBuilder.h Wed Apr  3 18:12:39 2013
>> @@ -18,8 +18,11 @@
>> 
>> typedef struct LLVMOpaquePassManagerBuilder *LLVMPassManagerBuilderRef;
>> 
>> -#ifdef __cplusplus
>> +#if defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS)
>> #include "llvm/Transforms/IPO/PassManagerBuilder.h"
>> +#endif
>> +
>> +#ifdef __cplusplus
>> extern "C" {
>> #endif
>> 
>> @@ -86,7 +89,9 @@ void LLVMPassManagerBuilderPopulateLTOPa
>> 
>> #ifdef __cplusplus
>> }
>> +#endif
>> 
>> +#if defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS)
>> namespace llvm {
>>   inline PassManagerBuilder *unwrap(LLVMPassManagerBuilderRef P) {
>>     return reinterpret_cast<PassManagerBuilder*>(P);
>> @@ -96,6 +101,6 @@ namespace llvm {
>>     return reinterpret_cast<LLVMPassManagerBuilderRef>(P);
>>   }
>> }
>> -#endif
>> +#endif /* defined(__cplusplus) && !defined(LLVM_DO_NOT_INCLUDE_CPP_HEADERS) */
>> 
>> #endif
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130403/480fc18a/attachment.html>


More information about the llvm-commits mailing list