/test/Driver/pic.c

https://gitlab.com/pranith/clang · C · 211 lines · 0 code · 0 blank · 211 comment · 0 complexity · e432a82d2811273ce2d53882a033fc4e MD5 · raw file

  1. // Test the driver's control over the PIC behavior. These consist of tests of
  2. // the relocation model flags and the pic level flags passed to CC1.
  3. //
  4. // CHECK-NO-PIC: "-mrelocation-model" "static"
  5. // CHECK-NO-PIC-NOT: "-pic-level"
  6. // CHECK-NO-PIC-NOT: "-pie-level"
  7. //
  8. // CHECK-PIC1: "-mrelocation-model" "pic"
  9. // CHECK-PIC1: "-pic-level" "1"
  10. //
  11. // CHECK-PIC2: "-mrelocation-model" "pic"
  12. // CHECK-PIC2: "-pic-level" "2"
  13. //
  14. // CHECK-PIE1: "-mrelocation-model" "pic"
  15. // CHECK-PIE1: "-pic-level" "1"
  16. // CHECK-PIE1: "-pie-level" "1"
  17. //
  18. // CHECK-PIE2: "-mrelocation-model" "pic"
  19. // CHECK-PIE2: "-pic-level" "2"
  20. // CHECK-PIE2: "-pie-level" "2"
  21. //
  22. // CHECK-PIE-LD: "{{.*}}ld{{(.exe)?}}"
  23. // CHECK-PIE-LD: "-pie"
  24. // CHECK-PIE-LD: "Scrt1.o" "crti.o" "crtbeginS.o"
  25. // CHECK-PIE-LD: "crtendS.o" "crtn.o"
  26. //
  27. // CHECK-NOPIE-LD: "-nopie"
  28. //
  29. // CHECK-DYNAMIC-NO-PIC-32: "-mrelocation-model" "dynamic-no-pic"
  30. // CHECK-DYNAMIC-NO-PIC-32-NOT: "-pic-level"
  31. // CHECK-DYNAMIC-NO-PIC-32-NOT: "-pie-level"
  32. //
  33. // CHECK-DYNAMIC-NO-PIC-64: "-mrelocation-model" "dynamic-no-pic"
  34. // CHECK-DYNAMIC-NO-PIC-64: "-pic-level" "2"
  35. // CHECK-DYNAMIC-NO-PIC-64-NOT: "-pie-level"
  36. //
  37. // CHECK-NON-DARWIN-DYNAMIC-NO-PIC: error: unsupported option '-mdynamic-no-pic' for target 'i386-unknown-unknown'
  38. //
  39. // CHECK-NO-PIE-NOT: "-pie"
  40. //
  41. // CHECK-NO-UNUSED-ARG-NOT: argument unused during compilation
  42. //
  43. // RUN: %clang -c %s -target i386-unknown-unknown -### 2>&1 \
  44. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  45. // RUN: %clang -c %s -target i386-unknown-unknown -fpic -### 2>&1 \
  46. // RUN: | FileCheck %s --check-prefix=CHECK-PIC1
  47. // RUN: %clang -c %s -target i386-unknown-unknown -fPIC -### 2>&1 \
  48. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  49. // RUN: %clang -c %s -target i386-unknown-unknown -fpie -### 2>&1 \
  50. // RUN: | FileCheck %s --check-prefix=CHECK-PIE1
  51. // RUN: %clang -c %s -target i386-unknown-unknown -fPIE -### 2>&1 \
  52. // RUN: | FileCheck %s --check-prefix=CHECK-PIE2
  53. //
  54. // Check that PIC and PIE flags obey last-match-wins. If the last flag is
  55. // a no-* variant, regardless of which variant or which flags precede it, we
  56. // get no PIC.
  57. // RUN: %clang -c %s -target i386-unknown-unknown -fpic -fno-pic -### 2>&1 \
  58. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  59. // RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fno-pic -### 2>&1 \
  60. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  61. // RUN: %clang -c %s -target i386-unknown-unknown -fpie -fno-pic -### 2>&1 \
  62. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  63. // RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fno-pic -### 2>&1 \
  64. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  65. // RUN: %clang -c %s -target i386-unknown-unknown -fpic -fno-PIC -### 2>&1 \
  66. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  67. // RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fno-PIC -### 2>&1 \
  68. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  69. // RUN: %clang -c %s -target i386-unknown-unknown -fpie -fno-PIC -### 2>&1 \
  70. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  71. // RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fno-PIC -### 2>&1 \
  72. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  73. // RUN: %clang -c %s -target i386-unknown-unknown -fpic -fno-pie -### 2>&1 \
  74. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  75. // RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fno-pie -### 2>&1 \
  76. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  77. // RUN: %clang -c %s -target i386-unknown-unknown -fpie -fno-pie -### 2>&1 \
  78. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  79. // RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fno-pie -### 2>&1 \
  80. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  81. // RUN: %clang -c %s -target i386-unknown-unknown -fpic -fno-PIE -### 2>&1 \
  82. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  83. // RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fno-PIE -### 2>&1 \
  84. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  85. // RUN: %clang -c %s -target i386-unknown-unknown -fpie -fno-PIE -### 2>&1 \
  86. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  87. // RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fno-PIE -### 2>&1 \
  88. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  89. //
  90. // Last-match-wins where both pic and pie are specified.
  91. // RUN: %clang -c %s -target i386-unknown-unknown -fpie -fpic -### 2>&1 \
  92. // RUN: | FileCheck %s --check-prefix=CHECK-PIC1
  93. // RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fpic -### 2>&1 \
  94. // RUN: | FileCheck %s --check-prefix=CHECK-PIC1
  95. // RUN: %clang -c %s -target i386-unknown-unknown -fpie -fPIC -### 2>&1 \
  96. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  97. // RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fPIC -### 2>&1 \
  98. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  99. // RUN: %clang -c %s -target i386-unknown-unknown -fpic -fpie -### 2>&1 \
  100. // RUN: | FileCheck %s --check-prefix=CHECK-PIE1
  101. // RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fpie -### 2>&1 \
  102. // RUN: | FileCheck %s --check-prefix=CHECK-PIE1
  103. // RUN: %clang -c %s -target i386-unknown-unknown -fpic -fPIE -### 2>&1 \
  104. // RUN: | FileCheck %s --check-prefix=CHECK-PIE2
  105. // RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fPIE -### 2>&1 \
  106. // RUN: | FileCheck %s --check-prefix=CHECK-PIE2
  107. //
  108. // Last-match-wins when selecting level 1 vs. level 2.
  109. // RUN: %clang -c %s -target i386-unknown-unknown -fpic -fPIC -### 2>&1 \
  110. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  111. // RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fpic -### 2>&1 \
  112. // RUN: | FileCheck %s --check-prefix=CHECK-PIC1
  113. // RUN: %clang -c %s -target i386-unknown-unknown -fpic -fPIE -fpie -### 2>&1 \
  114. // RUN: | FileCheck %s --check-prefix=CHECK-PIE1
  115. // RUN: %clang -c %s -target i386-unknown-unknown -fpie -fPIC -fPIE -### 2>&1 \
  116. // RUN: | FileCheck %s --check-prefix=CHECK-PIE2
  117. //
  118. // Make sure -pie is passed to along to ld and that the right *crt* files
  119. // are linked in.
  120. // RUN: %clang %s -target i386-unknown-freebsd -fPIE -pie -### \
  121. // RUN: --sysroot=%S/Inputs/basic_freebsd_tree 2>&1 \
  122. // RUN: | FileCheck %s --check-prefix=CHECK-PIE-LD
  123. // RUN: %clang %s -target i386-linux-gnu -fPIE -pie -### \
  124. // RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \
  125. // RUN: | FileCheck %s --check-prefix=CHECK-PIE-LD
  126. // RUN: %clang %s -target i386-linux-gnu -fPIC -pie -### \
  127. // RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \
  128. // RUN: | FileCheck %s --check-prefix=CHECK-PIE-LD
  129. //
  130. // Disregard any of the PIC-specific flags if we have a trump-card flag.
  131. // RUN: %clang -c %s -target i386-unknown-unknown -mkernel -fPIC -### 2>&1 \
  132. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  133. // RUN: %clang -c %s -target i386-unknown-unknown -static -fPIC -### 2>&1 \
  134. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  135. //
  136. // On Linux, disregard -pie if we have -shared.
  137. // RUN: %clang %s -target i386-unknown-linux -shared -pie -### 2>&1 \
  138. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIE
  139. //
  140. // Darwin is a beautiful and unique snowflake when it comes to these flags.
  141. // When targetting a 32-bit darwin system, the -fno-* flag variants work and
  142. // disable PIC, but any other flag enables PIC (*not* PIE) even if the flag
  143. // specifies PIE. On 64-bit targets, there is simply nothing you can do, there
  144. // is no PIE, there is only PIC when it comes to compilation.
  145. // RUN: %clang -c %s -target i386-apple-darwin -### 2>&1 \
  146. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  147. // RUN: %clang -c %s -target i386-apple-darwin -fpic -### 2>&1 \
  148. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  149. // RUN: %clang -c %s -target i386-apple-darwin -fPIC -### 2>&1 \
  150. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  151. // RUN: %clang -c %s -target i386-apple-darwin -fpie -### 2>&1 \
  152. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  153. // RUN: %clang -c %s -target i386-apple-darwin -fPIE -### 2>&1 \
  154. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  155. // RUN: %clang -c %s -target i386-apple-darwin -fno-PIC -### 2>&1 \
  156. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  157. // RUN: %clang -c %s -target i386-apple-darwin -fno-PIE -### 2>&1 \
  158. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  159. // RUN: %clang -c %s -target i386-apple-darwin -fno-PIC -fpic -### 2>&1 \
  160. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  161. // RUN: %clang -c %s -target i386-apple-darwin -fno-PIC -fPIE -### 2>&1 \
  162. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  163. // RUN: %clang -c %s -target x86_64-apple-darwin -fno-PIC -### 2>&1 \
  164. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  165. // RUN: %clang -c %s -target x86_64-apple-darwin -fno-PIE -### 2>&1 \
  166. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  167. // RUN: %clang -c %s -target x86_64-apple-darwin -fpic -### 2>&1 \
  168. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  169. // RUN: %clang -c %s -target x86_64-apple-darwin -fPIE -### 2>&1 \
  170. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  171. // RUN: %clang -c %s -target x86_64-apple-darwin -fPIC -### 2>&1 \
  172. // RUN: | FileCheck %s --check-prefix=CHECK-NO-UNUSED-ARG
  173. //
  174. // Darwin gets even more special with '-mdynamic-no-pic'. This flag is only
  175. // valid on Darwin, and it's behavior is very strange but needs to remain
  176. // consistent for compatibility.
  177. // RUN: %clang -c %s -target i386-unknown-unknown -mdynamic-no-pic -### 2>&1 \
  178. // RUN: | FileCheck %s --check-prefix=CHECK-NON-DARWIN-DYNAMIC-NO-PIC
  179. // RUN: %clang -c %s -target i386-apple-darwin -mdynamic-no-pic -### 2>&1 \
  180. // RUN: | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-32
  181. // RUN: %clang -c %s -target i386-apple-darwin -mdynamic-no-pic -fno-pic -### 2>&1 \
  182. // RUN: | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-32
  183. // RUN: %clang -c %s -target i386-apple-darwin -mdynamic-no-pic -fpie -### 2>&1 \
  184. // RUN: | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-32
  185. // RUN: %clang -c %s -target x86_64-apple-darwin -mdynamic-no-pic -### 2>&1 \
  186. // RUN: | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-64
  187. // RUN: %clang -c %s -target x86_64-apple-darwin -mdynamic-no-pic -fno-pic -### 2>&1 \
  188. // RUN: | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-64
  189. // RUN: %clang -c %s -target x86_64-apple-darwin -mdynamic-no-pic -fpie -### 2>&1 \
  190. // RUN: | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-64
  191. //
  192. // Checks for ARM+Apple+IOS including -fapple-kext, -mkernel, and iphoneos
  193. // version boundaries.
  194. // RUN: %clang -c %s -target armv7-apple-ios -fapple-kext -miphoneos-version-min=6.0.0 -### 2>&1 \
  195. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  196. // RUN: %clang -c %s -target armv7-apple-ios -mkernel -miphoneos-version-min=6.0.0 -### 2>&1 \
  197. // RUN: | FileCheck %s --check-prefix=CHECK-PIC2
  198. // RUN: %clang -c %s -target armv7-apple-ios -fapple-kext -miphoneos-version-min=5.0.0 -### 2>&1 \
  199. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  200. // RUN: %clang -c %s -target armv7-apple-ios -fapple-kext -miphoneos-version-min=6.0.0 -static -### 2>&1 \
  201. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  202. //
  203. // On OpenBSD, PIE is enabled by default, but can be disabled.
  204. // RUN: %clang -c %s -target i386-pc-openbsd -### 2>&1 \
  205. // RUN: | FileCheck %s --check-prefix=CHECK-PIE2
  206. // RUN: %clang -c %s -target i386-pc-openbsd -fno-pie -### 2>&1 \
  207. // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC
  208. //
  209. // On OpenBSD, -nopie needs to be passed through to the linker.
  210. // RUN: %clang %s -target i386-pc-openbsd -nopie -### 2>&1 \
  211. // RUN: | FileCheck %s --check-prefix=CHECK-NOPIE-LD