]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: libproc_macro: Add literal ffi implementations
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Thu, 6 Apr 2023 12:29:53 +0000 (14:29 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:34:10 +0000 (18:34 +0100)
Add literal type related ffi functions implementation.

libgrust/ChangeLog:

* libproc_macro/literal.h (Literal__drop): Implement
drop.
(Literal__string): Constructor from a string function prototype.
(Literal__byte_string): Constructor from a byte string function
prototype.
(Literal__from_string): Add function body, no implementation
yet.
* libproc_macro/literal.cc: New file.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
libgrust/libproc_macro/literal.cc [new file with mode: 0644]
libgrust/libproc_macro/literal.h

diff --git a/libgrust/libproc_macro/literal.cc b/libgrust/libproc_macro/literal.cc
new file mode 100644 (file)
index 0000000..a667fcb
--- /dev/null
@@ -0,0 +1,80 @@
+// 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/>.
+
+#include "literal.h"
+#include <cstring>
+
+extern "C" {
+
+void
+Literal__drop (Literal *lit)
+{
+  switch (lit->tag)
+    {
+    case STRING:
+      delete lit->payload.string_payload.data;
+      lit->payload.string_payload.len = 0;
+      break;
+    case BYTE_STRING:
+      delete lit->payload.byte_string_payload.data;
+      lit->payload.byte_string_payload.size = 0;
+      break;
+    case CHAR:
+    case UNSIGNED:
+    case SIGNED:
+    case USIZE:
+    case ISIZE:
+    case FLOAT32:
+    case FLOAT64:
+      break;
+    }
+}
+
+Literal
+Literal__string (const unsigned char *str, std::uint64_t len)
+{
+  unsigned char *data = new unsigned char[len];
+  StringPayload str_payload = {data, len};
+  std::memcpy (data, str, len);
+  LiteralPayload payload;
+  payload.string_payload = str_payload;
+  return {STRING, payload};
+}
+
+Literal
+Literal__byte_string (const std::uint8_t *bytes, std::uint64_t len)
+{
+  std::uint8_t *data = new std::uint8_t[len];
+  ByteStringPayload bstr_payload = {data, len};
+  std::memcpy (data, bytes, len);
+  LiteralPayload payload;
+  payload.byte_string_payload = bstr_payload;
+  return {BYTE_STRING, payload};
+}
+
+bool
+Literal__from_string (const unsigned char *str, std::uint64_t len, Literal *lit)
+{
+  // FIXME: implement this function with parser
+  return false;
+}
+}
index 7b3e3c5965ad06b66796f49e8985597ffe737ebb..62a14522d1dbfaf9e6fa2252ffbfd47282d1e0b0 100644 (file)
@@ -158,4 +158,19 @@ struct Literal
   LiteralPayload payload;
 };
 
+extern "C" {
+void
+Literal__drop (Literal *lit);
+
+Literal
+Literal__string (const unsigned char *str, std::uint64_t len);
+
+Literal
+Literal__byte_string (const std::uint8_t *bytes, std::uint64_t len);
+
+bool
+Literal__from_string (const unsigned char *str, std::uint64_t len,
+                     Literal *lit);
+}
+
 #endif /* ! LITERAL_H */