Implement the export pragma that is used in the z/OS XL C/C++ compiler
to indicate that an external symbol is to be exported from the shared
library. The syntax for the pragma is:
```
'#pragma' 'export' '(' name ')'
```
For C++ if `name` is a function it needs to be declared `extern "C"`.
See the following for the XL documentation:
- https://www.ibm.com/docs/en/zos/3.1.0?topic=descriptions-pragma-export
This code was originally in PR
https://github.com/llvm/llvm-project/pull/111035. I have split it out
into separate PRs so the code for #pragma export is in one PR and the
code for _Export keyword is in another. See that original PR for earlier
comments.
70 lines
1.9 KiB
C++
70 lines
1.9 KiB
C++
// REQUIRES: systemz-registered-target
|
|
// RUN: %clang_cc1 -x c++ %s -emit-llvm -triple s390x-none-zos -fzos-extensions -fvisibility=hidden -o - | FileCheck %s
|
|
|
|
// Testing pragma export after decl.
|
|
extern "C" void f0(void) {}
|
|
int v0;
|
|
#pragma export(f0)
|
|
#pragma export(v0)
|
|
|
|
// Testing pragma export before decl.
|
|
#pragma export(f1)
|
|
#pragma export(v1)
|
|
extern "C" void f1(void) {}
|
|
int v1;
|
|
|
|
// Testing overloaded functions.
|
|
#pragma export(f2)
|
|
void f2(double, double) {}
|
|
extern "C" void f2(int) {}
|
|
void f2(int, int) {}
|
|
|
|
extern "C" void f3(double) {}
|
|
void f3(int, double) {}
|
|
void f3(double, double) {}
|
|
#pragma export(f3)
|
|
|
|
extern "C" void f2b(void) {}
|
|
|
|
void t0(void) {
|
|
f2b();
|
|
}
|
|
|
|
// Testing pragma export after decl and usage.
|
|
#pragma export(f2b)
|
|
|
|
// Testing pragma export with namespace.
|
|
extern "C" void f5(void) {}
|
|
extern "C" void f5a(void) {}
|
|
namespace N0 {
|
|
void f5(void) {}
|
|
#pragma export(f5)
|
|
#pragma export(f5a)
|
|
void f5a(void) {}
|
|
} // namespace N0
|
|
|
|
void f10(int);
|
|
#pragma export(f10)
|
|
extern "C" void f10(double) {}
|
|
void f10(int) {}
|
|
|
|
// CHECK: @v0 = hidden global i32 0
|
|
// CHECK: @v1 = global i32 0
|
|
// CHECK: define hidden void @f0()
|
|
// CHECK: define void @f1()
|
|
// CHECK: define hidden void @_Z2f2dd(double noundef %0, double noundef %1)
|
|
// CHECK: define void @f2(i32 noundef signext %0)
|
|
// CHECK: define hidden void @_Z2f2ii(i32 noundef signext %0, i32 noundef signext %1)
|
|
// CHECK: define hidden void @f3(double noundef %0)
|
|
// CHECK: define hidden void @_Z2f3id(i32 noundef signext %0, double noundef %1)
|
|
// CHECK: define hidden void @_Z2f3dd(double noundef %0, double noundef %1)
|
|
// CHECK: define hidden void @f2b()
|
|
// CHECK: define hidden void @_Z2t0v()
|
|
// CHECK: define hidden void @f5()
|
|
// CHECK: define hidden void @f5a()
|
|
// CHECK: define hidden void @_ZN2N02f5Ev()
|
|
// CHECK: define hidden void @_ZN2N03f5aEv()
|
|
// CHECK: define void @f10(double noundef %0)
|
|
// CHECK: define hidden void @_Z3f10i(i32 noundef signext %0)
|
|
|