llvm-project/clang/test/CodeGen/pragma-export.c
Sean Perry 7638c1df0e
[SystemZ][z/OS] Implement #pragma export (#141671)
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.
2026-01-23 14:46:31 -05:00

43 lines
834 B
C

// REQUIRES: systemz-registered-target
// RUN: %clang_cc1 %s -emit-llvm -fzos-extensions -triple s390x-none-zos -fvisibility=hidden -o - | FileCheck %s
// Testing pragma export after decl.
void f0(void) {}
int v0;
int vd = 2;
#pragma export(f0)
#pragma export(v0)
#pragma export(vd)
// Testing pragma export before decl.
#pragma export(f1)
#pragma export(v1)
void f1(void) {}
int v1;
void f2(void);
void t0(void) { f2();}
#pragma export(f2)
void f2(void) {}
int func() {
int local;
int l2;
return local+l2;
}
int local = 2;
int l2 =4;
// CHECK: @vd = hidden global i32
// CHECK: @local = hidden global i32
// CHECK: @l2 = hidden global i32
// CHECK: @v0 = global i32
// CHECK: @v1 = global i32
// CHECK: define hidden void @f0()
// CHECK: define void @f1()
// CHECK: define hidden void @t0()
// CHECK: define void @f2()