Skip to content

Commit a31d805

Browse files
committed
[Misc] Remove deprecated ABI
1 parent b1ca5cf commit a31d805

File tree

6 files changed

+155
-97
lines changed

6 files changed

+155
-97
lines changed

CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
6060
)
6161
endif()
6262

63+
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
64+
add_compile_options(
65+
-Wno-redundant-move
66+
)
67+
endif()
68+
6369
option(SOLL_INCLUDE_TESTS
6470
"Generate build targets for the Soll unit tests."
6571
${LLVM_INCLUDE_TESTS})

lib/CodeGen/ABICodec.cpp

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ llvm::Value *AbiEmitter::emitEncodeTuple(
4949
std::tie(Value, IsStateVariable) = Values[I];
5050
if (Value->getType()->isDynamic()) {
5151
DynamicPos.emplace_back(Int8Ptr, I);
52-
Int8Ptr = Builder.CreateInBoundsGEP(Int8Ptr, {Builder.getIntN(32, 32)});
52+
Int8Ptr = Builder.CreateInBoundsGEP(Builder.getInt8Ty(), Int8Ptr,
53+
{Builder.getIntN(32, 32)});
5354
} else {
5455
Int8Ptr = emitEncode(Int8Ptr, Value, IsStateVariable);
5556
}
@@ -96,7 +97,7 @@ AbiEmitter::getDecode(llvm::Value *Int8Ptr, const Type *Ty) {
9697
Builder.getIntN(32, 32)),
9798
Builder.getIntN(32, 32));
9899
llvm::Value *NextInt8Ptr =
99-
Builder.CreateInBoundsGEP(Int8Ptr, {EncodeLength});
100+
Builder.CreateInBoundsGEP(Builder.getInt8Ty(), Int8Ptr, {EncodeLength});
100101
return {ExprValue::getRValue(Ty, Val), NextInt8Ptr};
101102
}
102103
case Type::Category::Array: {
@@ -133,19 +134,20 @@ AbiEmitter::getDecode(llvm::Value *Int8Ptr, const Type *Ty) {
133134
case Type::Category::FixedBytes: {
134135
llvm::Value *ValPtr = Builder.CreatePointerCast(
135136
Int8Ptr, llvm::PointerType::getUnqual(ValueTy));
136-
llvm::Value *Val = Builder.CreateLoad(ValPtr, ValueTy);
137-
llvm::Value *NextInt8Ptr =
138-
Builder.CreateInBoundsGEP(Int8Ptr, {Builder.getInt32(32)});
137+
llvm::Value *Val = Builder.CreateLoad(ValueTy, ValPtr);
138+
llvm::Value *NextInt8Ptr = Builder.CreateInBoundsGEP(
139+
Builder.getInt8Ty(), Int8Ptr, {Builder.getInt32(32)});
139140
return {ExprValue::getRValue(Ty, Val), NextInt8Ptr};
140141
}
141142
default: {
142143
llvm::Value *ValPtr = Builder.CreatePointerCast(
143144
Int8Ptr, llvm::PointerType::getUnqual(CGM.Int256Ty));
144-
llvm::Value *Val = Builder.CreateLoad(ValPtr, CGM.Int256Ty);
145+
llvm::Value *Val = Builder.CreateLoad(CGM.Int256Ty, ValPtr);
145146
Val = CGM.getEndianlessValue(Val);
146147
Val = Builder.CreateZExtOrTrunc(Val, ValueTy);
147148
llvm::Value *NextInt8Ptr = Builder.CreateInBoundsGEP(
148-
Int8Ptr, {Builder.getInt32(ValueTy->getIntegerBitWidth() / 8)});
149+
Builder.getInt8Ty(), Int8Ptr,
150+
{Builder.getInt32(ValueTy->getIntegerBitWidth() / 8)});
149151
return {ExprValue::getRValue(Ty, Val), NextInt8Ptr};
150152
}
151153
}
@@ -162,7 +164,8 @@ AbiEmitter::getDecodeTuple(llvm::Value *Int8Ptr, const TupleType *Ty) {
162164
ExprValuePtr PosExprValue;
163165
std::tie(PosExprValue, NextInt8Ptr) = getDecode(NextInt8Ptr, &Int32Ty);
164166
llvm::Value *Pos = PosExprValue->load(Builder, CGM);
165-
DynamicPos.emplace_back(Builder.CreateInBoundsGEP(Int8Ptr, {Pos}), I);
167+
DynamicPos.emplace_back(
168+
Builder.CreateInBoundsGEP(Builder.getInt8Ty(), Int8Ptr, {Pos}), I);
166169
} else {
167170
ExprValuePtr ValExprValue;
168171
std::tie(ValExprValue, NextInt8Ptr) =
@@ -463,8 +466,9 @@ llvm::Value *AbiEmitter::emitEncodePacked(llvm::Value *Int8Ptr,
463466
const auto *FixedBytesTy = dynamic_cast<const FixedBytesType *>(Ty);
464467
unsigned PadRightLength = 32 - FixedBytesTy->getBitNum() / 8;
465468
if (PadRightLength % 32)
466-
Int8Ptr = Builder.CreateInBoundsGEP(
467-
Int8Ptr, {Builder.getIntN(32, PadRightLength)});
469+
Int8Ptr =
470+
Builder.CreateInBoundsGEP(Builder.getInt8Ty(), Int8Ptr,
471+
{Builder.getIntN(32, PadRightLength)});
468472
}
469473
return Int8Ptr;
470474
}
@@ -502,7 +506,8 @@ llvm::Value *AbiEmitter::emitEncode(llvm::Value *Int8Ptr,
502506
Int8Ptr = copyToInt8Ptr(
503507
Int8Ptr, Builder.CreateZExtOrTrunc(Length, CGF.Int256Ty), true);
504508
Int8Ptr = copyToInt8Ptr(Int8Ptr, Bytes, true);
505-
return Builder.CreateInBoundsGEP(Int8Ptr, {PadRightLength});
509+
return Builder.CreateInBoundsGEP(Builder.getInt8Ty(), Int8Ptr,
510+
{PadRightLength});
506511
}
507512
case Type::Category::Array: {
508513
llvm::Function *ThisFunc = Builder.GetInsertBlock()->getParent();
@@ -530,7 +535,8 @@ llvm::Value *AbiEmitter::emitEncode(llvm::Value *Int8Ptr,
530535
if (ArrTy->getElementType()->isDynamic()) {
531536
Head = Int8Ptr;
532537
Tail = Builder.CreateInBoundsGEP(
533-
Head, {Builder.CreateMul(ArrayLength, ABIStaticSizeValue)});
538+
Builder.getInt8Ty(), Head,
539+
{Builder.CreateMul(ArrayLength, ABIStaticSizeValue)});
534540
} else {
535541
Tail = Int8Ptr;
536542
}
@@ -606,7 +612,7 @@ llvm::Value *AbiEmitter::emitEncode(llvm::Value *Int8Ptr,
606612
unsigned PadRightLength = 32 - FixedBytesTy->getBitNum() / 8;
607613
if (PadRightLength % 32)
608614
Int8Ptr = Builder.CreateInBoundsGEP(
609-
Int8Ptr, {Builder.getIntN(32, PadRightLength)});
615+
Builder.getInt8Ty(), Int8Ptr, {Builder.getIntN(32, PadRightLength)});
610616
return Int8Ptr;
611617
}
612618
default: {
@@ -627,15 +633,16 @@ llvm::Value *AbiEmitter::copyToInt8Ptr(llvm::Value *Int8Ptr, llvm::Value *Value,
627633
Builder.CreateCall(Memcpy, {Builder.CreateBitCast(Int8Ptr, CGM.Int8PtrTy),
628634
SrcBytes, Length});
629635
if (IncreasePtr)
630-
return Builder.CreateInBoundsGEP(Int8Ptr, {Length});
636+
return Builder.CreateInBoundsGEP(Builder.getInt8Ty(), Int8Ptr, {Length});
631637
} else {
632638
Value = CGM.getEndianlessValue(Value);
633639
llvm::Value *CPtr =
634640
Builder.CreatePointerCast(Int8Ptr, llvm::PointerType::getUnqual(Ty));
635641
Builder.CreateStore(Value, CPtr);
636642
if (IncreasePtr)
637643
return Builder.CreateInBoundsGEP(
638-
Int8Ptr, {Builder.getInt32(Ty->getIntegerBitWidth() / 8)});
644+
Builder.getInt8Ty(), Int8Ptr,
645+
{Builder.getInt32(Ty->getIntegerBitWidth() / 8)});
639646
}
640647
return nullptr;
641648
}

