Skip to content

Commit

Permalink
[Libomptarget] Use freestanding stdint.h header for DeviceRTL
Browse files Browse the repository at this point in the history
The `stdint.h` header provides the standard types. Previously we used
`-nostdinc` and defined these ourselves. This patch switches to a
freestanding version which should work properly. Without
`-ffreestanding` the `stdint.h` header will include other libraries. But
in a freestanding environment it should work given the primitives.

Reviewed By: jdoerfert

Differential Revision: https://reviews.llvm.org/D145963
  • Loading branch information
jhuber6 committed Mar 13, 2023
1 parent a26aabe commit a92eaa3
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 26 deletions.
2 changes: 1 addition & 1 deletion openmp/libomptarget/DeviceRTL/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ list(TRANSFORM LIBOMPTARGET_LLVM_INCLUDE_DIRS_DEVICERTL PREPEND "-I")
# Set flags for LLVM Bitcode compilation.
set(bc_flags -c -foffload-lto -std=c++17 -fvisibility=hidden
${clang_opt_flags} --offload-device-only
-nocudalib -nogpulib -nostdinc
-nocudalib -nogpulib -nogpuinc -ffreestanding
-fopenmp -fopenmp-cuda-mode
-Wno-unknown-cuda-version
-I${include_directory}
Expand Down
29 changes: 4 additions & 25 deletions openmp/libomptarget/DeviceRTL/include/Types.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@
#ifndef OMPTARGET_TYPES_H
#define OMPTARGET_TYPES_H

#include <stdint.h>

using size_t = decltype(sizeof(char));

// Tell the compiler that we do not have any "call-like" inline assembly in the
// device rutime. That means we cannot have inline assembly which will call
// another function but only inline assembly that performs some operation or
Expand All @@ -21,31 +25,6 @@
// TODO: Find a good place for this
#pragma omp assumes ext_no_call_asm

/// Base type declarations for freestanding mode
///
///{
using int8_t = char;
using uint8_t = unsigned char;
using int16_t = short;
using uint16_t = unsigned short;
using int32_t = int;
using uint32_t = unsigned int;
using int64_t = long;
using uint64_t = unsigned long;
using size_t = decltype(sizeof(char));
// TODO: Properly implement this
using intptr_t = int64_t;
using uintptr_t = uint64_t;

static_assert(sizeof(int8_t) == 1, "type size mismatch");
static_assert(sizeof(uint8_t) == 1, "type size mismatch");
static_assert(sizeof(int16_t) == 2, "type size mismatch");
static_assert(sizeof(uint16_t) == 2, "type size mismatch");
static_assert(sizeof(int32_t) == 4, "type size mismatch");
static_assert(sizeof(uint32_t) == 4, "type size mismatch");
static_assert(sizeof(int64_t) == 8, "type size mismatch");
static_assert(sizeof(uint64_t) == 8, "type size mismatch");
///}

enum omp_proc_bind_t {
omp_proc_bind_false = 0,
Expand Down

0 comments on commit a92eaa3

Please sign in to comment.