[PATCH] request for approval to commit: llvm-c: Make target initializer functions external functions in lib.

Bob Wilson bob.wilson at apple.com
Mon Sep 30 12:39:54 PDT 2013


On Sep 30, 2013, at 11:51 AM, Rafael EspĂ­ndola <rafael.espindola at gmail.com> wrote:

> I think this is the correct thing to do. Without this a program
> compiled to use LLVM version X will fail to dynamic link with version
> X+1 if we drop a target in X+1.
> 
> Bob Wilson, it looks like you added the first of these static inline
> functions in r74026. Do you remember why you made them inline?

No, I don't really remember the context for that.  I had been fixing a number of issues with the Ocaml bindings right about that time, so this was probably related somehow.  I assume that I made those functions inline to match the InitializeAllTargets() and InitializeNativeTarget() functions.

> 
> On 18 September 2013 15:36, Anders Waldenborg <anders at 0x63.nu> wrote:
>> wanders added you to the CC list for the revision "request for approval to commit: llvm-c: Make target initializer functions external functions in lib.".
>> 
>> Hi baldrick,
>> 
>> Making them proper functions defined in the (shared)lib instead of
>> static inlines defined in the header files makes it possible to
>> actually distribute a binary compiled against the shared library
>> without having to worry about getting undefined symbol errors when
>> calling e.g LLVMInitializeAllTargetInfos because the shared library on
>> the other system was compiled with different targets.
>> 
>> http://llvm-reviews.chandlerc.com/D1714
>> 
>> Files:
>>  include/llvm-c/Target.h
>>  lib/Target/Target.cpp
>> 
>> Index: include/llvm-c/Target.h
>> ===================================================================
>> --- include/llvm-c/Target.h
>> +++ include/llvm-c/Target.h
>> @@ -71,76 +71,41 @@
>>   void LLVMInitialize##TargetName##Disassembler(void);
>> #include "llvm/Config/Disassemblers.def"
>> #undef LLVM_DISASSEMBLER  /* Explicit undef to make SWIG happier */
>> -
>> +
>> /** LLVMInitializeAllTargetInfos - The main program should call this function if
>>     it wants access to all available targets that LLVM is configured to
>>     support. */
>> -static inline void LLVMInitializeAllTargetInfos(void) {
>> -#define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##TargetInfo();
>> -#include "llvm/Config/Targets.def"
>> -#undef LLVM_TARGET  /* Explicit undef to make SWIG happier */
>> -}
>> +void LLVMInitializeAllTargetInfos(void);
>> 
>> /** LLVMInitializeAllTargets - The main program should call this function if it
>>     wants to link in all available targets that LLVM is configured to
>>     support. */
>> -static inline void LLVMInitializeAllTargets(void) {
>> -#define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##Target();
>> -#include "llvm/Config/Targets.def"
>> -#undef LLVM_TARGET  /* Explicit undef to make SWIG happier */
>> -}
>> +void LLVMInitializeAllTargets(void);
>> 
>> /** LLVMInitializeAllTargetMCs - The main program should call this function if
>>     it wants access to all available target MC that LLVM is configured to
>>     support. */
>> -static inline void LLVMInitializeAllTargetMCs(void) {
>> -#define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##TargetMC();
>> -#include "llvm/Config/Targets.def"
>> -#undef LLVM_TARGET  /* Explicit undef to make SWIG happier */
>> -}
>> -
>> +void LLVMInitializeAllTargetMCs(void);
>> +
>> /** LLVMInitializeAllAsmPrinters - The main program should call this function if
>>     it wants all asm printers that LLVM is configured to support, to make them
>>     available via the TargetRegistry. */
>> -static inline void LLVMInitializeAllAsmPrinters(void) {
>> -#define LLVM_ASM_PRINTER(TargetName) LLVMInitialize##TargetName##AsmPrinter();
>> -#include "llvm/Config/AsmPrinters.def"
>> -#undef LLVM_ASM_PRINTER  /* Explicit undef to make SWIG happier */
>> -}
>> -
>> +void LLVMInitializeAllAsmPrinters(void);
>> +
>> /** LLVMInitializeAllAsmParsers - The main program should call this function if
>>     it wants all asm parsers that LLVM is configured to support, to make them
>>     available via the TargetRegistry. */
>> -static inline void LLVMInitializeAllAsmParsers(void) {
>> -#define LLVM_ASM_PARSER(TargetName) LLVMInitialize##TargetName##AsmParser();
>> -#include "llvm/Config/AsmParsers.def"
>> -#undef LLVM_ASM_PARSER  /* Explicit undef to make SWIG happier */
>> -}
>> -
>> +void LLVMInitializeAllAsmParsers(void);
>> +
>> /** LLVMInitializeAllDisassemblers - The main program should call this function
>>     if it wants all disassemblers that LLVM is configured to support, to make
>>     them available via the TargetRegistry. */
>> -static inline void LLVMInitializeAllDisassemblers(void) {
>> -#define LLVM_DISASSEMBLER(TargetName) \
>> -  LLVMInitialize##TargetName##Disassembler();
>> -#include "llvm/Config/Disassemblers.def"
>> -#undef LLVM_DISASSEMBLER  /* Explicit undef to make SWIG happier */
>> -}
>> -
>> +void LLVMInitializeAllDisassemblers(void);
>> +
>> /** LLVMInitializeNativeTarget - The main program should call this function to
>> -    initialize the native target corresponding to the host.  This is useful
>> +    initialize the native target corresponding to the host.  This is useful
>>     for JIT applications to ensure that the target gets linked in correctly. */
>> -static inline LLVMBool LLVMInitializeNativeTarget(void) {
>> -  /* If we have a native target, initialize it to ensure it is linked in. */
>> -#ifdef LLVM_NATIVE_TARGET
>> -  LLVM_NATIVE_TARGETINFO();
>> -  LLVM_NATIVE_TARGET();
>> -  LLVM_NATIVE_TARGETMC();
>> -  return 0;
>> -#else
>> -  return 1;
>> -#endif
>> -}
>> +LLVMBool LLVMInitializeNativeTarget(void);
>> 
>> /*===-- Target Data -------------------------------------------------------===*/
>> 
>> Index: lib/Target/Target.cpp
>> ===================================================================
>> --- lib/Target/Target.cpp
>> +++ lib/Target/Target.cpp
>> @@ -50,6 +50,49 @@
>>   initializeTarget(*unwrap(R));
>> }
>> 
>> +void LLVMInitializeAllTargetInfos(void) {
>> +#define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##TargetInfo();
>> +#include "llvm/Config/Targets.def"
>> +}
>> +
>> +void LLVMInitializeAllTargets(void) {
>> +#define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##Target();
>> +#include "llvm/Config/Targets.def"
>> +}
>> +
>> +void LLVMInitializeAllTargetMCs(void) {
>> +#define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##TargetMC();
>> +#include "llvm/Config/Targets.def"
>> +}
>> +
>> +void LLVMInitializeAllAsmPrinters(void) {
>> +#define LLVM_ASM_PRINTER(TargetName) LLVMInitialize##TargetName##AsmPrinter();
>> +#include "llvm/Config/AsmPrinters.def"
>> +}
>> +
>> +void LLVMInitializeAllAsmParsers(void) {
>> +#define LLVM_ASM_PARSER(TargetName) LLVMInitialize##TargetName##AsmParser();
>> +#include "llvm/Config/AsmParsers.def"
>> +}
>> +
>> +void LLVMInitializeAllDisassemblers(void) {
>> +#define LLVM_DISASSEMBLER(TargetName) \
>> +  LLVMInitialize##TargetName##Disassembler();
>> +#include "llvm/Config/Disassemblers.def"
>> +}
>> +
>> +LLVMBool LLVMInitializeNativeTarget(void) {
>> +#ifdef LLVM_NATIVE_TARGET
>> +  LLVM_NATIVE_TARGETINFO();
>> +  LLVM_NATIVE_TARGET();
>> +  LLVM_NATIVE_TARGETMC();
>> +  return 0;
>> +#else
>> +  return 1;
>> +#endif
>> +}
>> +
>> +
>> LLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) {
>>   return wrap(new DataLayout(StringRep));
>> }
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 





More information about the llvm-commits mailing list