lib/CodeGen/CGExpr.cpp

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <llvm/IR/Type.h>
1111
#include <llvm/IR/Value.h>
1212
#include <llvm/Support/raw_ostream.h>
13+
1314
namespace soll::CodeGen {
1415

1516
ExprValuePtr CodeGenFunction::emitExpr(const Expr *E) {
@@ -381,7 +382,7 @@ ExprValuePtr CodeGenFunction::emitAbiDecode(const CallExpr *CE) {
381382

382383
ExprValuePtr CodeGenFunction::emitAbiDecode(llvm::Value *Bytes,
383384
const Type *TupleTy) {
384-
llvm::Value *Length = Builder.CreateZExtOrTrunc(
385+
[[maybe_unused]] llvm::Value *Length = Builder.CreateZExtOrTrunc(
385386
Builder.CreateExtractValue(Bytes, {0}), CGM.Int32Ty);
386387
llvm::Value *SrcBytes = Builder.CreateExtractValue(Bytes, {1});
387388

@@ -634,19 +635,22 @@ llvm::Value *CodeGenFunction::emitAsmGetBalance(const CallExpr *CE,
634635
llvm::Value *CodeGenFunction::emitAsmCallMLoad(const CallExpr *CE) {
635636
auto Arguments = CE->getArguments();
636637
llvm::Value *Pos = emitExpr(Arguments[0])->load(Builder, CGM);
637-
llvm::Value *CPtr =
638-
Builder.CreateInBoundsGEP(CGM.getHeapBase(), {Pos}, "heap.cptr");
638+
llvm::Value *CPtr = Builder.CreateInBoundsGEP(
639+
CGM.getHeapBase()->getType()->getPointerElementType(), CGM.getHeapBase(),
640+
{Pos}, "heap.cptr");
639641
llvm::Value *Ptr = Builder.CreateBitCast(CPtr, Int256PtrTy, "heap.ptr");
640-
llvm::Value *Value = CGM.getEndianlessValue(Builder.CreateLoad(Ptr));
642+
llvm::Value *Value =
643+
CGM.getEndianlessValue(Builder.CreateLoad(CGM.Int256Ty, Ptr));
641644
CGM.emitUpdateMemorySize(Pos, Builder.getIntN(256, 32));
642645
return Value;
643646
}
644647

645648
void CodeGenFunction::emitAsmCallMStore(const CallExpr *CE) {
646649
auto Arguments = CE->getArguments();
647650
llvm::Value *Pos = emitExpr(Arguments[0])->load(Builder, CGM);
648-
llvm::Value *CPtr =
649-
Builder.CreateInBoundsGEP(CGM.getHeapBase(), {Pos}, "heap.cptr");
651+
llvm::Value *CPtr = Builder.CreateInBoundsGEP(
652+
CGM.getHeapBase()->getType()->getPointerElementType(), CGM.getHeapBase(),
653+
{Pos}, "heap.cptr");
650654
llvm::Value *Ptr = Builder.CreateBitCast(CPtr, Int256PtrTy, "heap.ptr");
651655
Builder.CreateStore(
652656
CGM.getEndianlessValue(emitExpr(Arguments[1])->load(Builder, CGM)), Ptr);
@@ -656,16 +660,17 @@ void CodeGenFunction::emitAsmCallMStore(const CallExpr *CE) {
656660
void CodeGenFunction::emitAsmCallMStore8(const CallExpr *CE) {
657661
auto Arguments = CE->getArguments();
658662
llvm::Value *Pos = emitExpr(Arguments[0])->load(Builder, CGM);
659-
llvm::Value *Ptr =
660-
Builder.CreateInBoundsGEP(CGM.getHeapBase(), {Pos}, "heap.ptr");
663+
llvm::Value *Ptr = Builder.CreateInBoundsGEP(
664+
CGM.getHeapBase()->getType()->getPointerElementType(), CGM.getHeapBase(),
665+
{Pos}, "heap.ptr");
661666
llvm::Value *Value = Builder.CreateZExtOrTrunc(
662667
emitExpr(Arguments[1])->load(Builder, CGM), CGM.Int8Ty);
663668
Builder.CreateStore(Value, Ptr);
664669
CGM.emitUpdateMemorySize(Pos, Builder.getIntN(256, 1));
665670
}
666671

667672
llvm::Value *CodeGenFunction::emitAsmCallMSize(const CallExpr *CE) {
668-
return Builder.CreateLoad(CGM.getMemorySize());
673+
return Builder.CreateLoad(CGM.Int256Ty, CGM.getMemorySize());
669674
}
670675

671676
llvm::Value *CodeGenFunction::emitAsmCallSLoad(const CallExpr *CE) {
@@ -688,8 +693,9 @@ void CodeGenFunction::emitAsmCallSStore(const CallExpr *CE) {
688693
void CodeGenFunction::emitAsmCallReturn(const CallExpr *CE) {
689694
auto Arguments = CE->getArguments();
690695
llvm::Value *Pos = emitExpr(Arguments[0])->load(Builder, CGM);
691-
llvm::Value *Ptr =
692-
Builder.CreateInBoundsGEP(CGM.getHeapBase(), {Pos}, "heap.cptr");
696+
llvm::Value *Ptr = Builder.CreateInBoundsGEP(
697+
CGM.getHeapBase()->getType()->getPointerElementType(), CGM.getHeapBase(),
698+
{Pos}, "heap.cptr");
693699
llvm::Value *Length = emitExpr(Arguments[1])->load(Builder, CGM);
694700
CGM.emitUpdateMemorySize(Pos, Length);
695701
CGM.emitFinish(Ptr, Builder.CreateZExtOrTrunc(Length, CGM.Int32Ty));
@@ -698,8 +704,9 @@ void CodeGenFunction::emitAsmCallReturn(const CallExpr *CE) {
698704
void CodeGenFunction::emitAsmCallRevert(const CallExpr *CE) {
699705
auto Arguments = CE->getArguments();
700706
llvm::Value *Pos = emitExpr(Arguments[0])->load(Builder, CGM);
701-
llvm::Value *Ptr =
702-
Builder.CreateInBoundsGEP(CGM.getHeapBase(), {Pos}, "heap.cptr");
707+
llvm::Value *Ptr = Builder.CreateInBoundsGEP(
708+
CGM.getHeapBase()->getType()->getPointerElementType(), CGM.getHeapBase(),
709+
{Pos}, "heap.cptr");
703710
llvm::Value *Length = emitExpr(Arguments[1])->load(Builder, CGM);
704711
CGM.emitUpdateMemorySize(Pos, Length);
705712
CGM.emitRevert(Ptr, Builder.CreateZExtOrTrunc(Length, CGM.Int32Ty));
@@ -714,8 +721,9 @@ void CodeGenFunction::emitAsmSelfDestruct(const CallExpr *CE) {
714721
void CodeGenFunction::emitAsmCallLog(const CallExpr *CE) {
715722
auto Arguments = CE->getArguments();
716723
llvm::Value *Pos = emitExpr(Arguments[0])->load(Builder, CGM);
717-
llvm::Value *Data =
718-
Builder.CreateInBoundsGEP(CGM.getHeapBase(), {Pos}, "heap.cptr");
724+
llvm::Value *Data = Builder.CreateInBoundsGEP(
725+
CGM.getHeapBase()->getType()->getPointerElementType(), CGM.getHeapBase(),
726+
{Pos}, "heap.cptr");
719727
llvm::Value *DataLength = emitExpr(Arguments[1])->load(Builder, CGM);
720728
std::vector<llvm::Value *> Topics;
721729
for (size_t I = 2; I < Arguments.size(); I++) {
@@ -739,8 +747,9 @@ llvm::Value *CodeGenFunction::emitAsmCallCallDataLoad(const CallExpr *CE) {
739747
void CodeGenFunction::emitAsmCallCodeCopy(const CallExpr *CE) {
740748
auto Arguments = CE->getArguments();
741749
llvm::Value *Pos = emitExpr(Arguments[0])->load(Builder, CGM);
742-
llvm::Value *Ptr =
743-
Builder.CreateInBoundsGEP(CGM.getHeapBase(), {Pos}, "heap.ptr");
750+
llvm::Value *Ptr = Builder.CreateInBoundsGEP(
751+
CGM.getHeapBase()->getType()->getPointerElementType(), CGM.getHeapBase(),
752+
{Pos}, "heap.ptr");
744753
llvm::Value *Code = Builder.CreateIntToPtr(
745754
emitExpr(Arguments[1])->load(Builder, CGM), Int8PtrTy);
746755
llvm::Value *Length = emitExpr(Arguments[2])->load(Builder, CGM);
@@ -802,8 +811,9 @@ llvm::Value *CodeGenFunction::emitAsmCallkeccak256(const CallExpr *CE) {
802811
// keccak256 function
803812
auto Arguments = CE->getArguments();
804813
llvm::Value *Pos = emitExpr(Arguments[0])->load(Builder, CGM);
805-
llvm::Value *Ptr =
806-
Builder.CreateInBoundsGEP(CGM.getHeapBase(), {Pos}, "heap.cptr");
814+
llvm::Value *Ptr = Builder.CreateInBoundsGEP(
815+
CGM.getHeapBase()->getType()->getPointerElementType(), CGM.getHeapBase(),
816+
{Pos}, "heap.cptr");
807817
llvm::Value *Length = emitExpr(Arguments[1])->load(Builder, CGM);
808818
CGM.emitUpdateMemorySize(Pos, Length);
809819
return CGM.emitKeccak256(Ptr, Length);
@@ -960,7 +970,7 @@ llvm::Value *CodeGenFunction::emitAsmCreate(const CallExpr *CE) {
960970
llvm::Value *AddressPtr = Builder.CreateAlloca(AddressTy);
961971

962972
CGM.emitCreate(ValuePtr, Ptr, Length, AddressPtr);
963-
return Builder.CreateLoad(AddressPtr, AddressTy);
973+
return Builder.CreateLoad(AddressTy, AddressPtr);
964974
}
965975

966976
llvm::Value *CodeGenFunction::emitAsmCreate2(const CallExpr *CE) {
@@ -977,7 +987,7 @@ llvm::Value *CodeGenFunction::emitAsmCreate2(const CallExpr *CE) {
977987
llvm::Value *AddressPtr = Builder.CreateAlloca(AddressTy);
978988

979989
CGM.emitCreate2(ValuePtr, Ptr, Length, Salt, AddressPtr);
980-
return Builder.CreateLoad(AddressPtr, AddressTy);
990+
return Builder.CreateLoad(AddressTy, AddressPtr);
981991
}
982992

983993
llvm::Value *CodeGenFunction::emitAsmByte(const CallExpr *CE) {
@@ -993,7 +1003,7 @@ llvm::Value *CodeGenFunction::emitAsmByte(const CallExpr *CE) {
9931003
llvm::Value *CodeGenFunction::emitAsmChainId(const CallExpr *CE) {
9941004
llvm::Value *ValPtr = Builder.CreateAlloca(Int128Ty, nullptr);
9951005
CGM.emitGetChainId(ValPtr);
996-
return Builder.CreateLoad(ValPtr, Int128Ty);
1006+
return Builder.CreateLoad(Int128Ty, ValPtr);
9971007
}
9981008

9991009
llvm::Value *CodeGenFunction::emitAsmLinkersymbol(const CallExpr *CE) {
@@ -1015,13 +1025,15 @@ void CodeGenFunction::emitAsmSetImmutable(const CallExpr *CE) {
10151025
llvm::Value *Offset = emitExpr(Arguments[0])->load(Builder, CGM);
10161026
llvm::Value *TableOffset = Builder.getInt(Map.lookup(StringRefName));
10171027
llvm::Value *ImmutableCPtr = Builder.CreateInBoundsGEP(
1028+
CGM.getImmutableBase()->getType()->getPointerElementType(),
10181029
CGM.getImmutableBase(), {TableOffset}, "immutable.cptr");
10191030
Builder.CreateStore(
10201031
Offset,
10211032
Builder.CreateBitCast(ImmutableCPtr, Int256PtrTy, "immutable.ptr"));
10221033

1023-
llvm::Value *HeapCPtr =
1024-
Builder.CreateInBoundsGEP(CGM.getHeapBase(), {Offset}, "heap.cptr");
1034+
llvm::Value *HeapCPtr = Builder.CreateInBoundsGEP(
1035+
CGM.getHeapBase()->getType()->getPointerElementType(),
1036+
CGM.getHeapBase(), {Offset}, "heap.cptr");
10251037
Builder.CreateStore(
10261038
Value, Builder.CreateBitCast(HeapCPtr, Int256PtrTy, "heap.ptr"));
10271039
CGM.emitUpdateMemorySize(Offset, Builder.getIntN(256, 0x20));
@@ -1044,13 +1056,17 @@ llvm::Value *CodeGenFunction::emitAsmLoadImmutable(const CallExpr *CE) {
10441056
if (Map.find(StringRefName) != Map.end()) {
10451057
llvm::Value *TableOffset = Builder.getInt(Map.lookup(StringRefName));
10461058
llvm::Value *ImmutableCPtr = Builder.CreateInBoundsGEP(
1059+
CGM.getImmutableBase()->getType()->getPointerElementType(),
10471060
CGM.getImmutableBase(), {TableOffset}, "immutable.cptr");
10481061
llvm::Value *Offset = Builder.CreateLoad(
1062+
CGM.Int256Ty,
10491063
Builder.CreateBitCast(ImmutableCPtr, Int256PtrTy, "immutable.ptr"));
10501064

1051-
llvm::Value *HeapCPtr =
1052-
Builder.CreateInBoundsGEP(CGM.getHeapBase(), {Offset}, "heap.cptr");
1065+
llvm::Value *HeapCPtr = Builder.CreateInBoundsGEP(
1066+
CGM.getHeapBase()->getType()->getPointerElementType(),
1067+
CGM.getHeapBase(), {Offset}, "heap.cptr");
10531068
return Builder.CreateLoad(
1069+
CGM.Int256Ty,
10541070
Builder.CreateBitCast(HeapCPtr, Int256PtrTy, "heap.ptr"));
10551071
}
10561072
}

0 commit comments

Comments
 (0)