Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ include_directories(BEFORE
include_directories("${LLVM_BINARY_DIR}/include" "${LLVM_INCLUDE_DIR}")
link_directories("${LLVM_LIBRARY_DIR}")

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_EXTENSIONS OFF)
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
Expand All @@ -57,6 +60,12 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
)
endif()

if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
add_compile_options(
-Wno-redundant-move
)
endif()

option(SOLL_INCLUDE_TESTS
"Generate build targets for the Soll unit tests."
${LLVM_INCLUDE_TESTS})
Expand Down
2 changes: 1 addition & 1 deletion include/soll/AST/ASTContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
#include "soll/Frontend/FrontendOptions.h"
#include <llvm/ADT/APInt.h>
#include <llvm/ADT/IntrusiveRefCntPtr.h>
#include <llvm/ADT/StringMap.h>
#include <llvm/IR/Value.h>

namespace soll {

class ASTContext : public llvm::RefCountedBase<ASTContext> {
Expand Down
3 changes: 1 addition & 2 deletions include/soll/AST/Decl.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ class Decl {
friend class ASTReader;

protected:
Decl(SourceRange L,
llvm::StringRef Name = llvm::StringRef::withNullAsEmpty(nullptr),
Decl(SourceRange L, llvm::StringRef Name = {},
Visibility vis = Visibility::Default)
: Location(L), Name(Name.str()), Vis(vis), UniqueName(Name.str()) {}

Expand Down
1 change: 1 addition & 0 deletions include/soll/Basic/DiagnosticSemaKinds.inc
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,4 @@ DIAG(err_visibility_not_match, CLASS_ERROR, (unsigned)diag::Severity::Error, "vi
DIAG(err_private_function_can_not_be_virtual, CLASS_ERROR, (unsigned)diag::Severity::Error, "private funtcion %0 can not be virtual", 0, false, 1)
DIAG(err_mutability_overriding_not_allow, CLASS_ERROR, (unsigned)diag::Severity::Error, "can not change function %0 mutability", 0, false, 1)
DIAG(err_func_to_var_overrided_unsoupport, CLASS_ERROR, (unsigned)diag::Severity::Error, "function to state variables override is unsupport", 0, false, 1)
DIAG(err_yul_access_special_object, CLASS_ERROR, (unsigned)diag::Severity::Error, "'%0' can not be access by 'datasize', 'dataoffset' or 'datacopy'.", 0, false, 1)
2 changes: 2 additions & 0 deletions include/soll/Basic/FileManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
#pragma once
#include "soll/Basic/FileSystemOptions.h"
#include <llvm/ADT/IntrusiveRefCntPtr.h>
#include <llvm/ADT/StringMap.h>
#include <llvm/Support/Allocator.h>
#include <llvm/Support/VirtualFileSystem.h>
#include <map>
#include <memory>
Expand Down
1 change: 1 addition & 0 deletions include/soll/Basic/IdentifierTable.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "soll/Basic/TokenKinds.h"
#include <llvm/ADT/StringMap.h>
#include <llvm/ADT/StringRef.h>
#include <llvm/Support/Allocator.h>

namespace soll {

Expand Down
31 changes: 18 additions & 13 deletions lib/CodeGen/ABICodec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ llvm::Value *AbiEmitter::emitEncodeTuple(
std::tie(Value, IsStateVariable) = Values[I];
if (Value->getType()->isDynamic()) {
DynamicPos.emplace_back(Int8Ptr, I);
Int8Ptr = Builder.CreateInBoundsGEP(Int8Ptr, {Builder.getIntN(32, 32)});
Int8Ptr = Builder.CreateInBoundsGEP(CGM.Int8Ty, Int8Ptr,
{Builder.getIntN(32, 32)});
} else {
Int8Ptr = emitEncode(Int8Ptr, Value, IsStateVariable);
}
Expand Down Expand Up @@ -96,7 +97,7 @@ AbiEmitter::getDecode(llvm::Value *Int8Ptr, const Type *Ty) {
Builder.getIntN(32, 32)),
Builder.getIntN(32, 32));
llvm::Value *NextInt8Ptr =
Builder.CreateInBoundsGEP(Int8Ptr, {EncodeLength});
Builder.CreateInBoundsGEP(CGM.Int8Ty, Int8Ptr, {EncodeLength});
return {ExprValue::getRValue(Ty, Val), NextInt8Ptr};
}
case Type::Category::Array: {
Expand Down Expand Up @@ -133,19 +134,20 @@ AbiEmitter::getDecode(llvm::Value *Int8Ptr, const Type *Ty) {
case Type::Category::FixedBytes: {
llvm::Value *ValPtr = Builder.CreatePointerCast(
Int8Ptr, llvm::PointerType::getUnqual(ValueTy));
llvm::Value *Val = Builder.CreateLoad(ValPtr, ValueTy);
llvm::Value *Val = Builder.CreateLoad(ValueTy, ValPtr);
llvm::Value *NextInt8Ptr =
Builder.CreateInBoundsGEP(Int8Ptr, {Builder.getInt32(32)});
Builder.CreateInBoundsGEP(CGM.Int8Ty, Int8Ptr, {Builder.getInt32(32)});
return {ExprValue::getRValue(Ty, Val), NextInt8Ptr};
}
default: {
llvm::Value *ValPtr = Builder.CreatePointerCast(
Int8Ptr, llvm::PointerType::getUnqual(CGM.Int256Ty));
llvm::Value *Val = Builder.CreateLoad(ValPtr, CGM.Int256Ty);
llvm::Value *Val = Builder.CreateLoad(CGM.Int256Ty, ValPtr);
Val = CGM.getEndianlessValue(Val);
Val = Builder.CreateZExtOrTrunc(Val, ValueTy);
llvm::Value *NextInt8Ptr = Builder.CreateInBoundsGEP(
Int8Ptr, {Builder.getInt32(ValueTy->getIntegerBitWidth() / 8)});
CGM.Int8Ty, Int8Ptr,
{Builder.getInt32(ValueTy->getIntegerBitWidth() / 8)});
return {ExprValue::getRValue(Ty, Val), NextInt8Ptr};
}
}
Expand All @@ -162,7 +164,8 @@ AbiEmitter::getDecodeTuple(llvm::Value *Int8Ptr, const TupleType *Ty) {
ExprValuePtr PosExprValue;
std::tie(PosExprValue, NextInt8Ptr) = getDecode(NextInt8Ptr, &Int32Ty);
llvm::Value *Pos = PosExprValue->load(Builder, CGM);
DynamicPos.emplace_back(Builder.CreateInBoundsGEP(Int8Ptr, {Pos}), I);
DynamicPos.emplace_back(
Builder.CreateInBoundsGEP(CGM.Int8Ty, Int8Ptr, {Pos}), I);
} else {
ExprValuePtr ValExprValue;
std::tie(ValExprValue, NextInt8Ptr) =
Expand Down Expand Up @@ -464,7 +467,7 @@ llvm::Value *AbiEmitter::emitEncodePacked(llvm::Value *Int8Ptr,
unsigned PadRightLength = 32 - FixedBytesTy->getBitNum() / 8;
if (PadRightLength % 32)
Int8Ptr = Builder.CreateInBoundsGEP(
Int8Ptr, {Builder.getIntN(32, PadRightLength)});
CGM.Int8Ty, Int8Ptr, {Builder.getIntN(32, PadRightLength)});
}
return Int8Ptr;
}
Expand Down Expand Up @@ -502,7 +505,7 @@ llvm::Value *AbiEmitter::emitEncode(llvm::Value *Int8Ptr,
Int8Ptr = copyToInt8Ptr(
Int8Ptr, Builder.CreateZExtOrTrunc(Length, CGF.Int256Ty), true);
Int8Ptr = copyToInt8Ptr(Int8Ptr, Bytes, true);
return Builder.CreateInBoundsGEP(Int8Ptr, {PadRightLength});
return Builder.CreateInBoundsGEP(CGM.Int8Ty, Int8Ptr, {PadRightLength});
}
case Type::Category::Array: {
llvm::Function *ThisFunc = Builder.GetInsertBlock()->getParent();
Expand Down Expand Up @@ -530,7 +533,8 @@ llvm::Value *AbiEmitter::emitEncode(llvm::Value *Int8Ptr,
if (ArrTy->getElementType()->isDynamic()) {
Head = Int8Ptr;
Tail = Builder.CreateInBoundsGEP(
Head, {Builder.CreateMul(ArrayLength, ABIStaticSizeValue)});
CGM.Int8Ty, Head,
{Builder.CreateMul(ArrayLength, ABIStaticSizeValue)});
} else {
Tail = Int8Ptr;
}
Expand Down Expand Up @@ -606,7 +610,7 @@ llvm::Value *AbiEmitter::emitEncode(llvm::Value *Int8Ptr,
unsigned PadRightLength = 32 - FixedBytesTy->getBitNum() / 8;
if (PadRightLength % 32)
Int8Ptr = Builder.CreateInBoundsGEP(
Int8Ptr, {Builder.getIntN(32, PadRightLength)});
CGM.Int8Ty, Int8Ptr, {Builder.getIntN(32, PadRightLength)});
return Int8Ptr;
}
default: {
Expand All @@ -627,15 +631,16 @@ llvm::Value *AbiEmitter::copyToInt8Ptr(llvm::Value *Int8Ptr, llvm::Value *Value,
Builder.CreateCall(Memcpy, {Builder.CreateBitCast(Int8Ptr, CGM.Int8PtrTy),
SrcBytes, Length});
if (IncreasePtr)
return Builder.CreateInBoundsGEP(Int8Ptr, {Length});
return Builder.CreateInBoundsGEP(CGM.Int8Ty, Int8Ptr, {Length});
} else {
Value = CGM.getEndianlessValue(Value);
llvm::Value *CPtr =
Builder.CreatePointerCast(Int8Ptr, llvm::PointerType::getUnqual(Ty));
Builder.CreateStore(Value, CPtr);
if (IncreasePtr)
return Builder.CreateInBoundsGEP(
Int8Ptr, {Builder.getInt32(Ty->getIntegerBitWidth() / 8)});
CGM.Int8Ty, Int8Ptr,
{Builder.getInt32(Ty->getIntegerBitWidth() / 8)});
}
return nullptr;
}
Expand Down
32 changes: 19 additions & 13 deletions lib/CodeGen/BackendUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "soll/Basic/TargetOptions.h"
#include "soll/CodeGen/LoweringInteger.h"
#include <llvm/ADT/Triple.h>
#include <llvm/Analysis/AliasAnalysis.h>
#include <llvm/Analysis/TargetLibraryInfo.h>
#include <llvm/Analysis/TargetTransformInfo.h>
#include <llvm/Bitcode/BitcodeWriterPass.h>
Expand Down Expand Up @@ -142,16 +143,16 @@ void EmitAssemblyHelper::EmitAssembly(
TheModule->setDataLayout(TM->createDataLayout());
}

#if LLVM_VERSION_MAJOR >= 9
llvm::PassBuilder PB(TM.get(), llvm::PipelineTuningOptions(), llvm::None);
#if LLVM_VERSION_MAJOR == 12
llvm::PassBuilder PB(false, TM.get());
#else
llvm::PassBuilder PB(TM.get(), llvm::None);
llvm::PassBuilder PB(TM.get());
#endif

llvm::LoopAnalysisManager LAM(false);
llvm::FunctionAnalysisManager FAM(false);
llvm::CGSCCAnalysisManager CGAM(false);
llvm::ModuleAnalysisManager MAM(false);
llvm::LoopAnalysisManager LAM;
llvm::FunctionAnalysisManager FAM;
llvm::CGSCCAnalysisManager CGAM;
llvm::ModuleAnalysisManager MAM;

// Register the AA manager first so that our version is the one used.
FAM.registerPass([&] { return PB.buildDefaultAAPipeline(); });
Expand All @@ -173,7 +174,7 @@ void EmitAssemblyHelper::EmitAssembly(
PB.registerLoopAnalyses(LAM);
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);

llvm::ModulePassManager MPM(false);
llvm::ModulePassManager MPM;

if (TargetOpts.BackendTarget == EWASM) {
MPM.addPass(LoweringInteger());
Expand All @@ -183,19 +184,24 @@ void EmitAssemblyHelper::EmitAssembly(
default:
break;
case O1:
MPM.addPass(PB.buildPerModuleDefaultPipeline(llvm::PassBuilder::O1));
MPM.addPass(PB.buildPerModuleDefaultPipeline(
llvm::PassBuilder::OptimizationLevel::O1));
break;
case O2:
MPM.addPass(PB.buildPerModuleDefaultPipeline(llvm::PassBuilder::O2));
MPM.addPass(PB.buildPerModuleDefaultPipeline(
llvm::PassBuilder::OptimizationLevel::O2));
break;
case O3:
MPM.addPass(PB.buildPerModuleDefaultPipeline(llvm::PassBuilder::O3));
MPM.addPass(PB.buildPerModuleDefaultPipeline(
llvm::PassBuilder::OptimizationLevel::O3));
break;
case Os:
MPM.addPass(PB.buildPerModuleDefaultPipeline(llvm::PassBuilder::Os));
MPM.addPass(PB.buildPerModuleDefaultPipeline(
llvm::PassBuilder::OptimizationLevel::Os));
break;
case Oz:
MPM.addPass(PB.buildPerModuleDefaultPipeline(llvm::PassBuilder::Oz));
MPM.addPass(PB.buildPerModuleDefaultPipeline(
llvm::PassBuilder::OptimizationLevel::Oz));
break;
}
MPM.addPass(llvm::AlwaysInlinerPass());
Expand Down
Loading