Advertisement
Guest User

Untitled

a guest
May 23rd, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.20 KB | None | 0 0
  1. declare void @printInt(i32)
  2. declare i8* @calloc(i32, i32)
  3.  
  4. %arr = type { i32, [ 0 x i32 ] }*
  5. %arr2 = type { i32, [ 0 x %arr ] }*
  6. %arr3 = type { i32, [ 0 x %arr2 ] }*
  7.  
  8. ; int main() {
  9. ; int[][][] arr = new int[1][2][3];
  10. ; printInt(arr[0][1][2]);
  11. ; printInt(arr.length);
  12. ; printInt(arr[0].length);
  13. ; printInt(arr[0][0].length);
  14. ; return 0;
  15. ; }
  16.  
  17. define i32 @main() {
  18. entry:
  19.  
  20. ; ----------------------------------------------------------------------
  21. ; int*** arr
  22.  
  23. %c3 = call i8* @calloc(i32 50, i32 1)
  24. %a3 = bitcast i8* %c3 to %arr3
  25.  
  26. ; ----------------------------------------------------------------------
  27. ; arr.length = 1
  28.  
  29. %sp2 = getelementptr %arr3 %a3, i32 0, i32 0
  30. store i32 1, i32* %sp2
  31.  
  32. ; ----------------------------------------------------------------------
  33. ; a[0] = new int[2]
  34.  
  35. %c11 = call i8* @calloc(i32 50, i32 1)
  36. %a11 = bitcast i8* %c11 to %arr2
  37. %ap1 = getelementptr %arr3 %a3, i32 0, i32 1, i32 0
  38. store %arr2 %a11, %arr2* %ap1
  39.  
  40. ; arr[0].length = 2
  41.  
  42. %sp21 = getelementptr %arr3 %a3, i32 0, i32 1, i32 0
  43. %t0 = load %arr2* %sp21
  44. %t1 = getelementptr %arr2 %t0, i32 0, i32 0
  45. store i32 2, i32* %t1
  46.  
  47. ; a[0][0] = new int[3]
  48. ; a[0][1] = new int[3]
  49.  
  50. %c00 = call i8* @calloc(i32 50, i32 1)
  51. %c01 = call i8* @calloc(i32 50, i32 1)
  52.  
  53. %a00 = bitcast i8* %c00 to %arr
  54. %a01 = bitcast i8* %c01 to %arr
  55.  
  56. %p00 = getelementptr %arr2 %a11, i32 0, i32 1, i32 0
  57. %p01 = getelementptr %arr2 %a11, i32 0, i32 1, i32 0
  58.  
  59. store %arr %a00, %arr* %p00
  60. store %arr %a01, %arr* %p01
  61.  
  62. ; arr[0][0].length = 3
  63.  
  64. %sp22 = getelementptr %arr3 %a3, i32 0, i32 1, i32 0
  65. %t00 = load %arr2* %sp22
  66. %t01 = getelementptr %arr2 %t00, i32 0, i32 1, i32 1
  67. %t02 = load %arr* %t01
  68. %t03 = getelementptr %arr %t02, i32 0, i32 0
  69. store i32 3, i32* %t03
  70.  
  71. ; ----------------------------------------------------------------------
  72. ; arr[0][0] = 1
  73. ; arr[0][1] = 2
  74. ; ...
  75. ; arr[1][2] = 6
  76.  
  77. ; call void @setElem(%arr3 %a3, i32 0, i32 0, i32 0, i32 1)
  78. ; call void @setElem(%arr2 %a2, i32 0, i32 1, i32 2)
  79. ; call void @setElem(%arr2 %a2, i32 0, i32 2, i32 3)
  80. ;
  81. ; call void @setElem(%arr2 %a2, i32 1, i32 0, i32 4)
  82. ; call void @setElem(%arr2 %a2, i32 1, i32 1, i32 5)
  83. ; call void @setElem(%arr2 %a2, i32 1, i32 2, i32 6)
  84.  
  85. ; call void @setElem(%arr2 %a2, i32 0, i32 0, i32 2147483647)
  86. ; call void @setElem(%arr2 %a2, i32 0, i32 1, i32 2147483647)
  87. ; call void @setElem(%arr2 %a2, i32 0, i32 2, i32 2147483647)
  88. ;
  89. ; call void @setElem(%arr2 %a2, i32 1, i32 0, i32 2147483647)
  90. ; call void @setElem(%arr2 %a2, i32 1, i32 1, i32 2147483647)
  91. ; call void @setElem(%arr2 %a2, i32 1, i32 2, i32 2147483647)
  92.  
  93. ; ----------------------------------------------------------------------
  94. ; print arr
  95.  
  96. ; call void @printElem(%arr3 %a3, i32 0, i32 0, i32 0)
  97. ; call void @printElem(%arr2 %a2, i32 0, i32 1)
  98. ; call void @printElem(%arr2 %a2, i32 0, i32 2)
  99. ;
  100. ; call void @printElem(%arr2 %a2, i32 1, i32 0)
  101. ; call void @printElem(%arr2 %a2, i32 1, i32 1)
  102. ; call void @printElem(%arr2 %a2, i32 1, i32 2)
  103.  
  104. ; ----------------------------------------------------------------------
  105. ; printInt(a.length)
  106.  
  107. %l = call i32 @getLen(%arr3 %a3)
  108. call void @printInt(i32 %l)
  109.  
  110. ; printInt(a[0].length)
  111.  
  112. %l0 = call i32 @getLen2(%arr3 %a3)
  113. call void @printInt(i32 %l0)
  114.  
  115. ; printInt(a[0][0].length)
  116.  
  117. %l00 = call i32 @getLen3(%arr3 %a3)
  118. call void @printInt(i32 %l00)
  119.  
  120. ret i32 0
  121. }
  122.  
  123. ; return [i][j][k]
  124. define i32 @getElem (%arr3 %m, i32 %i, i32 %j, i32 %k) {
  125. %p1 = getelementptr %arr3 %m, i32 0, i32 1, i32 %i
  126. %p2 = load %arr2* %p1
  127. %p3 = getelementptr %arr2 %p2, i32 0, i32 1, i32 %j
  128. %p4 = load %arr* %p3
  129. %p5 = getelementptr %arr %p4, i32 0, i32 1, i32 %k
  130. %p6 = load i32* %p5
  131. ret i32 %p6
  132. }
  133.  
  134. ; printInt(arr[i][j][k])
  135. define void @printElem (%arr3 %m, i32 %i, i32 %j, i32 %k) {
  136. %x = call i32 @getElem(%arr3 %m, i32 %i, i32 %j, i32 %k)
  137. call void @printInt(i32 %x)
  138. ret void
  139. }
  140.  
  141. ; arr[i][j][k] = x
  142. define void @setElem (%arr3 %m, i32 %i, i32 %j, i32 %k, i32 %x) {
  143. %p1 = getelementptr %arr3 %m, i32 0, i32 1, i32 %i
  144. %p2 = load %arr2* %p1
  145. %p3 = getelementptr %arr2 %p2, i32 0, i32 1, i32 %j
  146. %p4 = load %arr* %p3
  147. %p5 = getelementptr %arr %p4, i32 0, i32 1, i32 %k
  148. store i32 %x, i32* %p5
  149. ret void
  150. }
  151.  
  152. ; ----------------------------------------------------------------------
  153. ; Length
  154.  
  155. ; arr.length
  156. define i32 @getLen (%arr3 %m) {
  157. %p1 = getelementptr %arr3 %m, i32 0, i32 0
  158. %p2 = load i32* %p1
  159. ret i32 %p2
  160. }
  161.  
  162. ; arr[0].length
  163. define i32 @getLen2 (%arr3 %m) {
  164. %p1 = getelementptr %arr3 %m, i32 0, i32 1, i32 0
  165. %p2 = load %arr2* %p1
  166. %p3 = getelementptr %arr2 %p2, i32 0, i32 0
  167. %p4 = load i32* %p3
  168. ret i32 %p4
  169. }
  170.  
  171. ; arr[0][0].length
  172. define i32 @getLen3 (%arr3 %m) {
  173. %p1 = getelementptr %arr3 %m, i32 0, i32 1, i32 0
  174. %p2 = load %arr2* %p1
  175. %p3 = getelementptr %arr2 %p2, i32 0, i32 0
  176. %p4 = load i32* %p3
  177. ret i32 %p4
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement