Implement a more seamless way to provide missing functions on z/OS (#167703)
In this PR I'm changing the way we provide the missing functions like strnlen() on z/OS from the separate header file to a wrapper around the system headers that declare these functions. This will be less intrusive. --------- Co-authored-by: Zibi Sarbinowski <zibi@ca.ibm.com>
This commit is contained in:
parent
507f236f5e
commit
8fce476c81
@ -21,7 +21,6 @@
|
||||
#include "clang/AST/ASTLambda.h"
|
||||
#include "clang/AST/Expr.h"
|
||||
#include "clang/Basic/TargetInfo.h"
|
||||
#include "llvm/Support/SystemZ/zOSSupport.h"
|
||||
|
||||
using namespace clang;
|
||||
using namespace clang::interp;
|
||||
|
||||
@ -1294,6 +1294,11 @@ if(LLVM_TARGET_IS_CROSSCOMPILE_HOST)
|
||||
# (this is a variable that CrossCompile sets on recursive invocations)
|
||||
endif()
|
||||
|
||||
# Special hack for z/OS for missing POSIX functions
|
||||
if (CMAKE_SYSTEM_NAME MATCHES "OS390")
|
||||
include_directories(SYSTEM "${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/SystemZ/zos_wrappers" )
|
||||
endif()
|
||||
|
||||
if( "${CMAKE_SYSTEM_NAME}" MATCHES SunOS )
|
||||
# special hack for Solaris to handle crazy system sys/regset.h
|
||||
include_directories("${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/Solaris")
|
||||
|
||||
@ -1,47 +0,0 @@
|
||||
//===- zOSSupport.h - Common z/OS Include File ------------------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines z/OS implementations for common functions.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_SUPPORT_ZOSSUPPORT_H
|
||||
#define LLVM_SUPPORT_ZOSSUPPORT_H
|
||||
|
||||
#ifdef __MVS__
|
||||
#include <sys/resource.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
// z/OS Unix System Services does not have strsignal() support, so the
|
||||
// strsignal() function is implemented here.
|
||||
inline char *strsignal(int sig) {
|
||||
static char msg[256];
|
||||
sprintf(msg, "%d", sig);
|
||||
return msg;
|
||||
}
|
||||
|
||||
// z/OS Unix System Services does not have wait4() support, so the wait4
|
||||
// function is implemented here.
|
||||
inline pid_t wait4(pid_t pid, int *wstatus, int options,
|
||||
struct rusage *rusage) {
|
||||
pid_t Result = waitpid(pid, wstatus, options);
|
||||
int GetrusageRC = getrusage(RUSAGE_CHILDREN, rusage);
|
||||
assert(!GetrusageRC && "Must have valid measure of the resources!");
|
||||
return Result;
|
||||
}
|
||||
|
||||
// z/OS Unix System Services does not have strnlen() support, so the strnlen()
|
||||
// function is implemented here.
|
||||
inline std::size_t strnlen(const char *S, std::size_t MaxLen) {
|
||||
const char *PtrToNullChar =
|
||||
static_cast<const char *>(std::memchr(S, '\0', MaxLen));
|
||||
return PtrToNullChar ? PtrToNullChar - S : MaxLen;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
35
llvm/include/llvm/Support/SystemZ/zos_wrappers/string.h
Normal file
35
llvm/include/llvm/Support/SystemZ/zos_wrappers/string.h
Normal file
@ -0,0 +1,35 @@
|
||||
//===- string.h - Common z/OS Include File ----------------------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file declares z/OS implementations for common functions.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_SUPPORT_ZOSWRAPPERS_STRING_H
|
||||
#define LLVM_SUPPORT_ZOSWRAPPERS_STRING_H
|
||||
|
||||
#include_next <string.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// z/OS Unix System Services does not have support for:
|
||||
// - strsignal()
|
||||
// - strnlen()
|
||||
// Implementations are provided for z/OS.
|
||||
|
||||
char *strsignal(int sig) asm("llvm_zos_strsignal");
|
||||
|
||||
size_t strnlen(const char *S, size_t MaxLen) asm("llvm_zos_strnlen");
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -10,7 +10,6 @@
|
||||
#include "llvm/Support/Alignment.h"
|
||||
#include "llvm/Support/Errc.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/SystemZ/zOSSupport.h"
|
||||
|
||||
using namespace llvm;
|
||||
using namespace llvm::objcopy::macho;
|
||||
|
||||
@ -8,7 +8,6 @@
|
||||
|
||||
#include "MachOObject.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/Support/SystemZ/zOSSupport.h"
|
||||
|
||||
using namespace llvm;
|
||||
using namespace llvm::objcopy::macho;
|
||||
|
||||
@ -10,7 +10,6 @@
|
||||
#include "MachOObject.h"
|
||||
#include "llvm/BinaryFormat/MachO.h"
|
||||
#include "llvm/Object/MachO.h"
|
||||
#include "llvm/Support/SystemZ/zOSSupport.h"
|
||||
#include <memory>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
@ -19,7 +19,6 @@
|
||||
#include "llvm/Support/Error.h"
|
||||
#include "llvm/Support/FormatVariadic.h"
|
||||
#include "llvm/Support/LEB128.h"
|
||||
#include "llvm/Support/SystemZ/zOSSupport.h"
|
||||
#include "llvm/Support/WithColor.h"
|
||||
#include "llvm/Support/YAMLTraits.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
|
||||
@ -15,7 +15,6 @@
|
||||
#include "llvm/BinaryFormat/MachO.h"
|
||||
#include "llvm/Support/YAMLTraits.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Support/SystemZ/zOSSupport.h"
|
||||
#include "llvm/TargetParser/Host.h"
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
|
||||
@ -311,6 +311,7 @@ add_llvm_component_library(LLVMSupport
|
||||
Threading.cpp
|
||||
Valgrind.cpp
|
||||
Watchdog.cpp
|
||||
zOSLibFunctions.cpp
|
||||
|
||||
ADDITIONAL_HEADER_DIRS
|
||||
Unix
|
||||
|
||||
@ -26,12 +26,11 @@
|
||||
#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "llvm/Support/StringSaver.h"
|
||||
#include "llvm/Support/SystemZ/zOSSupport.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <sys/stat.h>
|
||||
#include <sys/resource.h>
|
||||
#include <signal.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/stat.h>
|
||||
#if HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
82
llvm/lib/Support/zOSLibFunctions.cpp
Normal file
82
llvm/lib/Support/zOSLibFunctions.cpp
Normal file
@ -0,0 +1,82 @@
|
||||
//===-- zOSLibFunctions.cpp -----------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines z/OS implementations for common functions.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifdef __MVS__
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
const char *signalName[] = {
|
||||
/* 0 */ nullptr,
|
||||
/* 1 */ "Hangup", // SIGHUP
|
||||
/* 2 */ "Interrupt", // SIGINT
|
||||
/* 3 */ "Aborted", // SIGABRT
|
||||
/* 4 */ "Illegal instruction", // SIGILL
|
||||
/* 5 */ "Polling event", // SIGPOLL
|
||||
/* 6 */ "Socket data available", // SIGURG
|
||||
/* 7 */ "Stopped (signal)", // SIGSTOP
|
||||
/* 8 */ "Floating point exception", // SIGFPE
|
||||
/* 9 */ "Killed", // SIGKILL
|
||||
/* 10 */ "Bus error", // SIGBUS
|
||||
/* 11 */ "Segmentation fault", // SIGSEGV
|
||||
/* 12 */ "Bad system call", // SIGSYS
|
||||
/* 13 */ "Broken pipe", // SIGPIPE
|
||||
/* 14 */ "Alarm clock", // SIGALRM
|
||||
/* 15 */ "Terminated", // SIGTERM
|
||||
/* 16 */ "User defined signal 1", // SIGUSR1
|
||||
/* 17 */ "User defined signal 2", // SIGUSR2
|
||||
/* 18 */ "Abend", // SIGABND
|
||||
/* 19 */ "Continued", // SIGCONT
|
||||
/* 20 */ "Child exited", // SIGCHLD
|
||||
/* 21 */ "Stopped (tty input)", // SIGTTIN
|
||||
/* 22 */ "Stopped (tty output)", // SIGTTOU
|
||||
/* 23 */ "I/O complete", // SIGIO
|
||||
/* 24 */ "Quit", // SIGQUIT
|
||||
/* 25 */ "Stopped", // SIGTSTP
|
||||
/* 26 */ "Trace/breakpoint trap", // SIGTRAP
|
||||
/* 27 */ "I/O error", // SIGIOERR
|
||||
/* 28 */ "Window changed", // SIGWINCH
|
||||
/* 29 */ "CPU time limit exceeded", // SIGXCPU
|
||||
/* 30 */ "File size limit exceeded", // SIGXFSZ
|
||||
/* 31 */ "Virtual timer expired", // SIGVTALRM
|
||||
/* 32 */ "Profiling timer expired", // SIGPROF
|
||||
/* 33 */ "OMVS subsystem shutdown", // SIGDANGER
|
||||
/* 34 */ "Thread stop", // SIGTHSTOP
|
||||
/* 35 */ "Thread resume", // SIGTHCONT
|
||||
/* 36 */ nullptr, // n/a
|
||||
/* 37 */ "Toggle syscall trace", // SIGTRACE
|
||||
/* 38 */ nullptr, // SIGDCE
|
||||
/* 39 */ "System dump", // SIGDUMP
|
||||
};
|
||||
|
||||
// z/OS Unix System Services does not have strsignal() support, so the
|
||||
// strsignal() function is implemented here.
|
||||
char *strsignal(int sig) {
|
||||
if (static_cast<size_t>(sig) < (sizeof(signalName) / sizeof(signalName[0])) &&
|
||||
signalName[sig])
|
||||
return const_cast<char *>(signalName[sig]);
|
||||
static char msg[256];
|
||||
sprintf(msg, "Unknown signal %d", sig);
|
||||
return msg;
|
||||
}
|
||||
|
||||
// z/OS Unix System Services does not have strnlen() support, so the strnlen()
|
||||
// function is implemented here.
|
||||
size_t strnlen(const char *S, size_t MaxLen) {
|
||||
const char *PtrToNullChar =
|
||||
static_cast<const char *>(memchr(S, '\0', MaxLen));
|
||||
return PtrToNullChar ? PtrToNullChar - S : MaxLen;
|
||||
}
|
||||
#endif
|
||||
@ -27,7 +27,6 @@
|
||||
#include "llvm/Support/MemoryBuffer.h"
|
||||
#include "llvm/Support/Program.h"
|
||||
#include "llvm/Support/Signals.h"
|
||||
#include "llvm/Support/SystemZ/zOSSupport.h"
|
||||
#include <cmath>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
@ -10,7 +10,6 @@
|
||||
#include "llvm/Config/llvm-config.h" // for LLVM_ON_UNIX
|
||||
|
||||
#ifdef LLVM_ON_UNIX
|
||||
#include "llvm/Support/SystemZ/zOSSupport.h"
|
||||
#include <string.h>
|
||||
#endif // LLVM_ON_UNIX
|
||||
|
||||
|
||||
@ -61,7 +61,6 @@
|
||||
#include "llvm/Support/RISCVAttributeParser.h"
|
||||
#include "llvm/Support/RISCVAttributes.h"
|
||||
#include "llvm/Support/ScopedPrinter.h"
|
||||
#include "llvm/Support/SystemZ/zOSSupport.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
|
||||
@ -21,7 +21,6 @@
|
||||
#include "llvm/Support/Error.h"
|
||||
#include "llvm/Support/FormatVariadic.h"
|
||||
#include "llvm/Support/ScopedPrinter.h"
|
||||
#include "llvm/Support/SystemZ/zOSSupport.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <map>
|
||||
|
||||
|
||||
@ -15,7 +15,6 @@
|
||||
#include "llvm/Support/Error.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/LEB128.h"
|
||||
#include "llvm/Support/SystemZ/zOSSupport.h"
|
||||
|
||||
#include <string.h> // for memcpy
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user