diff options
| author | Nagi5Yeq <wu@x-nagi.com> | 2020-06-01 02:15:40 +0800 |
|---|---|---|
| committer | Nagi5Yeq <wu@x-nagi.com> | 2020-06-01 02:15:40 +0800 |
| commit | f3729aee72a60578738f0c2fddcca2831019f546 (patch) | |
| tree | 88eb9af84f43407fa5931746281827e2d9263cc7 /TypeManager.cc | |
| parent | 9de9ac16960a1ac2c0ab967013f2ec6847b7bc21 (diff) | |
add a sha1 test, commandline improvement, limit target to x86 only
Diffstat (limited to 'TypeManager.cc')
| -rw-r--r-- | TypeManager.cc | 20 |
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) { |
