Alberto Barbaro via llvm-dev
2019-Jul-17 19:41 UTC
[llvm-dev] Help to understand LoadValueFromMemory
Hi all, I'm trying to print to screen the value read by the fread function. I'm at the point where source refers to the GetElementPtrInst ( pointer to the buffer where fread stored the data - %5 in my case ) and the fread() has been already called. I thought the correct approach to achieve what I need was: ExecutionContext& SF = ECStack.back(); GenericValue SRC = getOperandValue(source, SF); GenericValue* Ptr = (GenericValue*)GVTOP(SRC); GenericValue Result; source->getPointerOperand()->getType()->dump(); //[40 x i8]* LoadValueFromMemory(Result, Ptr, source->getPointerOperand()->getType()); and use Result.PointerVal ... In the end I have the first 4 bytes within Result.PointrVal but I cannot see the other bytes.. Unfortunately also Result.AggregateVal has size 0. Could you help me to understand why please? The core part of the .ll is the following: define i32 @main() #0 { %1 = alloca i32, align 4 %2 = alloca %struct._IO_FILE*, align 8 %3 = alloca [40 x i8], align 16 store i32 0, i32* %1, align 4 %4 = call %struct._IO_FILE* @fopen(i8* getelementptr inbounds ([51 x i8], [51 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i32 0, i32 0)) store %struct._IO_FILE* %4, %struct._IO_FILE** %2, align 8 * %5 = getelementptr inbounds [40 x i8], [40 x i8]* %3, i32 0, i32 0* %6 = load %struct._IO_FILE*, %struct._IO_FILE** %2, align 8 *%7 = call i64 @fread(i8* %5, i64 30, i64 1, %struct._IO_FILE* %6)* %8 = load %struct._IO_FILE*, %struct._IO_FILE** %2, align 8 %9 = call i32 @fclose(%struct._IO_FILE* %8) %10 = getelementptr inbounds [40 x i8], [40 x i8]* %3, i64 0, i64 0 %11 = load i8, i8* %10, align 16 %12 = sext i8 %11 to i32 %13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.2, i32 0, i32 0), i32 %12) %14 = getelementptr inbounds [40 x i8], [40 x i8]* %3, i64 0, i64 0 %15 = load i8, i8* %14, align 16 %16 = sext i8 %15 to i32 ret i32 %16 } Thanks -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190717/4488f136/attachment.html>
Alberto Barbaro via llvm-dev
2019-Jul-17 19:44 UTC
[llvm-dev] Help to understand LoadValueFromMemory
Hi all, sorry I forgot to mention that I understood that the LoadValueFromMemory would execute only: case Type::PointerTyID: Result.PointerVal = *((PointerTy*)Ptr); break; I think this should not be the case considering that Type I think is a Vector. Thanks Il giorno mer 17 lug 2019 alle ore 20:41 Alberto Barbaro < barbaro.alberto at gmail.com> ha scritto:> Hi all, > I'm trying to print to screen the value read by the fread function. I'm at > the point where source refers to the GetElementPtrInst ( pointer to the > buffer where fread stored the data - %5 in my case ) and the fread() has > been already called. > > I thought the correct approach to achieve what I need was: > > ExecutionContext& SF = ECStack.back(); > GenericValue SRC = getOperandValue(source, SF); > GenericValue* Ptr = (GenericValue*)GVTOP(SRC); > GenericValue Result; > > source->getPointerOperand()->getType()->dump(); //[40 x i8]* > > LoadValueFromMemory(Result, Ptr, source->getPointerOperand()->getType()); > > and use Result.PointerVal ... > > In the end I have the first 4 bytes within Result.PointrVal but I cannot > see the other bytes.. Unfortunately also Result.AggregateVal has size 0. > > Could you help me to understand why please? > > The core part of the .ll is the following: > > define i32 @main() #0 { > %1 = alloca i32, align 4 > %2 = alloca %struct._IO_FILE*, align 8 > %3 = alloca [40 x i8], align 16 > store i32 0, i32* %1, align 4 > %4 = call %struct._IO_FILE* @fopen(i8* getelementptr inbounds ([51 x > i8], [51 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([3 x i8], > [3 x i8]* @.str.1, i32 0, i32 0)) > store %struct._IO_FILE* %4, %struct._IO_FILE** %2, align 8 > * %5 = getelementptr inbounds [40 x i8], [40 x i8]* %3, i32 0, i32 0* > %6 = load %struct._IO_FILE*, %struct._IO_FILE** %2, align 8 > *%7 = call i64 @fread(i8* %5, i64 30, i64 1, %struct._IO_FILE* %6)* > %8 = load %struct._IO_FILE*, %struct._IO_FILE** %2, align 8 > %9 = call i32 @fclose(%struct._IO_FILE* %8) > %10 = getelementptr inbounds [40 x i8], [40 x i8]* %3, i64 0, i64 0 > %11 = load i8, i8* %10, align 16 > %12 = sext i8 %11 to i32 > %13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], > [9 x i8]* @.str.2, i32 0, i32 0), i32 %12) > %14 = getelementptr inbounds [40 x i8], [40 x i8]* %3, i64 0, i64 0 > %15 = load i8, i8* %14, align 16 > %16 = sext i8 %15 to i32 > ret i32 %16 > } > > Thanks > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190717/f251288e/attachment-0001.html>
Tim Northover via llvm-dev
2019-Jul-18 08:11 UTC
[llvm-dev] Help to understand LoadValueFromMemory
On Wed, 17 Jul 2019 at 20:44, Alberto Barbaro via llvm-dev <llvm-dev at lists.llvm.org> wrote:> I think this should not be the case considering that Type I think is a Vector.But from your own code:> source->getPointerOperand()->getType()->dump(); //[40 x i8]*[40 x i8]* is a pointer to an array. LoadValueFromMemory doesn't seem to support loading an array type directly, so you either have to load all bytes individually or use "(char *) Ptr->PointerVal". At least it looks like that second one ought to work from the implementation of LoadValueFromMemory. Cheers. Tim.