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 <pierre-emmanuel.patry@embecosm.com>
This commit is contained in:
Pierre-Emmanuel Patry 2023-04-06 12:13:13 +02:00 committed by Arthur Cohen
parent 4756e2ae8d
commit 49eb3f5fc6
2 changed files with 163 additions and 0 deletions

View File

@ -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
// <http://www.gnu.org/licenses/>.
#ifndef LITERAL_H
#define LITERAL_H
#include <cstdint>
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 */

View File

@ -23,4 +23,6 @@
#ifndef PROC_MACRO_H
#define PROC_MACRO_H
#include "literal.h"
#endif /* ! PROC_MACRO_H */