array-aligned.ll 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. ; RUN: opt -safe-stack -S -mtriple=i386-pc-linux-gnu < %s -o - | FileCheck %s
  2. ; RUN: opt -safe-stack -S -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck %s
  3. @.str = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1
  4. ; array of [16 x i8]
  5. define void @foo(i8* %a) nounwind uwtable safestack {
  6. entry:
  7. ; CHECK: %[[USP:.*]] = load i8*, i8** @__safestack_unsafe_stack_ptr
  8. ; CHECK: %[[USST:.*]] = getelementptr i8, i8* %[[USP]], i32 -16
  9. ; CHECK: store i8* %[[USST]], i8** @__safestack_unsafe_stack_ptr
  10. ; CHECK: %[[AADDR:.*]] = alloca i8*, align 8
  11. %a.addr = alloca i8*, align 8
  12. ; CHECK: %[[BUFPTR:.*]] = getelementptr i8, i8* %[[USP]], i32 -16
  13. ; CHECK: %[[BUFPTR2:.*]] = bitcast i8* %[[BUFPTR]] to [16 x i8]*
  14. %buf = alloca [16 x i8], align 16
  15. ; CHECK: store i8* {{.*}}, i8** %[[AADDR]], align 8
  16. store i8* %a, i8** %a.addr, align 8
  17. ; CHECK: %[[GEP:.*]] = getelementptr inbounds [16 x i8], [16 x i8]* %[[BUFPTR2]], i32 0, i32 0
  18. %gep = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0
  19. ; CHECK: %[[A2:.*]] = load i8*, i8** %[[AADDR]], align 8
  20. %a2 = load i8*, i8** %a.addr, align 8
  21. ; CHECK: call i8* @strcpy(i8* %[[GEP]], i8* %[[A2]])
  22. %call = call i8* @strcpy(i8* %gep, i8* %a2)
  23. ; CHECK: store i8* %[[USP]], i8** @__safestack_unsafe_stack_ptr
  24. ret void
  25. }
  26. declare i8* @strcpy(i8*, i8*)