From 49eb3f5fc662aa44d1560e9061b33a8c86da958f Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Patry Date: Thu, 6 Apr 2023 12:13:13 +0200 Subject: [PATCH] gccrs: libproc_macro: Add Literal type Add the Literal type matching rust ffi definitions. libgrust/ChangeLog: * libproc_macro/proc_macro.h (PROC_MACRO_H): Add literal header include directive. * libproc_macro/literal.h: New file. Signed-off-by: Pierre-Emmanuel Patry --- libgrust/libproc_macro/literal.h | 161 ++++++++++++++++++++++++++++ libgrust/libproc_macro/proc_macro.h | 2 + 2 files changed, 163 insertions(+) create mode 100644 libgrust/libproc_macro/literal.h diff --git a/libgrust/libproc_macro/literal.h b/libgrust/libproc_macro/literal.h new file mode 100644 index 00000000000..7b3e3c5965a --- /dev/null +++ b/libgrust/libproc_macro/literal.h @@ -0,0 +1,161 @@ +// Copyright (C) 2023 Free Software Foundation, Inc. +// +// This file is part of the GNU Proc Macro Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . + +#ifndef LITERAL_H +#define LITERAL_H + +#include + +enum UnsignedTag +{ + UNSIGNED_8, + UNSIGNED_16, + UNSIGNED_32, + UNSIGNED_64, + UNSIGNED_128 +}; + +struct Payload128 +{ + std::uint64_t low; + std::uint64_t high; +}; + +union UnsignedPayload +{ + std::uint8_t unsigned8; + std::uint16_t unsigned16; + std::uint32_t unsigned32; + std::uint64_t unsigned64; + Payload128 unsigned128; +}; + +struct Unsigned +{ + UnsignedTag tag; + UnsignedPayload payload; +}; + +enum SignedTag +{ + SIGNED_8, + SIGNED_16, + SIGNED_32, + SIGNED_64, + SIGNED_128 +}; + +union SignedPayload +{ + std::int8_t signed8; + std::int16_t signed16; + std::int32_t signed32; + std::int64_t signed64; +}; + +struct Signed +{ + SignedTag tag; + SignedPayload payload; +}; + +enum LiteralTag +{ + STRING, + BYTE_STRING, + CHAR, + UNSIGNED, + SIGNED, + USIZE, + ISIZE, + FLOAT32, + FLOAT64 +}; + +struct StringPayload +{ + unsigned char *data; + std::uint64_t len; +}; + +struct ByteStringPayload +{ + std::uint8_t *data; + std::uint64_t size; +}; + +struct UnsignedSuffixPayload +{ + Unsigned value; + bool suffix; +}; + +struct SignedSuffixPayload +{ + Signed value; + bool suffix; +}; + +struct UsizePayload +{ + std::uint64_t value; + bool suffix; +}; + +struct IsizePayload +{ + std::int64_t value; + bool suffix; +}; + +struct Float32Payload +{ + float value; + bool suffix; +}; + +struct Float64Payload +{ + double value; + bool suffix; +}; + +union LiteralPayload +{ + StringPayload string_payload; + ByteStringPayload byte_string_payload; + std::uint32_t char_payload; + UnsignedSuffixPayload unsigned_payload; + SignedSuffixPayload signed_payload; + UsizePayload usize_payload; + IsizePayload isize_payload; + Float32Payload float32_payload; + Float64Payload float64_payload; +}; + +struct Literal +{ + LiteralTag tag; + LiteralPayload payload; +}; + +#endif /* ! LITERAL_H */ diff --git a/libgrust/libproc_macro/proc_macro.h b/libgrust/libproc_macro/proc_macro.h index 27c27dbd41a..cf96bb63cb2 100644 --- a/libgrust/libproc_macro/proc_macro.h +++ b/libgrust/libproc_macro/proc_macro.h @@ -23,4 +23,6 @@ #ifndef PROC_MACRO_H #define PROC_MACRO_H +#include "literal.h" + #endif /* ! PROC_MACRO_H */