[cfe-commits] r62378 - in /cfe/trunk/tools/ccc: ccclib/Arguments.py ccclib/Driver.py ccclib/Tools.py test/ccc/darwin-x86-cc1.m test/ccc/phases.c xcc
Daniel Dunbar
daniel at zuster.org
Fri Jan 16 15:12:12 PST 2009
Author: ddunbar
Date: Fri Jan 16 17:12:12 2009
New Revision: 62378
URL: http://llvm.org/viewvc/llvm-project?rev=62378&view=rev
Log:
ccc: Clean up (user level) error handling.
- ccc now checks for existence of input files (more annoying to test,
but matches gcc).
- Fix some test cases.
Modified:
cfe/trunk/tools/ccc/ccclib/Arguments.py
cfe/trunk/tools/ccc/ccclib/Driver.py
cfe/trunk/tools/ccc/ccclib/Tools.py
cfe/trunk/tools/ccc/test/ccc/darwin-x86-cc1.m
cfe/trunk/tools/ccc/test/ccc/phases.c
cfe/trunk/tools/ccc/xcc
Modified: cfe/trunk/tools/ccc/ccclib/Arguments.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/ccc/ccclib/Arguments.py?rev=62378&r1=62377&r2=62378&view=diff
==============================================================================
--- cfe/trunk/tools/ccc/ccclib/Arguments.py (original)
+++ cfe/trunk/tools/ccc/ccclib/Arguments.py Fri Jan 16 17:12:12 2009
@@ -1,3 +1,16 @@
+
+###
+
+class InvalidArgumentsError(ValueError):
+ """InvalidArgumentsError - The driver arguments are invalid or
+ inconsistent."""
+
+class MissingArgumentError(ValueError):
+ """MissingArgumentError - An option required an argument but none
+ was given."""
+
+###
+
class Option(object):
"""Option - Root option class."""
Modified: cfe/trunk/tools/ccc/ccclib/Driver.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/ccc/ccclib/Driver.py?rev=62378&r1=62377&r2=62378&view=diff
==============================================================================
--- cfe/trunk/tools/ccc/ccclib/Driver.py (original)
+++ cfe/trunk/tools/ccc/ccclib/Driver.py Fri Jan 16 17:12:12 2009
@@ -19,14 +19,10 @@
####
-class MissingArgumentError(ValueError):
- """MissingArgumentError - An option required an argument but none
- was given."""
-
-###
-
class Driver(object):
- def __init__(self):
+ def __init__(self, driverName, driverDir):
+ self.driverName = driverName
+ self.driverDir = driverDir
self.hostInfo = None
self.parser = Arguments.OptionParser()
self.cccHostBits = self.cccHostMachine = None
@@ -104,7 +100,8 @@
self.cccFallback = True
while argv and argv[0].startswith('-ccc-'):
- opt,argv = argv[0][5:],argv[1:]
+ fullOpt,argv = argv[0],argv[1:]
+ opt = fullOpt[5:]
if opt == 'print-options':
cccPrintOptions = True
@@ -127,7 +124,7 @@
elif opt == 'host-release':
self.cccHostRelease,argv = argv[0],argv[1:]
else:
- raise ValueError,"Invalid ccc option: %r" % opt
+ raise Arguments.InvalidArgumentsError("invalid option: %r" % fullOpt)
self.hostInfo = HostInfo.getHostInfo(self)
self.toolChain = self.hostInfo.getToolChain()
@@ -209,7 +206,7 @@
pass
def warning(self, message):
- print >>sys.stderr,'%s: %s' % (sys.argv[0], message)
+ print >>sys.stderr,'%s: %s' % (self.driverName, message)
def printOptions(self, args):
for i,arg in enumerate(args):
@@ -325,8 +322,9 @@
inputs = []
for a in args:
if a.opt is self.parser.inputOption:
+ inputValue = args.getValue(a)
if inputType is None:
- base,ext = os.path.splitext(args.getValue(a))
+ base,ext = os.path.splitext(inputValue)
if ext and ext in Types.kTypeSuffixMap:
klass = Types.kTypeSuffixMap[ext]
else:
@@ -339,7 +337,15 @@
assert inputTypeOpt is not None
self.claim(inputTypeOpt)
klass = inputType
- inputs.append((klass, a))
+
+ # Check that the file exists. It isn't clear this is
+ # worth doing, since the tool presumably does this
+ # anyway, and this just adds an extra stat to the
+ # equation, but this is gcc compatible.
+ if not os.path.exists(inputValue):
+ self.warning("%s: No such file or directory" % inputValue)
+ else:
+ inputs.append((klass, a))
elif a.opt.isLinkerInput:
# Treat as a linker input.
#
@@ -348,13 +354,8 @@
# that other code which needs to know the inputs
# handles this properly. Best not to try and lipo
# this, for example.
- #
- # FIXME: Actually, this is just flat out broken, the
- # tools expect inputs to be accessible by .getValue
- # but that of course only yields the argument.
inputs.append((Types.ObjectType, a))
elif a.opt is self.parser.xOption:
- self.claim(a)
inputTypeOpt = a
value = args.getValue(a)
if value in Types.kTypeSpecifierMap:
@@ -396,7 +397,11 @@
# FIXME: Support -combine.
if hasCombine:
- raise NotImplementedError,"-combine is not yet supported."
+ raise NotImplementedError,"-combine is not yet supported"
+
+ if (not inputs and
+ not args.getLastArg(self.parser.hashHashHashOption)):
+ raise Arguments.InvalidArgumentsError("no input files")
actions = []
linkerInputs = []
@@ -511,9 +516,9 @@
# these cause downstream.
if len(archs) > 1:
if hasDashM:
- raise ValueError,"Cannot use -M options with multiple arch flags."
+ raise Arguments.InvalidArgumentsError("Cannot use -M options with multiple arch flags.")
elif hasSaveTemps:
- raise ValueError,"Cannot use -save-temps with multiple arch flags."
+ raise Arguments.InvalidArgumentsError("Cannot use -save-temps with multiple arch flags.")
# Execute once per arch.
finalActions = []
@@ -531,7 +536,7 @@
# developers.
if (len(archs) > 1 and
p.type not in (Types.NothingType,Types.ObjectType,Types.ImageType)):
- raise ValueError,'Cannot use %s output with multiple arch flags.' % p.type.name
+ raise Arguments.InvalidArgumentsError('Cannot use %s output with multiple arch flags.' % p.type.name)
inputs = []
for arch in archs:
@@ -701,8 +706,7 @@
# It is an error to provide a -o option if we are making multiple
# output files.
if finalOutput and len([a for a in phases if a.type is not Types.NothingType]) > 1:
- # FIXME: Custom exception.
- raise ValueError,"Cannot specify -o when generating multiple files."
+ raise Arguments.InvalidArgumentsError("cannot specify -o when generating multiple files")
for phase in phases:
createJobs(self.toolChain, phase,
Modified: cfe/trunk/tools/ccc/ccclib/Tools.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/ccc/ccclib/Tools.py?rev=62378&r1=62377&r2=62378&view=diff
==============================================================================
--- cfe/trunk/tools/ccc/ccclib/Tools.py (original)
+++ cfe/trunk/tools/ccc/ccclib/Tools.py Fri Jan 16 17:12:12 2009
@@ -375,12 +375,12 @@
usePP = False
isCXX = True
else:
- raise RuntimeError,"Unexpected input type for Darwin compile tool."
+ raise ValueError,"Unexpected input type for Darwin compile tool."
cmd_args = []
if (arglist.getLastArg(arglist.parser.traditionalOption) or
arglist.getLastArg(arglist.parser.f_traditionalOption)):
- raise ValueError,"-traditional is not supported without -E"
+ raise Arguments.InvalidArgumentsError("-traditional is not supported without -E")
if usePP:
# Derived from cpp_options.
@@ -390,7 +390,7 @@
if (arglist.getLastArg(arglist.parser.COption) or
arglist.getLastArg(arglist.parser.CCOption)):
if not arglist.getLastArg(arglist.parser.EOption):
- raise ValueError,"-C or -CC is not supported without -E"
+ raise Arguments.InvalidArgumentsError("-C or -CC is not supported without -E")
if not arglist.getLastArg(arglist.parser.QOption):
cmd_args.append('-quiet')
arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
@@ -491,7 +491,7 @@
if (arglist.getLastArg(arglist.parser.pgOption) and
arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
- raise ValueError,"-pg and -fomit-frame-pointer are incompatible"
+ raise Arguments.InvalidArgumentsError("-pg and -fomit-frame-pointer are incompatible")
self.addCC1Args(cmd_args, arch, arglist)
@@ -596,7 +596,7 @@
try:
return tuple(map(int, components))
except:
- raise ValueError,"invalid version number %r" % version
+ raise Arguments.InvalidArgumentsError("invalid version number %r" % version)
else:
major,minor,minorminor = self.toolChain.darwinVersion
return (10, major-4, minor)
Modified: cfe/trunk/tools/ccc/test/ccc/darwin-x86-cc1.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/ccc/test/ccc/darwin-x86-cc1.m?rev=62378&r1=62377&r2=62378&view=diff
==============================================================================
--- cfe/trunk/tools/ccc/test/ccc/darwin-x86-cc1.m (original)
+++ cfe/trunk/tools/ccc/test/ccc/darwin-x86-cc1.m Fri Jan 16 17:12:12 2009
@@ -1,4 +1,4 @@
// RUN: xcc -ccc-host-bits 32 -ccc-host-machine i386 -ccc-host-system darwin -ccc-host-release 10.5.0 -### -x objective-c -arch i386 -fmessage-length=0 -Wno-trigraphs -fpascal-strings -fasm-blocks -Os -mdynamic-no-pic -DUSER_DEFINE_0 -fvisibility=hidden -mmacosx-version-min=10.5 -gdwarf-2 -IINCLUDE_PATH_0 -Wall -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wno-four-char-constants -Wno-unknown-pragmas -Wno-format-y2k -Wpointer-arith -Wreturn-type -Wwrite-strings -Wswitch -Wcast-align -Wchar-subscripts -Winline -Wnested-externs -Wint-to-pointer-cast -Wpointer-to-int-cast -Wshorten-64-to-32 -FFRAMEWORK_0 -IINCLUDE_PATH_1 -FFRAMEWORK_1 -include USER_INCLUDE_0 -c %s -o %t.out &> %t.opts &&
-// RUN: grep ' "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1obj" "-quiet" "-IINCLUDE_PATH_0" "-FFRAMEWORK_0" "-IINCLUDE_PATH_1" "-FFRAMEWORK_1" "-D__DYNAMIC__" "-DUSER_DEFINE_0" "-include" "USER_INCLUDE_0" "darwin-x86-cc1.m" "-quiet" "-dumpbase" "darwin-x86-cc1.m" "-mpascal-strings" "-mdynamic-no-pic" "-mmacosx-version-min=10.5" "-mtune=core2" "-auxbase-strip" "Output/darwin-x86-cc1.m.out.tmp.out" "-gdwarf-2" "-Os" "-Wno-trigraphs" "-Wall" "-Wextra" "-Wno-missing-field-initializers" "-Wno-unused-parameter" "-Wno-four-char-constants" "-Wno-unknown-pragmas" "-Wno-format-y2k" "-Wpointer-arith" "-Wreturn-type" "-Wwrite-strings" "-Wswitch" "-Wcast-align" "-Wchar-subscripts" "-Winline" "-Wnested-externs" "-Wint-to-pointer-cast" "-Wpointer-to-int-cast" "-Wshorten-64-to-32" "-fmessage-length=0" "-fasm-blocks" "-fvisibility=hidden" "-o"' %t.opts &&
-// RUN: grep ' "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "i386" "-force_cpusubtype_ALL" "-o" "Output/darwin-x86-cc1.m.out.tmp.out" ' %t.opts
+// RUN: grep ' "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1obj" "-quiet" "-IINCLUDE_PATH_0" "-FFRAMEWORK_0" "-IINCLUDE_PATH_1" "-FFRAMEWORK_1" "-D__DYNAMIC__" "-DUSER_DEFINE_0" "-include" "USER_INCLUDE_0" ".*" "-quiet" "-dumpbase" "darwin-x86-cc1.m" "-mpascal-strings" "-mdynamic-no-pic" "-mmacosx-version-min=10.5" "-mtune=core2" "-auxbase-strip" ".*" "-gdwarf-2" "-Os" "-Wno-trigraphs" "-Wall" "-Wextra" "-Wno-missing-field-initializers" "-Wno-unused-parameter" "-Wno-four-char-constants" "-Wno-unknown-pragmas" "-Wno-format-y2k" "-Wpointer-arith" "-Wreturn-type" "-Wwrite-strings" "-Wswitch" "-Wcast-align" "-Wchar-subscripts" "-Winline" "-Wnested-externs" "-Wint-to-pointer-cast" "-Wpointer-to-int-cast" "-Wshorten-64-to-32" "-fmessage-length=0" "-fasm-blocks" "-fvisibility=hidden" "-o"' %t.opts &&
+// RUN: grep ' "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "i386" "-force_cpusubtype_ALL" "-o"' %t.opts
Modified: cfe/trunk/tools/ccc/test/ccc/phases.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/ccc/test/ccc/phases.c?rev=62378&r1=62377&r2=62378&view=diff
==============================================================================
--- cfe/trunk/tools/ccc/test/ccc/phases.c (original)
+++ cfe/trunk/tools/ccc/test/ccc/phases.c Fri Jan 16 17:12:12 2009
@@ -1,41 +1,46 @@
// One C file.
-// RUN: xcc -ccc-host-system unknown -ccc-print-phases a.c > %t &&
-// RUN: grep '0: input, "a.c", c' %t &&
+// RUN: touch %t.c &&
+// RUN: xcc -ccc-host-system unknown -ccc-print-phases %t.c > %t &&
+// RUN: grep '0: input, "%t.c", c' %t &&
// RUN: grep '1: preprocessor, {0}, cpp-output' %t &&
// RUN: grep '2: compiler, {1}, assembler' %t &&
// RUN: grep '3: assembler, {2}, object' %t &&
// RUN: grep '4: linker, {3}, image' %t &&
// PCH.
-// RUN: xcc -ccc-host-system unknown -ccc-print-phases -x c-header a.h > %t &&
-// RUN: grep '0: input, "a.h", c-header' %t &&
+// RUN: touch %t.h &&
+// RUN: xcc -ccc-host-system unknown -ccc-print-phases -x c-header %t.h > %t &&
+// RUN: grep '0: input, "%t.h", c-header' %t &&
// RUN: grep '1: preprocessor, {0}, c-header-cpp-output' %t &&
// RUN: grep '2: precompiler, {1}, precompiled-header' %t &&
// Assembler w/ and w/o preprocessor.
-// RUN: xcc -ccc-host-system unknown -ccc-print-phases -x assembler a.s > %t &&
-// RUN: grep '0: input, "a.s", assembler' %t &&
+// RUN: touch %t.s &&
+// RUN: xcc -ccc-host-system unknown -ccc-print-phases -x assembler %t.s > %t &&
+// RUN: grep '0: input, "%t.s", assembler' %t &&
// RUN: grep '1: assembler, {0}, object' %t &&
// RUN: grep '2: linker, {1}, image' %t &&
-// RUN: xcc -ccc-host-system unknown -ccc-print-phases -x assembler-with-cpp a.s > %t &&
-// RUN: grep '0: input, "a.s", assembler-with-cpp' %t &&
+// RUN: xcc -ccc-host-system unknown -ccc-print-phases -x assembler-with-cpp %t.s > %t &&
+// RUN: grep '0: input, "%t.s", assembler-with-cpp' %t &&
// RUN: grep '1: preprocessor, {0}, assembler' %t &&
// RUN: grep '2: assembler, {1}, object' %t &&
// RUN: grep '3: linker, {2}, image' %t &&
// Check the various ways of early termination.
-// RUN: xcc -ccc-host-system unknown -ccc-print-phases -E a.c > %t &&
+// RUN: xcc -ccc-host-system unknown -ccc-print-phases -E %s > %t &&
// RUN: not grep ': compiler, ' %t &&
-// RUN: xcc -ccc-host-system unknown -ccc-print-phases -fsyntax-only a.c > %t &&
+// RUN: xcc -ccc-host-system unknown -ccc-print-phases -fsyntax-only %s > %t &&
// RUN: grep ': compiler, {1}, nothing' %t &&
// RUN: not grep ': assembler, ' %t &&
-// RUN: xcc -ccc-host-system unknown -ccc-print-phases -S a.c > %t &&
+// RUN: xcc -ccc-host-system unknown -ccc-print-phases -S %s > %t &&
// RUN: not grep ': assembler, ' %t &&
-// RUN: xcc -ccc-host-system unknown -ccc-print-phases -c a.c > %t &&
+// RUN: xcc -ccc-host-system unknown -ccc-print-phases -c %s > %t &&
// RUN: not grep ': linker, ' %t &&
// Multiple output files.
-// RUN: xcc -ccc-host-system unknown -ccc-print-phases -c a.c b.c > %t &&
+// RUN: touch %t.1.c &&
+// RUN: touch %t.2.c &&
+// RUN: xcc -ccc-host-system unknown -ccc-print-phases -c %t.1.c %t.2.c > %t &&
// RUN: grep ': assembler,' %t | count 2 &&
// FIXME: Only for darwin.
Modified: cfe/trunk/tools/ccc/xcc
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/ccc/xcc?rev=62378&r1=62377&r2=62378&view=diff
==============================================================================
--- cfe/trunk/tools/ccc/xcc (original)
+++ cfe/trunk/tools/ccc/xcc Fri Jan 16 17:12:12 2009
@@ -1,12 +1,25 @@
#!/usr/bin/python
+import os
import sys
+from ccclib import Arguments
from ccclib import Driver
def main():
- d = Driver.Driver()
- # FIXME: We should pass program name here as well.
- d.run(sys.argv[1:])
+ progDir = os.path.dirname(sys.argv[0])
+ progName = os.path.basename(sys.argv[0])
+
+ d = Driver.Driver(progDir, progName)
+ try:
+ d.run(sys.argv[1:])
+ except Arguments.InvalidArgumentsError,e:
+ print >>sys.stderr, "%s: %s" % (progName, e.args[0])
+ sys.exit(1)
+ except Arguments.MissingArgumentError,e:
+ print >>sys.stderr, "%s: %s" % (progName, e.args[0])
+ sys.exit(1)
+ except NotImplementedError,e:
+ print >>sys.stderr, "%s: not implemented: %s" % (progName, e.args[0])
if __name__=='__main__':
main()
More information about the cfe-commits
mailing list