[cfe-commits] r66781 - in /cfe/trunk: include/clang/Driver/Options.def include/clang/Driver/Types.def include/clang/Driver/Types.h lib/Driver/Types.cpp
Daniel Dunbar
daniel at zuster.org
Thu Mar 12 00:40:41 PDT 2009
Author: ddunbar
Date: Thu Mar 12 02:40:41 2009
New Revision: 66781
URL: http://llvm.org/viewvc/llvm-project?rev=66781&view=rev
Log:
Driver: Add information on Driver input/temporary types.
Added:
cfe/trunk/include/clang/Driver/Types.def
cfe/trunk/include/clang/Driver/Types.h
cfe/trunk/lib/Driver/Types.cpp
Modified:
cfe/trunk/include/clang/Driver/Options.def
Modified: cfe/trunk/include/clang/Driver/Options.def
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.def?rev=66781&r1=66780&r2=66781&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/Options.def (original)
+++ cfe/trunk/include/clang/Driver/Options.def Thu Mar 12 02:40:41 2009
@@ -21,8 +21,8 @@
// The first value is the option name as a string.
// The second value is the internal option id, which must be a valid
-// C++ identifier, and results in a clang::driver::options::XX enum
-// value for XX.
+// C++ identifier, and results in a clang::driver::options::OPT_XX
+// enum constant for XX.
//
// We want to unamiguously be able to refer to options from the driver
// source code, for this reason the option name is mangled into an
Added: cfe/trunk/include/clang/Driver/Types.def
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Types.def?rev=66781&view=auto
==============================================================================
--- cfe/trunk/include/clang/Driver/Types.def (added)
+++ cfe/trunk/include/clang/Driver/Types.def Thu Mar 12 02:40:41 2009
@@ -0,0 +1,77 @@
+//===--- Types.def - Driver Type info ---------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the driver type information. Users of this file
+// must define the TYPE macro to make use of this information.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef TYPE
+#error "Define TYPE prior to including this file!"
+#endif
+
+// TYPE(NAME, ID, PP_TYPE, TEMP_SUFFIX, FLAGS)
+
+// The first value is the type name as a string; for types which can
+// be user specified this should be the equivalent -x option.
+
+// The second value is the type id, which will result in a
+// clang::driver::types::TY_XX enum constant.
+
+// The third value is that id of the type for preprocessed inputs of
+// this type, or INVALID if this type is not preprocessed.
+
+// The fourth value is the suffix to use when creating temporary files
+// of this type, or null if unspecified.
+
+// The fifth value is a string containt option flags. Valid values:
+// a - The type should only be assembled.
+// p - The type should only be precompiled.
+// u - The type can be user specified (with -x).
+// A - The type's temporary suffix should be appended when generating
+// outputs of this type.
+
+
+// C family source language (with and without preprocessing).
+TYPE("cpp-output", PP_C, INVALID, "i", "u")
+TYPE("c", C, PP_C, 0, "u")
+TYPE("objective-c-cpp-output", PP_ObjC, INVALID, "mi", "u")
+TYPE("objective-c", ObjC, PP_ObjC, 0, "u")
+TYPE("c++-cpp-output", PP_CXX, INVALID, "ii", "u")
+TYPE("c++", CXX, PP_CXX, 0, "u")
+TYPE("objective-c++-cpp-output", PP_ObjCXX, INVALID, "mii", "u")
+TYPE("objective-c++", ObjCXX, PP_ObjCXX, 0, "u")
+
+// C family input files to precompile.
+TYPE("c-header-cpp-output", PP_CHeader, INVALID, "i", "p")
+TYPE("c-header", CHeader, PP_CHeader, 0, "pu")
+TYPE("objective-c-header-cpp-output", PP_ObjCHeader, INVALID, "mi", "p")
+TYPE("objective-c-header", ObjCHeader, PP_ObjCHeader, 0, "pu")
+TYPE("c++-header-cpp-output", PP_CXXHeader, INVALID, "ii", "p")
+TYPE("c++-header", CXXHeader, PP_CXXHeader, 0, "pu")
+TYPE("objective-c++-header-cpp-output", PP_ObjCXXHeader, INVALID, "mii", "p")
+TYPE("objective-c++-header", ObjCXXHeader, PP_ObjCXXHeader, 0, "pu")
+
+// Other languages.
+TYPE("ada", Ada, INVALID, 0, "u")
+TYPE("assembler", PP_Asm, INVALID, "s", "au")
+TYPE("assembler-with-cpp", Asm, PP_Asm, 0, "au")
+TYPE("f95", PP_Fortran, INVALID, 0, "u")
+TYPE("f95-cpp-input", Fortran, PP_Fortran, 0, "u")
+TYPE("java", Java, INVALID, 0, "u")
+
+// Misc.
+TYPE("llvm-asm", LLVMAsm, INVALID, "ll", "")
+TYPE("llvm-bc", LLVMBC, INVALID, "bc", "")
+TYPE("plist", Plist, INVALID, "plist", "")
+TYPE("precompiled-header", PCH, INVALID, "gch", "A")
+TYPE("object", Object, INVALID, "o", "")
+TYPE("treelang", Treelang, INVALID, 0, "u")
+TYPE("image", Image, INVALID, "out", "")
+TYPE("nothing", Nothing, INVALID, 0, "")
Added: cfe/trunk/include/clang/Driver/Types.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Types.h?rev=66781&view=auto
==============================================================================
--- cfe/trunk/include/clang/Driver/Types.h (added)
+++ cfe/trunk/include/clang/Driver/Types.h Thu Mar 12 02:40:41 2009
@@ -0,0 +1,64 @@
+//===--- Types.h - Input & Temporary Driver Types ---------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_DRIVER_TYPES_H_
+#define CLANG_DRIVER_TYPES_H_
+
+namespace clang {
+namespace driver {
+namespace types {
+ enum ID {
+ TY_INVALID,
+#define TYPE(NAME, ID, PP_TYPE, TEMP_SUFFIX, FLAGS) TY_##ID,
+#include "clang/Driver/Types.def"
+#undef TYPE
+ TY_LAST
+ };
+
+ /// getTypeName - Return the name of the type for \arg Id.
+ const char *getTypeName(ID Id);
+
+ /// getPreprocessedType - Get the ID of the type for this input when
+ /// it has been preprocessed, or INVALID if this input is not
+ /// preprocessed.
+ ID getPreprocessedType(ID Id);
+
+ /// getTypeTempSuffix - Return the suffix to use when creating a
+ /// temp file of this type, or null if unspecified.
+ const char *getTypeTempSuffix(ID Id);
+
+ /// onlyAssembleType - Should this type only be assembled.
+ bool onlyAssembleType(ID Id);
+
+ /// onlyPrecompileType - Should this type only be precompiled.
+ bool onlyPrecompileType(ID Id);
+
+ /// canTypeBeUserSpecified - Can this type be specified on the
+ /// command line (by the type name); this is used when forwarding
+ /// commands to gcc.
+ bool canTypeBeUserSpecified(ID Id);
+
+ /// appendSuffixForType - When generating outputs of this type,
+ /// should the suffix be appended (instead of replacing the existing
+ /// suffix).
+ bool appendSuffixForType(ID Id);
+
+ /// lookupTypeForExtension - Lookup the type to use for the file
+ /// extension \arg Ext.
+ ID lookupTypeForExtension(const char *Ext);
+
+ /// lookupTypeForTypSpecifier - Lookup the type to use for a user
+ /// specified type name.
+ ID lookupTypeForTypeSpecifier(const char *Name);
+
+} // end namespace types
+} // end namespace driver
+} // end namespace clang
+
+#endif
Added: cfe/trunk/lib/Driver/Types.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Types.cpp?rev=66781&view=auto
==============================================================================
--- cfe/trunk/lib/Driver/Types.cpp (added)
+++ cfe/trunk/lib/Driver/Types.cpp Thu Mar 12 02:40:41 2009
@@ -0,0 +1,125 @@
+//===--- Types.cpp - Driver input & temporary type information ----------*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Driver/Types.h"
+
+#include <string.h>
+#include <cassert>
+
+using namespace clang;
+using namespace clang::driver;
+using namespace clang::driver::types;
+
+struct Info {
+ const char *Name;
+ const char *Flags;
+ const char *TempSuffix;
+ ID PreprocessedType;
+};
+
+static Info TypeInfos[] = {
+#define TYPE(NAME, ID, PP_TYPE, TEMP_SUFFIX, FLAGS) \
+ { NAME, FLAGS, TEMP_SUFFIX, TY_##PP_TYPE, },
+#include "clang/Driver/Types.def"
+#undef TYPE
+};
+static const unsigned numTypes = sizeof(TypeInfos) / sizeof(TypeInfos[0]);
+
+static Info &getInfo(unsigned id) {
+ assert(id > 0 && id - 1 < numTypes && "Invalid Type ID.");
+ return TypeInfos[id - 1];
+}
+
+const char *types::getTypeName(ID Id) {
+ return getInfo(Id).Name;
+}
+
+types::ID types::getPreprocessedType(ID Id) {
+ return getInfo(Id).PreprocessedType;
+}
+
+const char *types::getTypeTempSuffix(ID Id) {
+ return getInfo(Id).TempSuffix;
+}
+
+bool types::onlyAssembleType(ID Id) {
+ return strchr(getInfo(Id).Flags, 'a');
+}
+
+bool types::onlyPrecompileType(ID Id) {
+ return strchr(getInfo(Id).Flags, 'p');
+}
+
+bool types::canTypeBeUserSpecified(ID Id) {
+ return strchr(getInfo(Id).Flags, 'u');
+}
+
+bool types::appendSuffixForType(ID Id) {
+ return strchr(getInfo(Id).Flags, 'A');
+}
+
+types::ID types::lookupTypeForExtension(const char *Ext) {
+ unsigned N = strlen(Ext);
+
+ switch (N) {
+ case 1:
+ if (memcmp(Ext, "c", 1) == 0) return TY_C;
+ if (memcmp(Ext, "i", 1) == 0) return TY_PP_C;
+ if (memcmp(Ext, "m", 1) == 0) return TY_ObjC;
+ if (memcmp(Ext, "M", 1) == 0) return TY_ObjCXX;
+ if (memcmp(Ext, "h", 1) == 0) return TY_CHeader;
+ if (memcmp(Ext, "C", 1) == 0) return TY_CXX;
+ if (memcmp(Ext, "H", 1) == 0) return TY_CXXHeader;
+ if (memcmp(Ext, "f", 1) == 0) return TY_PP_Fortran;
+ if (memcmp(Ext, "F", 1) == 0) return TY_Fortran;
+ if (memcmp(Ext, "s", 1) == 0) return TY_PP_Asm;
+ if (memcmp(Ext, "S", 1) == 0) return TY_Asm;
+ case 2:
+ if (memcmp(Ext, "ii", 2) == 0) return TY_PP_CXX;
+ if (memcmp(Ext, "mi", 2) == 0) return TY_PP_ObjC;
+ if (memcmp(Ext, "mm", 2) == 0) return TY_ObjCXX;
+ if (memcmp(Ext, "cc", 2) == 0) return TY_CXX;
+ if (memcmp(Ext, "cc", 2) == 0) return TY_CXX;
+ if (memcmp(Ext, "cp", 2) == 0) return TY_CXX;
+ if (memcmp(Ext, "hh", 2) == 0) return TY_CXXHeader;
+ break;
+ case 3:
+ if (memcmp(Ext, "ads", 3) == 0) return TY_Ada;
+ if (memcmp(Ext, "adb", 3) == 0) return TY_Ada;
+ if (memcmp(Ext, "cxx", 3) == 0) return TY_CXX;
+ if (memcmp(Ext, "cpp", 3) == 0) return TY_CXX;
+ if (memcmp(Ext, "CPP", 3) == 0) return TY_CXX;
+ if (memcmp(Ext, "cXX", 3) == 0) return TY_CXX;
+ if (memcmp(Ext, "for", 3) == 0) return TY_PP_Fortran;
+ if (memcmp(Ext, "FOR", 3) == 0) return TY_PP_Fortran;
+ if (memcmp(Ext, "fpp", 3) == 0) return TY_Fortran;
+ if (memcmp(Ext, "FPP", 3) == 0) return TY_Fortran;
+ if (memcmp(Ext, "f90", 3) == 0) return TY_PP_Fortran;
+ if (memcmp(Ext, "f95", 3) == 0) return TY_PP_Fortran;
+ if (memcmp(Ext, "F90", 3) == 0) return TY_Fortran;
+ if (memcmp(Ext, "F95", 3) == 0) return TY_Fortran;
+ if (memcmp(Ext, "mii", 3) == 0) return TY_PP_ObjCXX;
+ break;
+ }
+
+ return TY_INVALID;
+}
+
+types::ID types::lookupTypeForTypeSpecifier(const char *Name) {
+ unsigned N = strlen(Name);
+
+ for (unsigned i=0; i<numTypes; ++i) {
+ types::ID Id = (types::ID) (i + 1);
+ if (canTypeBeUserSpecified(Id) &&
+ memcmp(Name, getInfo(Id).Name, N) == 0)
+ return Id;
+ }
+
+ return TY_INVALID;
+}
More information about the cfe-commits
mailing list