summaryrefslogtreecommitdiff
path: root/TypeManager.cc
diff options
context:
space:
mode:
authorNagi5Yeq <wu@x-nagi.com>2020-06-01 02:15:40 +0800
committerNagi5Yeq <wu@x-nagi.com>2020-06-01 02:15:40 +0800
commitf3729aee72a60578738f0c2fddcca2831019f546 (patch)
tree88eb9af84f43407fa5931746281827e2d9263cc7 /TypeManager.cc
parent9de9ac16960a1ac2c0ab967013f2ec6847b7bc21 (diff)
add a sha1 test, commandline improvement, limit target to x86 only
Diffstat (limited to 'TypeManager.cc')
-rw-r--r--TypeManager.cc20
1 files changed, 19 insertions, 1 deletions
diff --git a/TypeManager.cc b/TypeManager.cc
index 9c484e4..7402875 100644
--- a/TypeManager.cc
+++ b/TypeManager.cc
@@ -161,6 +161,24 @@ Value TypeManager::CreateCast(std::shared_ptr<Type> DstType,
return builder->CreateSExtOrTrunc(v, DstType->GetLLVMType());
}
}
+
+ // array to pointer decay
+ std::shared_ptr<PointerType> SrcPointerType =
+ std::dynamic_pointer_cast<PointerType>(SrcType);
+ std::shared_ptr<PointerType> DstPointerType =
+ std::dynamic_pointer_cast<PointerType>(DstType);
+ if (SrcPointerType != nullptr && DstPointerType != nullptr) {
+ std::shared_ptr<ArrayType> SrcInnerType =
+ std::dynamic_pointer_cast<ArrayType>(
+ SrcPointerType->GetElementType());
+ if (SrcInnerType->GetElementType() ==
+ DstPointerType->GetElementType()) {
+ Value zero =
+ llvm::ConstantInt::get(PointerIndexType_->GetLLVMType(), 0);
+ Value indices[2] = {zero, zero};
+ return builder->CreateInBoundsGEP(v, indices);
+ }
+ }
Log(LogLevel::PCC_ERROR, "unsupported type casting from %s to %s",
SrcType->GetCommonName(), DstType->GetCommonName());
return nullptr;
@@ -214,7 +232,7 @@ std::shared_ptr<ArrayType>
std::shared_ptr<RecordType>
TypeManager::CreateRecordType(const std::vector<RecordMember>& members) {
- std::string name = "record {";
+ std::string name = "{";
std::vector<RecordMember>::const_iterator MemberIt = members.cbegin();
name.append(std::get<1>(*MemberIt)->GetCommonName());
for (++MemberIt; MemberIt != members.cend(); ++MemberIt) {