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

Rafael EspĂ­ndola rafael.espindola at gmail.com
Mon Sep 30 11:51:07 PDT 2013


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?

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