Open sbkim28 opened 6 months ago
안녕하세요, 특정 소스코드를 컴파일할 때, Segmentation fault가 발생하는 현상을 확인하여 제보하고자 합니다.
다음의 c 코드를 제공해주신 skeleton compiler로 컴파일하면 segmentation fault가 발생합니다.
#include <stdint.h> #include <stdlib.h> int64_t read(); void write(int64_t); extern uint64_t *root, n1, n2, n3; uint64_t foo() { uint64_t *cur = root; while (1) { if (cur == NULL) return 0; uint64_t v = *cur; uint64_t* c1 = (uint64_t*)*(cur + 1); uint64_t* c2 = (uint64_t*)*(cur + 2); if (n1) { cur = c1; continue; } if (n2) { cur = c2; continue; } if (!c1) { return 1; } if (!c2) { return 1; } cur = 0; } } int main() { root = 0; n1 = n2 = n3 = 0; }
register_allocate 부분에서 문제가 발생하는 것 같습니다. 디버거를 이용해 확인해보니, 포인터 타입의 Phi Node에서 llvm::dyn_cast<llvm::IntegerType>(type)이 null이 되어 문제가 발생하는 것으로 추정됩니다.
llvm::dyn_cast<llvm::IntegerType>(type)
llvm::Value *v = phi->getIncomingValue(i); llvm::Type *type = v->getType(); if (!type->isIntegerTy()) v = llvm::CastInst::CreateBitOrPointerCast(v, Int64Ty, "", t); const auto cst_1 = CM->resolve_constant( I->getFunction(), llvm::dyn_cast<llvm::IntegerType>(type), 1, I);
해당 문제에 대해서 확인해주셨으면 합니다. 감사합니다.
const 중복 emit 방지를 위한 constant resolution 과정에서 포인터에 상수가 들어가는 경우를 제대로 처리하지 못해 발생하는 문제로 보입니다. 버그가 맞으며 수정될 예정입니다.
const
5/9일자 백엔드 패치에서 수정되었습니다.
안녕하세요, 특정 소스코드를 컴파일할 때, Segmentation fault가 발생하는 현상을 확인하여 제보하고자 합니다.
다음의 c 코드를 제공해주신 skeleton compiler로 컴파일하면 segmentation fault가 발생합니다.
register_allocate 부분에서 문제가 발생하는 것 같습니다. 디버거를 이용해 확인해보니, 포인터 타입의 Phi Node에서
llvm::dyn_cast<llvm::IntegerType>(type)
이 null이 되어 문제가 발생하는 것으로 추정됩니다.해당 문제에 대해서 확인해주셨으면 합니다. 감사합니다.