diff --git a/lib/AST/IRToASTVisitor.cpp b/lib/AST/IRToASTVisitor.cpp index 8e033d61..c34f5fd2 100755 --- a/lib/AST/IRToASTVisitor.cpp +++ b/lib/AST/IRToASTVisitor.cpp @@ -181,8 +181,42 @@ void ExprGen::VisitGlobalVar(llvm::GlobalVariable &gvar) { } } +static bool IsGVarAString(llvm::GlobalVariable *gvar) { + if (!gvar->hasInitializer()) { + return false; + } + + auto constant{gvar->getInitializer()}; + // Check if constant can be considered a string literal + auto arr_type{llvm::dyn_cast(constant->getType())}; + if (!arr_type) { + return false; + } + + auto elm_type{arr_type->getElementType()}; + if (!elm_type->isIntegerTy(8U)) { + return false; + } + + auto arr{llvm::dyn_cast(constant)}; + if (!arr) { + return false; + } + + auto init{arr->getAsString().str()}; + if (init.find('\0') != init.size() - 1) { + return false; + } + + return true; +} + clang::Expr *ExprGen::CreateConstantExpr(llvm::Constant *constant) { if (auto gvar = llvm::dyn_cast(constant)) { + if (IsGVarAString(gvar)) { + auto arr{llvm::cast(gvar->getInitializer())}; + return ast.CreateStrLit(arr->getAsString().str().c_str()); + } VisitGlobalVar(*gvar); } @@ -518,33 +552,7 @@ clang::Expr *ExprGen::visitGetElementPtrInst(llvm::GetElementPtrInst &inst) { return false; } - if (!gvar->hasInitializer()) { - return false; - } - - auto constant{gvar->getInitializer()}; - // Check if constant can be considered a string literal - auto arr_type{llvm::dyn_cast(constant->getType())}; - if (!arr_type) { - return false; - } - - auto elm_type{arr_type->getElementType()}; - if (!elm_type->isIntegerTy(8U)) { - return false; - } - - auto arr{llvm::dyn_cast(constant)}; - if (!arr) { - return false; - } - - auto init{arr->getAsString().str()}; - if (init.find('\0') != init.size() - 1) { - return false; - } - - return true; + return IsGVarAString(gvar); }; // Maybe we're inspecting a string reference