xref: /aosp_15_r20/external/pytorch/c10/macros/Export.h (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker #ifndef C10_MACROS_EXPORT_H_
2*da0073e9SAndroid Build Coastguard Worker #define C10_MACROS_EXPORT_H_
3*da0073e9SAndroid Build Coastguard Worker 
4*da0073e9SAndroid Build Coastguard Worker /* Header file to define the common scaffolding for exported symbols.
5*da0073e9SAndroid Build Coastguard Worker  *
6*da0073e9SAndroid Build Coastguard Worker  * Export is by itself a quite tricky situation to deal with, and if you are
7*da0073e9SAndroid Build Coastguard Worker  * hitting this file, make sure you start with the background here:
8*da0073e9SAndroid Build Coastguard Worker  * - Linux: https://gcc.gnu.org/wiki/Visibility
9*da0073e9SAndroid Build Coastguard Worker  * - Windows:
10*da0073e9SAndroid Build Coastguard Worker  * https://docs.microsoft.com/en-us/cpp/cpp/dllexport-dllimport?view=vs-2017
11*da0073e9SAndroid Build Coastguard Worker  *
12*da0073e9SAndroid Build Coastguard Worker  * Do NOT include this file directly. Instead, use c10/macros/Macros.h
13*da0073e9SAndroid Build Coastguard Worker  */
14*da0073e9SAndroid Build Coastguard Worker 
15*da0073e9SAndroid Build Coastguard Worker // You do not need to edit this part of file unless you are changing the core
16*da0073e9SAndroid Build Coastguard Worker // pytorch export abstractions.
17*da0073e9SAndroid Build Coastguard Worker //
18*da0073e9SAndroid Build Coastguard Worker // This part defines the C10 core export and import macros. This is controlled
19*da0073e9SAndroid Build Coastguard Worker // by whether we are building shared libraries or not, which is determined
20*da0073e9SAndroid Build Coastguard Worker // during build time and codified in c10/core/cmake_macros.h.
21*da0073e9SAndroid Build Coastguard Worker // When the library is built as a shared lib, EXPORT and IMPORT will contain
22*da0073e9SAndroid Build Coastguard Worker // visibility attributes. If it is being built as a static lib, then EXPORT
23*da0073e9SAndroid Build Coastguard Worker // and IMPORT basically have no effect.
24*da0073e9SAndroid Build Coastguard Worker 
25*da0073e9SAndroid Build Coastguard Worker // As a rule of thumb, you should almost NEVER mix static and shared builds for
26*da0073e9SAndroid Build Coastguard Worker // libraries that depend on c10. AKA, if c10 is built as a static library, we
27*da0073e9SAndroid Build Coastguard Worker // recommend everything dependent on c10 to be built statically. If c10 is built
28*da0073e9SAndroid Build Coastguard Worker // as a shared library, everything dependent on it should be built as shared. In
29*da0073e9SAndroid Build Coastguard Worker // the PyTorch project, all native libraries shall use the macro
30*da0073e9SAndroid Build Coastguard Worker // C10_BUILD_SHARED_LIB to check whether pytorch is building shared or static
31*da0073e9SAndroid Build Coastguard Worker // libraries.
32*da0073e9SAndroid Build Coastguard Worker 
33*da0073e9SAndroid Build Coastguard Worker // For build systems that do not directly depend on CMake and directly build
34*da0073e9SAndroid Build Coastguard Worker // from the source directory (such as Buck), one may not have a cmake_macros.h
35*da0073e9SAndroid Build Coastguard Worker // file at all. In this case, the build system is responsible for providing
36*da0073e9SAndroid Build Coastguard Worker // correct macro definitions corresponding to the cmake_macros.h.in file.
37*da0073e9SAndroid Build Coastguard Worker //
38*da0073e9SAndroid Build Coastguard Worker // In such scenarios, one should define the macro
39*da0073e9SAndroid Build Coastguard Worker //     C10_USING_CUSTOM_GENERATED_MACROS
40*da0073e9SAndroid Build Coastguard Worker // to inform this header that it does not need to include the cmake_macros.h
41*da0073e9SAndroid Build Coastguard Worker // file.
42*da0073e9SAndroid Build Coastguard Worker 
43*da0073e9SAndroid Build Coastguard Worker #ifndef C10_USING_CUSTOM_GENERATED_MACROS
44*da0073e9SAndroid Build Coastguard Worker #include <c10/macros/cmake_macros.h>
45*da0073e9SAndroid Build Coastguard Worker #endif // C10_USING_CUSTOM_GENERATED_MACROS
46*da0073e9SAndroid Build Coastguard Worker 
47*da0073e9SAndroid Build Coastguard Worker #ifdef _WIN32
48*da0073e9SAndroid Build Coastguard Worker #define C10_HIDDEN
49*da0073e9SAndroid Build Coastguard Worker #if defined(C10_BUILD_SHARED_LIBS)
50*da0073e9SAndroid Build Coastguard Worker #define C10_EXPORT __declspec(dllexport)
51*da0073e9SAndroid Build Coastguard Worker #define C10_IMPORT __declspec(dllimport)
52*da0073e9SAndroid Build Coastguard Worker #else
53*da0073e9SAndroid Build Coastguard Worker #define C10_EXPORT
54*da0073e9SAndroid Build Coastguard Worker #define C10_IMPORT
55*da0073e9SAndroid Build Coastguard Worker #endif
56*da0073e9SAndroid Build Coastguard Worker #else // _WIN32
57*da0073e9SAndroid Build Coastguard Worker #if defined(__GNUC__)
58*da0073e9SAndroid Build Coastguard Worker #define C10_EXPORT __attribute__((__visibility__("default")))
59*da0073e9SAndroid Build Coastguard Worker #define C10_HIDDEN __attribute__((__visibility__("hidden")))
60*da0073e9SAndroid Build Coastguard Worker #else // defined(__GNUC__)
61*da0073e9SAndroid Build Coastguard Worker #define C10_EXPORT
62*da0073e9SAndroid Build Coastguard Worker #define C10_HIDDEN
63*da0073e9SAndroid Build Coastguard Worker #endif // defined(__GNUC__)
64*da0073e9SAndroid Build Coastguard Worker #define C10_IMPORT C10_EXPORT
65*da0073e9SAndroid Build Coastguard Worker #endif // _WIN32
66*da0073e9SAndroid Build Coastguard Worker 
67*da0073e9SAndroid Build Coastguard Worker #ifdef NO_EXPORT
68*da0073e9SAndroid Build Coastguard Worker #undef C10_EXPORT
69*da0073e9SAndroid Build Coastguard Worker #define C10_EXPORT
70*da0073e9SAndroid Build Coastguard Worker #endif
71*da0073e9SAndroid Build Coastguard Worker 
72*da0073e9SAndroid Build Coastguard Worker // Definition of an adaptive XX_API macro, that depends on whether you are
73*da0073e9SAndroid Build Coastguard Worker // building the library itself or not, routes to XX_EXPORT and XX_IMPORT.
74*da0073e9SAndroid Build Coastguard Worker // Basically, you will need to do this for each shared library that you are
75*da0073e9SAndroid Build Coastguard Worker // building, and the instruction is as follows: assuming that you are building
76*da0073e9SAndroid Build Coastguard Worker // a library called libawesome.so. You should:
77*da0073e9SAndroid Build Coastguard Worker // (1) for your cmake target (usually done by "add_library(awesome, ...)"),
78*da0073e9SAndroid Build Coastguard Worker //     define a macro called AWESOME_BUILD_MAIN_LIB using
79*da0073e9SAndroid Build Coastguard Worker //     target_compile_options.
80*da0073e9SAndroid Build Coastguard Worker // (2) define the AWESOME_API macro similar to the one below.
81*da0073e9SAndroid Build Coastguard Worker // And in the source file of your awesome library, use AWESOME_API to
82*da0073e9SAndroid Build Coastguard Worker // annotate public symbols.
83*da0073e9SAndroid Build Coastguard Worker 
84*da0073e9SAndroid Build Coastguard Worker // Here, for the C10 library, we will define the macro C10_API for both import
85*da0073e9SAndroid Build Coastguard Worker // and export.
86*da0073e9SAndroid Build Coastguard Worker 
87*da0073e9SAndroid Build Coastguard Worker // This one is being used by libc10.so
88*da0073e9SAndroid Build Coastguard Worker #ifdef C10_BUILD_MAIN_LIB
89*da0073e9SAndroid Build Coastguard Worker #define C10_API C10_EXPORT
90*da0073e9SAndroid Build Coastguard Worker #else
91*da0073e9SAndroid Build Coastguard Worker #define C10_API C10_IMPORT
92*da0073e9SAndroid Build Coastguard Worker #endif
93*da0073e9SAndroid Build Coastguard Worker 
94*da0073e9SAndroid Build Coastguard Worker // This one is being used by libtorch.so
95*da0073e9SAndroid Build Coastguard Worker #ifdef CAFFE2_BUILD_MAIN_LIB
96*da0073e9SAndroid Build Coastguard Worker #define TORCH_API C10_EXPORT
97*da0073e9SAndroid Build Coastguard Worker #else
98*da0073e9SAndroid Build Coastguard Worker #define TORCH_API C10_IMPORT
99*da0073e9SAndroid Build Coastguard Worker #endif
100*da0073e9SAndroid Build Coastguard Worker 
101*da0073e9SAndroid Build Coastguard Worker // You may be wondering: Whose brilliant idea was it to split torch_cuda into
102*da0073e9SAndroid Build Coastguard Worker // two pieces with confusing names?
103*da0073e9SAndroid Build Coastguard Worker // Once upon a time, there _was_ only TORCH_CUDA_API. All was happy until we
104*da0073e9SAndroid Build Coastguard Worker // tried to compile PyTorch for CUDA 11.1, which ran into relocation marker
105*da0073e9SAndroid Build Coastguard Worker // issues when linking big binaries.
106*da0073e9SAndroid Build Coastguard Worker // (https://github.com/pytorch/pytorch/issues/39968) We had two choices:
107*da0073e9SAndroid Build Coastguard Worker //    (1) Stop supporting so many GPU architectures
108*da0073e9SAndroid Build Coastguard Worker //    (2) Do something else
109*da0073e9SAndroid Build Coastguard Worker // We chose #2 and decided to split the behemoth that was torch_cuda into two
110*da0073e9SAndroid Build Coastguard Worker // smaller libraries, one with most of the core kernel functions (torch_cuda_cu)
111*da0073e9SAndroid Build Coastguard Worker // and the other that had..well..everything else (torch_cuda_cpp). The idea was
112*da0073e9SAndroid Build Coastguard Worker // this: instead of linking our static libraries (like the hefty
113*da0073e9SAndroid Build Coastguard Worker // libcudnn_static.a) with another huge library, torch_cuda, and run into pesky
114*da0073e9SAndroid Build Coastguard Worker // relocation marker issues, we could link our static libraries to a smaller
115*da0073e9SAndroid Build Coastguard Worker // part of torch_cuda (torch_cuda_cpp) and avoid the issues.
116*da0073e9SAndroid Build Coastguard Worker 
117*da0073e9SAndroid Build Coastguard Worker // libtorch_cuda_cu.so
118*da0073e9SAndroid Build Coastguard Worker #ifdef TORCH_CUDA_CU_BUILD_MAIN_LIB
119*da0073e9SAndroid Build Coastguard Worker #define TORCH_CUDA_CU_API C10_EXPORT
120*da0073e9SAndroid Build Coastguard Worker #elif defined(BUILD_SPLIT_CUDA)
121*da0073e9SAndroid Build Coastguard Worker #define TORCH_CUDA_CU_API C10_IMPORT
122*da0073e9SAndroid Build Coastguard Worker #endif
123*da0073e9SAndroid Build Coastguard Worker 
124*da0073e9SAndroid Build Coastguard Worker // libtorch_cuda_cpp.so
125*da0073e9SAndroid Build Coastguard Worker #ifdef TORCH_CUDA_CPP_BUILD_MAIN_LIB
126*da0073e9SAndroid Build Coastguard Worker #define TORCH_CUDA_CPP_API C10_EXPORT
127*da0073e9SAndroid Build Coastguard Worker #elif defined(BUILD_SPLIT_CUDA)
128*da0073e9SAndroid Build Coastguard Worker #define TORCH_CUDA_CPP_API C10_IMPORT
129*da0073e9SAndroid Build Coastguard Worker #endif
130*da0073e9SAndroid Build Coastguard Worker 
131*da0073e9SAndroid Build Coastguard Worker // libtorch_cuda.so (where torch_cuda_cu and torch_cuda_cpp are a part of the
132*da0073e9SAndroid Build Coastguard Worker // same api)
133*da0073e9SAndroid Build Coastguard Worker #ifdef TORCH_CUDA_BUILD_MAIN_LIB
134*da0073e9SAndroid Build Coastguard Worker #define TORCH_CUDA_CPP_API C10_EXPORT
135*da0073e9SAndroid Build Coastguard Worker #define TORCH_CUDA_CU_API C10_EXPORT
136*da0073e9SAndroid Build Coastguard Worker #elif !defined(BUILD_SPLIT_CUDA)
137*da0073e9SAndroid Build Coastguard Worker #define TORCH_CUDA_CPP_API C10_IMPORT
138*da0073e9SAndroid Build Coastguard Worker #define TORCH_CUDA_CU_API C10_IMPORT
139*da0073e9SAndroid Build Coastguard Worker #endif
140*da0073e9SAndroid Build Coastguard Worker 
141*da0073e9SAndroid Build Coastguard Worker #if defined(TORCH_HIP_BUILD_MAIN_LIB)
142*da0073e9SAndroid Build Coastguard Worker #define TORCH_HIP_API C10_EXPORT
143*da0073e9SAndroid Build Coastguard Worker #else
144*da0073e9SAndroid Build Coastguard Worker #define TORCH_HIP_API C10_IMPORT
145*da0073e9SAndroid Build Coastguard Worker #endif
146*da0073e9SAndroid Build Coastguard Worker 
147*da0073e9SAndroid Build Coastguard Worker #if defined(TORCH_XPU_BUILD_MAIN_LIB)
148*da0073e9SAndroid Build Coastguard Worker #define TORCH_XPU_API C10_EXPORT
149*da0073e9SAndroid Build Coastguard Worker #else
150*da0073e9SAndroid Build Coastguard Worker #define TORCH_XPU_API C10_IMPORT
151*da0073e9SAndroid Build Coastguard Worker #endif
152*da0073e9SAndroid Build Coastguard Worker 
153*da0073e9SAndroid Build Coastguard Worker // Enums only need to be exported on windows for non-CUDA files
154*da0073e9SAndroid Build Coastguard Worker #if defined(_WIN32) && defined(__CUDACC__)
155*da0073e9SAndroid Build Coastguard Worker #define C10_API_ENUM C10_API
156*da0073e9SAndroid Build Coastguard Worker #else
157*da0073e9SAndroid Build Coastguard Worker #define C10_API_ENUM
158*da0073e9SAndroid Build Coastguard Worker #endif
159*da0073e9SAndroid Build Coastguard Worker 
160*da0073e9SAndroid Build Coastguard Worker #endif // C10_MACROS_MACROS_H_
161