зеркало из https://github.com/dotnet/llilc.git
Merge pull request #417 from AndyAyersMS/Localloc
Implement support for localloc.
This commit is contained in:
Коммит
b60b5bf718
|
@ -368,9 +368,7 @@ public:
|
|||
ReaderAlignType Alignment, bool IsVolatile) override;
|
||||
|
||||
IRNode *loadNull() override;
|
||||
IRNode *localAlloc(IRNode *Arg, bool ZeroInit) override {
|
||||
throw NotYetImplementedException("localAlloc");
|
||||
};
|
||||
IRNode *localAlloc(IRNode *Arg, bool ZeroInit) override;
|
||||
IRNode *loadFieldAddress(CORINFO_RESOLVED_TOKEN *ResolvedToken,
|
||||
IRNode *Obj) override;
|
||||
|
||||
|
|
|
@ -38,14 +38,23 @@ if (WIN32)
|
|||
${LLILCJIT_EXPORTS_DEF_TEMP} ${LLILCJIT_EXPORTS_DEF})
|
||||
|
||||
set(SHARED_LIB_SOURCES ${SOURCES} ${LLILCJIT_EXPORTS_DEF})
|
||||
|
||||
# For windows we need to specify the CoreCLR environment
|
||||
set(LLILC_TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}-coreclr")
|
||||
else()
|
||||
if (UNIX)
|
||||
set(LLILCJIT_LINK_LIBRARIES ${LLILCJIT_LINK_LIBRARIES} coreclrpal)
|
||||
endif()
|
||||
|
||||
set(SHARED_LIB_SOURCES ${SOURCES})
|
||||
|
||||
# For non-windows we can use the default triple for now
|
||||
set(LLILC_TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
|
||||
endif()
|
||||
|
||||
message(STATUS "LLILC_TARGET_TRIPLE is ${LLILC_TARGET_TRIPLE}")
|
||||
add_definitions(-DLLILC_TARGET_TRIPLE="${LLILC_TARGET_TRIPLE}")
|
||||
|
||||
set(LLVM_EXPORTED_SYMBOL_FILE ${LLILCJIT_EXPORTS_DEF})
|
||||
|
||||
add_llilcjit_library(
|
||||
|
|
|
@ -170,7 +170,7 @@ CorJitResult LLILCJit::compileMethod(ICorJitInfo *JitInfo,
|
|||
Context.LLVMContext = &PerThreadState->LLVMContext;
|
||||
std::unique_ptr<Module> M = Context.getModuleForMethod(MethodInfo);
|
||||
Context.CurrentModule = M.get();
|
||||
Context.CurrentModule->setTargetTriple(LLVM_DEFAULT_TARGET_TRIPLE);
|
||||
Context.CurrentModule->setTargetTriple(LLILC_TARGET_TRIPLE);
|
||||
Context.TheABIInfo = ABIInfo::get(*Context.CurrentModule);
|
||||
|
||||
// Initialize per invocation JIT options. This should be done after the
|
||||
|
|
|
@ -5424,6 +5424,29 @@ bool GenIR::abs(IRNode *Argument, IRNode **Result) {
|
|||
return false;
|
||||
}
|
||||
|
||||
IRNode *GenIR::localAlloc(IRNode *Arg, bool ZeroInit) {
|
||||
// Note that we've seen a localloc in this method, since it has repercussions
|
||||
// on other aspects of code generation.
|
||||
this->HasLocAlloc = true;
|
||||
|
||||
// Arg is the number of bytes to allocate. Result must be pointer-aligned.
|
||||
const unsigned int Alignment = TargetPointerSizeInBits / 8;
|
||||
LLVMContext &Context = *JitContext->LLVMContext;
|
||||
Type *Ty = Type::getInt8Ty(Context);
|
||||
AllocaInst *LocAlloc = LLVMBuilder->CreateAlloca(Ty, Arg, "LocAlloc");
|
||||
LocAlloc->setAlignment(Alignment);
|
||||
|
||||
// Zero the allocated region if so requested.
|
||||
if (ZeroInit) {
|
||||
Value *ZeroByte = ConstantInt::get(Context, APInt(8, 0, true));
|
||||
Type *VoidTy = Type::getVoidTy(Context);
|
||||
callHelperImpl(CORINFO_HELP_MEMSET, VoidTy, (IRNode *)LocAlloc,
|
||||
(IRNode *)ZeroByte, Arg);
|
||||
}
|
||||
|
||||
return (IRNode *)LocAlloc;
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
|
||||
#pragma region STACK MAINTENANCE
|
||||
|
|
Загрузка…
Ссылка в новой задаче