[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