]> granicus.if.org Git - clang/commitdiff
Unbreak Darwin PIC handling; my refactoring yesterday was bogus.
authorDaniel Dunbar <daniel@zuster.org>
Fri, 20 Feb 2009 20:52:47 +0000 (20:52 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 20 Feb 2009 20:52:47 +0000 (20:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65154 91177308-0d34-0410-b5e6-96231b3b80d8

tools/ccc/ccclib/ToolChain.py
tools/ccc/ccclib/Tools.py
tools/ccc/test/ccc/darwin-pic.c [new file with mode: 0644]

index ea35de9502c0944549bbdbdaaf6c1b356bb78ef3..8c71789e1741fbc54fb8551f5a81ef1740a6e48f 100644 (file)
@@ -92,10 +92,11 @@ class ToolChain(object):
             return True
         return False
 
-    def getRelocationModel(self, picEnabled, picDisabled):
-        if picEnabled:
-            return 'pic'
+    def getDefaultRelocationModel(self):
         return 'static'
+    
+    def getForcedPicModel(self):
+        return 
 
 class Darwin_X86_ToolChain(ToolChain):
     def __init__(self, driver, archName, darwinVersion, gccVersion):
@@ -235,17 +236,13 @@ class Darwin_X86_ToolChain(ToolChain):
     def isMathErrnoDefault(self):
         return False
 
-    def getRelocationModel(self, picEnabled, picDisabled):
+    def getDefaultRelocationModel(self):
+        return 'pic'
+    
+    def getForcedPicModel(self):
         if self.archName == 'x86_64':
             return 'pic'
 
-        if picEnabled:
-            return 'pic'
-        elif picDisabled:
-            return 'static'
-        else:
-            return 'dynamic-no-pic'
-
 class Generic_GCC_ToolChain(ToolChain):
     """Generic_GCC_ToolChain - A tool chain using the 'gcc' command to
     perform all subcommands; this relies on gcc translating the
index a9db01ac124f4c52bd27261be6a646f0bccf3dbb..9d3bd8eeb8ab031afbe08e048059cb869b34289d 100644 (file)
@@ -255,7 +255,16 @@ class Clang_CompileTool(Tool):
                           arglist.getLastArg(arglist.parser.f_pieOption))
             picDisabled = (arglist.getLastArg(arglist.parser.m_kernelOption) or
                            arglist.getLastArg(arglist.parser.staticOption))
-            model = self.toolChain.getRelocationModel(picEnabled, picDisabled)
+            model = self.toolChain.getForcedPicModel()
+            if not model:
+                if arglist.getLastArg(arglist.parser.m_dynamicNoPicOption):
+                    model = 'dynamic-no-pic'
+                elif picDisabled:
+                    model = 'static'
+                elif picEnabled:
+                    model = 'pic'
+                else:
+                    model = self.toolChain.getDefaultRelocationModel()
             cmd_args.append('--relocation-model=%s' % model)
 
             if arglist.getLastArg(arglist.parser.f_timeReportOption):
diff --git a/tools/ccc/test/ccc/darwin-pic.c b/tools/ccc/test/ccc/darwin-pic.c
new file mode 100644 (file)
index 0000000..8b2ca31
--- /dev/null
@@ -0,0 +1,11 @@
+// RUN: xcc -ccc-host-system darwin -ccc-host-machine i386 -m32 -S %s -o - | grep 'L_g0$non_lazy_ptr-' &&
+// RUN: xcc -ccc-host-system darwin -ccc-host-machine i386 -m32 -S %s -o - -fPIC | grep 'L_g0$non_lazy_ptr-' &&
+// RUN: xcc -ccc-host-system darwin -ccc-host-machine i386 -m32 -S %s -o - -mdynamic-no-pic | grep 'L_g0$non_lazy_ptr,' &&
+// RUN: xcc -ccc-host-system darwin -ccc-host-machine i386 -m32 -S %s -o - -static | grep 'non_lazy_ptr' | count 0 &&
+// RUN: xcc -ccc-host-system darwin -ccc-host-machine i386 -m64 -S %s -o - | grep '_g0@GOTPCREL' &&
+// RUN: xcc -ccc-host-system darwin -ccc-host-machine i386 -m64 -S %s -o - -fPIC | grep '_g0@GOTPCREL' &&
+// RUN: xcc -ccc-host-system darwin -ccc-host-machine i386 -m64 -S %s -o - -mdynamic-no-pic | grep '_g0@GOTPCREL' &&
+// RUN: xcc -ccc-host-system darwin -ccc-host-machine i386 -m64 -S %s -o - -static | grep '_g0@GOTPCREL'
+
+int g0;
+int f0() { return g0; }