summaryrefslogtreecommitdiff
path: root/Type.cc
diff options
context:
space:
mode:
authorNagi5Yeq <wu@x-nagi.com>2020-05-31 13:11:44 +0800
committerNagi5Yeq <wu@x-nagi.com>2020-05-31 13:11:44 +0800
commit4a5bc55769804d003d6cd9f8c16eefb76bb53d1b (patch)
tree365756351275152391a812440f6a76b9f92cc854 /Type.cc
parentbd44c9eaef1f4dcbbd98d4489885566b6c7e5138 (diff)
full support of array, pointer and record stuffs
Diffstat (limited to 'Type.cc')
-rw-r--r--Type.cc27
1 files changed, 27 insertions, 0 deletions
diff --git a/Type.cc b/Type.cc
index 95e529d..7ad0352 100644
--- a/Type.cc
+++ b/Type.cc
@@ -1,6 +1,7 @@
#include <llvm/IR/InstrTypes.h>
#include "Context.hh"
+#include "Log.hh"
#include "Type.hh"
namespace pcc {
@@ -350,4 +351,30 @@ std::shared_ptr<Type> FunctionType::GetReturnType() { return ReturnType_; }
std::vector<std::shared_ptr<Type>> FunctionType::GetArgTypes() {
return ArgTypes_;
}
+
+RecordType::RecordType(const std::vector<RecordMember>& members,
+ std::string&& name)
+ : Type(std::move(name), nullptr) {
+ int i = 0;
+ for (auto&& member : members) {
+ members_.insert({std::get<0>(member), {i++, std::get<1>(member)}});
+ }
+ std::vector<llvm::Type*> MemberTypes(members.size());
+ std::transform(
+ members.cbegin(), members.cend(), MemberTypes.begin(),
+ [](const std::pair<std::string, std::shared_ptr<Type>>& member) {
+ return std::get<1>(member)->GetLLVMType();
+ });
+ LLVMType_ = llvm::StructType::create(MemberTypes, "record", false);
+}
+
+std::pair<int, std::shared_ptr<Type>>
+ RecordType::GetMember(const std::string& name) {
+ decltype(members_.end()) result = members_.find(name);
+ if (result == members_.end()) {
+ Log(LogLevel::PCC_ERROR, "the member %s doesn't exist", name.c_str());
+ return {0, nullptr};
+ }
+ return std::get<1>(*result);
+}
} // namespace pcc