// Copyright (C) 2020-2025 Free Software Foundation, Inc.
// This file is part of GCC.
// GCC 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.
// GCC 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.
// You should have received a copy of the GNU General Public License
// along with GCC; see the file COPYING3. If not see
// .
#include "rust-lang-item.h"
#include "rust-system.h"
namespace Rust {
const BiMap Rust::LangItem::lang_items = {{
{"add", Kind::ADD},
{"sub", Kind::SUBTRACT},
{"mul", Kind::MULTIPLY},
{"div", Kind::DIVIDE},
{"rem", Kind::REMAINDER},
{"bitand", Kind::BITAND},
{"bitor", Kind::BITOR},
{"bitxor", Kind::BITXOR},
{"shl", Kind::SHL},
{"shr", Kind::SHR},
{"neg", Kind::NEGATION},
{"not", Kind::NOT},
{"add_assign", Kind::ADD_ASSIGN},
{"sub_assign", Kind::SUB_ASSIGN},
{"mul_assign", Kind::MUL_ASSIGN},
{"div_assign", Kind::DIV_ASSIGN},
{"rem_assign", Kind::REM_ASSIGN},
{"bitand_assign", Kind::BITAND_ASSIGN},
{"bitor_assign", Kind::BITOR_ASSIGN},
{"bitxor_assign", Kind::BITXOR_ASSIGN},
{"shl_assign", Kind::SHL_ASSIGN},
{"shr_assign", Kind::SHR_ASSIGN},
{"deref", Kind::DEREF},
{"deref_mut", Kind::DEREF_MUT},
{"index", Kind::INDEX},
{"index_mut", Kind::INDEX_MUT},
{"RangeFull", Kind::RANGE_FULL},
{"Range", Kind::RANGE},
{"RangeFrom", Kind::RANGE_FROM},
{"RangeTo", Kind::RANGE_TO},
{"RangeInclusive", Kind::RANGE_INCLUSIVE},
{"RangeToInclusive", Kind::RANGE_TO_INCLUSIVE},
{"phantom_data", Kind::PHANTOM_DATA},
{"fn", Kind::FN},
{"fn_mut", Kind::FN_MUT},
{"fn_once", Kind::FN_ONCE},
{"fn_once_output", Kind::FN_ONCE_OUTPUT},
{"copy", Kind::COPY},
{"clone", Kind::CLONE},
{"sized", Kind::SIZED},
{"slice_alloc", Kind::SLICE_ALLOC},
{"slice_u8_alloc", Kind::SLICE_U8_ALLOC},
{"str_alloc", Kind::STR_ALLOC},
{"array", Kind::ARRAY},
{"bool", Kind::BOOL},
{"char", Kind::CHAR},
{"f32", Kind::F32},
{"f64", Kind::F64},
{"i8", Kind::I8},
{"i16", Kind::I16},
{"i32", Kind::I32},
{"i64", Kind::I64},
{"i128", Kind::I128},
{"isize", Kind::ISIZE},
{"u8", Kind::U8},
{"u16", Kind::U16},
{"u32", Kind::U32},
{"u64", Kind::U64},
{"u128", Kind::U128},
{"usize", Kind::USIZE},
{"const_ptr", Kind::CONST_PTR},
{"const_slice_ptr", Kind::CONST_SLICE_PTR},
{"mut_ptr", Kind::MUT_PTR},
{"mut_slice_ptr", Kind::MUT_SLICE_PTR},
{"slice_u8", Kind::SLICE_U8},
{"slice", Kind::SLICE},
{"str", Kind::STR},
{"f32_runtime", Kind::F32_RUNTIME},
{"f64_runtime", Kind::F64_RUNTIME},
}};
tl::optional
LangItem::Parse (const std::string &item)
{
auto lang_item = LangItem::lang_items.lookup (item);
return lang_item;
}
std::string
LangItem::ToString (LangItem::Kind type)
{
auto str = LangItem::lang_items.lookup (type);
return str.value ();
}
LangItem::Kind
LangItem::OperatorToLangItem (ArithmeticOrLogicalOperator op)
{
switch (op)
{
case ArithmeticOrLogicalOperator::ADD:
return LangItem::Kind::ADD;
case ArithmeticOrLogicalOperator::SUBTRACT:
return LangItem::Kind::SUBTRACT;
case ArithmeticOrLogicalOperator::MULTIPLY:
return LangItem::Kind::MULTIPLY;
case ArithmeticOrLogicalOperator::DIVIDE:
return LangItem::Kind::DIVIDE;
case ArithmeticOrLogicalOperator::MODULUS:
return LangItem::Kind::REMAINDER;
case ArithmeticOrLogicalOperator::BITWISE_AND:
return LangItem::Kind::BITAND;
case ArithmeticOrLogicalOperator::BITWISE_OR:
return LangItem::Kind::BITOR;
case ArithmeticOrLogicalOperator::BITWISE_XOR:
return LangItem::Kind::BITXOR;
case ArithmeticOrLogicalOperator::LEFT_SHIFT:
return LangItem::Kind::SHL;
case ArithmeticOrLogicalOperator::RIGHT_SHIFT:
return LangItem::Kind::SHR;
}
rust_unreachable ();
}
LangItem::Kind
LangItem::CompoundAssignmentOperatorToLangItem (ArithmeticOrLogicalOperator op)
{
switch (op)
{
case ArithmeticOrLogicalOperator::ADD:
return LangItem::Kind::ADD_ASSIGN;
case ArithmeticOrLogicalOperator::SUBTRACT:
return LangItem::Kind::SUB_ASSIGN;
case ArithmeticOrLogicalOperator::MULTIPLY:
return LangItem::Kind::MUL_ASSIGN;
case ArithmeticOrLogicalOperator::DIVIDE:
return LangItem::Kind::DIV_ASSIGN;
case ArithmeticOrLogicalOperator::MODULUS:
return LangItem::Kind::REM_ASSIGN;
case ArithmeticOrLogicalOperator::BITWISE_AND:
return LangItem::Kind::BITAND_ASSIGN;
case ArithmeticOrLogicalOperator::BITWISE_OR:
return LangItem::Kind::BITOR_ASSIGN;
case ArithmeticOrLogicalOperator::BITWISE_XOR:
return LangItem::Kind::BITXOR_ASSIGN;
case ArithmeticOrLogicalOperator::LEFT_SHIFT:
return LangItem::Kind::SHL_ASSIGN;
case ArithmeticOrLogicalOperator::RIGHT_SHIFT:
return LangItem::Kind::SHR_ASSIGN;
}
rust_unreachable ();
}
LangItem::Kind
LangItem::NegationOperatorToLangItem (NegationOperator op)
{
switch (op)
{
case NegationOperator::NEGATE:
return LangItem::Kind::NEGATION;
case NegationOperator::NOT:
return LangItem::Kind::NOT;
}
rust_unreachable ();
}
} // namespace Rust