From 1e1d2c6d68bbf23c1ab3741ccffcb23848caaa02 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Thu, 22 Jan 2009 01:55:46 +0000 Subject: [PATCH] ccc/clang: Mimic llvm-gcc initialization of LLVM backend based on gcc options (for example, to set relocation model or enable unwind table generation). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62740 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/ccc/ccclib/Arguments.py | 14 ++++++++- tools/ccc/ccclib/Tools.py | 54 ++++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/tools/ccc/ccclib/Arguments.py b/tools/ccc/ccclib/Arguments.py index 2aefa04ebf..2ed0597f89 100644 --- a/tools/ccc/ccclib/Arguments.py +++ b/tools/ccc/ccclib/Arguments.py @@ -713,7 +713,9 @@ class OptionParser: # FIXME: What to do about the ambiguity of options like # -dumpspecs? How is this handled in gcc? # FIXME: Naming convention. - self.dOption = self.addOption(FlagOption('-d')) + self.dGroup = OptionGroup('-d') + self.dAOption = self.addOption(FlagOption('-dA', self.dGroup)) + self.addOption(FlagOption('-d', self.dGroup)) # Use a group for this in anticipation of adding more -d # options explicitly. Note that we don't put many -d things in @@ -744,12 +746,15 @@ class OptionParser: self.f_appleKextOption = self.addOption(FlagOption('-fapple-kext', self.fGroup)) self.f_constantCfstringsOption = self.addOption(FlagOption('-fconstant-cfstrings', self.fGroup)) self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile', self.fGroup)) + self.f_debugPassArgumentsOption = self.addOption(FlagOption('-fdebug-pass-arguments', self.fGroup)) + self.f_debugPassStructureOption = self.addOption(FlagOption('-fdebug-pass-structure', self.fGroup)) self.f_eliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-feliminate-unused-debug-symbols', self.fGroup)) self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions', self.fGroup)) self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup)) self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup)) self.f_indirectVirtualCallsOption = self.addOption(FlagOption('-findirect-virtual-calls', self.fGroup)) self.f_laxVectorConversionsOption = self.addOption(FlagOption('-flax-vector-conversions', self.fGroup)) + self.f_limitedPrecisionOption = self.addOption(JoinedOption('-flimited-precision=', self.fGroup)) self.f_msExtensionsOption = self.addOption(FlagOption('-fms-extensions', self.fGroup)) self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup)) self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup)) @@ -764,14 +769,21 @@ class OptionParser: self.f_objcGcOnlyOption = self.addOption(FlagOption('-fobjc-gc-only', self.fGroup)) self.f_objcGcOption = self.addOption(FlagOption('-fobjc-gc', self.fGroup)) self.f_objcOption = self.addOption(FlagOption('-fobjc', self.fGroup)) + self.f_omitFramePointerOption = self.addOption(FlagOption('-fomit-frame-pointer', self.fGroup)) self.f_openmpOption = self.addOption(FlagOption('-fopenmp', self.fGroup)) self.f_pascalStringsOption = self.addOption(FlagOption('-fpascal-strings', self.fGroup)) self.f_pieOption = self.addOption(FlagOption('-fpie', self.fGroup)) + self.f_PIEOption = self.addOption(FlagOption('-fPIE', self.fGroup)) + self.f_picOption = self.addOption(FlagOption('-fpic', self.fGroup)) + self.f_PICOption = self.addOption(FlagOption('-fPIC', self.fGroup)) self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs', self.fGroup)) self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate', self.fGroup)) self.f_terminatedVtablesOption = self.addOption(FlagOption('-fterminated-vtables', self.fGroup)) + self.f_timeReportOption = self.addOption(FlagOption('-ftime-report', self.fGroup)) self.f_traditionalOption = self.addOption(FlagOption('-ftraditional', self.fGroup)) + self.f_unwindTablesOption = self.addOption(FlagOption('-funwind-tables', self.fGroup)) self.f_writableStringsOption = self.addOption(FlagOption('-fwritable-strings', self.fGroup)) + self.f_zeroInitializedInBssOption = self.addOption(FlagOption('-fzero-initialized-in-bss', self.fGroup)) self.addOption(JoinedOption('-f', self.fGroup)) self.coverageOption = self.addOption(FlagOption('-coverage')) diff --git a/tools/ccc/ccclib/Tools.py b/tools/ccc/ccclib/Tools.py index fbf17cb3a7..b1087d3983 100644 --- a/tools/ccc/ccclib/Tools.py +++ b/tools/ccc/ccclib/Tools.py @@ -219,6 +219,58 @@ class Clang_CompileTool(Tool): # Add -WA, arguments when running as analyzer. for arg in arglist.getArgs(arglist.parser.WAOption): cmd_args.extend(arglist.renderAsInput(arg)) + else: + # Perform argument translation for LLVM backend. This + # performs some care in reconciling with llvm-gcc. The + # issue is that llvm-gcc translates these options based on + # the values in cc1, whereas we are processing based on + # the driver arguments. + # + # FIXME: This is currently broken for -f flags when -fno + # variants are present. + + # This comes from the default translation the driver + cc1 + # would do to enable flag_pic. + # + # FIXME: Centralize this code. + picEnabled = (arglist.getLastArg(arglist.parser.f_PICOption) or + arglist.getLastArg(arglist.parser.f_picOption) or + arglist.getLastArg(arglist.parser.f_PIEOption) or + arglist.getLastArg(arglist.parser.f_pieOption) or + (not arglist.getLastArg(arglist.parser.m_kernelOption) and + not arglist.getLastArg(arglist.parser.staticOption) and + not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption))) + + archName = arglist.getValue(arch) + if (archName == 'x86_64' or + picEnabled): + cmd_args.append('--relocation-model=pic') + else: + cmd_args.append('--relocation-model=static') + + if arglist.getLastArg(arglist.parser.f_timeReportOption): + cmd_args.append('--time-passes') + # FIXME: Set --enable-unsafe-fp-math. + if not arglist.getLastArg(arglist.parser.f_omitFramePointerOption): + cmd_args.append('--disable-fp-elim') + if not arglist.getLastArg(arglist.parser.f_zeroInitializedInBssOption): + cmd_args.append('--nozero-initialized-in-bss') + if arglist.getLastArg(arglist.parser.dAOption): + cmd_args.append('--asm-verbose') + if arglist.getLastArg(arglist.parser.f_debugPassStructureOption): + cmd_args.append('--debug-pass=Structure') + if arglist.getLastArg(arglist.parser.f_debugPassArgumentsOption): + cmd_args.append('--debug-pass=Arguments') + # FIXME: set --inline-threshhold=50 if (optimize_size || optimize < 3) + if arglist.getLastArg(arglist.parser.f_unwindTablesOption): + cmd_args.append('--unwind-tables') + + arg = arglist.getLastArg(arglist.parser.f_limitedPrecisionOption) + if arg: + cmd_args.append('--limit-float-precision') + cmd_args.append(arglist.getValue(arg)) + + # FIXME: Add --stack-protector-buffer-size= on -fstack-protect. arglist.addAllArgs(cmd_args, arglist.parser.vOption) arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption) @@ -937,7 +989,7 @@ class Darwin_X86_LinkTool(Tool): # FIXME: gcc has %{x} in here. How could this ever happen? # Cruft? - arglist.addLastArg(cmd_args, arglist.parser.dOption) + arglist.addLastArg(cmd_args, arglist.parser.dGroup) arglist.addLastArg(cmd_args, arglist.parser.tOption) arglist.addLastArg(cmd_args, arglist.parser.ZOption) arglist.addAllArgs(cmd_args, arglist.parser.uGroup) -- 2.40.0