Updated to Clang 3.5a.

Change-Id: I8127eb568f674c2e72635b639a3295381fe8af82
diff --git a/test/lit.cfg b/test/lit.cfg
index 19daa61..66cec61 100644
--- a/test/lit.cfg
+++ b/test/lit.cfg
@@ -44,7 +44,7 @@
 config.test_format = lit.formats.ShTest(execute_external)
 
 # suffixes: A list of file extensions to treat as test files.
-config.suffixes = ['.c', '.cpp', '.m', '.mm', '.cu', '.ll', '.cl', '.s']
+config.suffixes = ['.c', '.cpp', '.m', '.mm', '.cu', '.ll', '.cl', '.s', '.S']
 
 # excludes: A list of directories to exclude from the testsuite. The 'Inputs'
 # subdirectories contain auxiliary inputs for various tests in their parent
@@ -94,10 +94,14 @@
 
 # Tweak the PATH to include the tools dir and the scripts dir.
 if clang_obj_root is not None:
+    clang_tools_dir = getattr(config, 'clang_tools_dir', None)
+    if not clang_tools_dir:
+        lit_config.fatal('No Clang tools dir set!')
     llvm_tools_dir = getattr(config, 'llvm_tools_dir', None)
     if not llvm_tools_dir:
         lit_config.fatal('No LLVM tools dir set!')
-    path = os.path.pathsep.join((llvm_tools_dir, config.environment['PATH']))
+    path = os.path.pathsep.join((
+            clang_tools_dir, llvm_tools_dir, config.environment['PATH']))
     config.environment['PATH'] = path
     llvm_libs_dir = getattr(config, 'llvm_libs_dir', None)
     if not llvm_libs_dir:
@@ -191,6 +195,22 @@
 if not lit_config.quiet:
     lit_config.note('using clang: %r' % config.clang)
 
+# Plugins (loadable modules)
+# TODO: This should be supplied by Makefile or autoconf.
+if sys.platform in ['win32', 'cygwin']:
+    has_plugins = (config.enable_shared == 1)
+else:
+    has_plugins = True
+
+if has_plugins and config.llvm_plugin_ext:
+    config.available_features.add('plugins')
+
+config.substitutions.append( ('%llvmshlibdir', config.llvm_shlib_dir) )
+config.substitutions.append( ('%pluginext', config.llvm_plugin_ext) )
+
+if config.clang_examples:
+    config.available_features.add('examples')
+
 # Note that when substituting %clang_cc1 also fill in the include directory of
 # the builtin headers. Those are part of even a freestanding environment, but
 # Clang relies on the driver to locate them.
@@ -208,6 +228,31 @@
     # Ensure the result is an ascii string, across Python2.5+ - Python3.
     return str(dir.decode('ascii'))
 
+def makeItaniumABITriple(triple):
+    m = re.match(r'(\w+)-(\w+)-(\w+)', triple)
+    if not m:
+      lit_config.fatal("Could not turn '%s' into Itanium ABI triple" % triple)
+    if m.group(3).lower() != 'win32':
+      # All non-win32 triples use the Itanium ABI.
+      return triple
+    return m.group(1) + '-' + m.group(2) + '-mingw32'
+
+def makeMSABITriple(triple):
+    m = re.match(r'(\w+)-(\w+)-(\w+)', triple)
+    if not m:
+      lit_config.fatal("Could not turn '%s' into MS ABI triple" % triple)
+    isa = m.group(1).lower()
+    vendor = m.group(2).lower()
+    os = m.group(3).lower()
+    if os == 'win32':
+      # If the OS is win32, we're done.
+      return triple
+    if isa.startswith('x86') or isa == 'amd64' or re.match(r'i\d86', isa): 
+      # For x86 ISAs, adjust the OS.
+      return isa + '-' + vendor + '-win32'
+    # -win32 is not supported for non-x86 targets; use a default.
+    return 'i686-pc-win32'
+
 config.substitutions.append( ('%clang_cc1', '%s -cc1 -internal-isystem %s'
                               % (config.clang,
                                  getClangBuiltinIncludeDir(config.clang))) )
@@ -219,6 +264,8 @@
                               ' --driver-mode=g++ '))
 config.substitutions.append( ('%clang', ' ' + config.clang + ' ') )
 config.substitutions.append( ('%test_debuginfo', ' ' + config.llvm_src_root + '/utils/test_debuginfo.pl ') )
+config.substitutions.append( ('%itanium_abi_triple', makeItaniumABITriple(config.target_triple)) )
+config.substitutions.append( ('%ms_abi_triple', makeMSABITriple(config.target_triple)) )
 
 # FIXME: Find nicer way to prohibit this.
 config.substitutions.append(
@@ -241,6 +288,42 @@
     (' %clang-cl ',
      """*** invalid substitution, use '%clang_cl'. ***""") )
 
+# For each occurrence of a clang tool name as its own word, replace it
+# with the full path to the build directory holding that tool.  This
+# ensures that we are testing the tools just built and not some random
+# tools that might happen to be in the user's PATH.
+tool_dirs = os.path.pathsep.join((clang_tools_dir, llvm_tools_dir))
+
+# Regex assertions to reject neighbor hyphens/dots (seen in some tests).
+# For example, don't match 'clang-check-' or '.clang-format'.
+NoPreHyphenDot = r"(?<!(-|\.))"
+NoPostHyphenDot = r"(?!(-|\.))"
+
+for pattern in [r"\bFileCheck\b",
+                r"\bc-index-test\b",
+                NoPreHyphenDot + r"\bclang-check\b" + NoPostHyphenDot,
+                NoPreHyphenDot + r"\bclang-format\b" + NoPostHyphenDot,
+                # FIXME: Some clang test uses opt?
+                NoPreHyphenDot + r"\bopt\b" + NoPostHyphenDot,
+                # Handle these specially as they are strings searched
+                # for during testing.
+                r"\| \bcount\b",
+                r"\| \bnot\b"]:
+    # Extract the tool name from the pattern.  This relies on the tool
+    # name being surrounded by \b word match operators.  If the
+    # pattern starts with "| ", include it in the string to be
+    # substituted.
+    tool_match = re.match(r"^(\\)?((\| )?)\W+b([0-9A-Za-z-_]+)\\b\W*$",
+                          pattern)
+    tool_pipe = tool_match.group(2)
+    tool_name = tool_match.group(4)
+    tool_path = lit.util.which(tool_name, tool_dirs)
+    if not tool_path:
+        # Warn, but still provide a substitution.
+        lit_config.note('Did not find ' + tool_name + ' in ' + tool_dirs)
+        tool_path = clang_tools_dir + '/' + tool_name
+    config.substitutions.append((pattern, tool_pipe + tool_path))
+
 ###
 
 # Set available features we allow tests to conditionalize on.
@@ -257,12 +340,24 @@
 if not platform.system() in ['Windows'] or not execute_external:
     config.available_features.add('shell-preserves-root')
 
+# For tests that require Darwin to run.
+# This is used by debuginfo-tests/*block*.m and debuginfo-tests/foreach.m.
+if platform.system() in ['Darwin']:
+    config.available_features.add('system-darwin')
+
 # ANSI escape sequences in non-dumb terminal
 if platform.system() not in ['Windows']:
     config.available_features.add('ansi-escape-sequences')
 
-# Native compilation: host arch == target arch
-if config.host_arch in config.target_triple:
+# Capability to print utf8 to the terminal.
+# Windows expects codepage, unless Wide API.
+if platform.system() not in ['Windows']:
+    config.available_features.add('utf8-capable-terminal')
+
+# Native compilation: Check if triples match.
+# FIXME: Consider cases that target can be executed
+# even if host_triple were different from target_triple.
+if config.host_triple == config.target_triple:
     config.available_features.add("native")
 
 # Case-insensitive file system
@@ -284,6 +379,14 @@
 if os.path.exists("/dev/fd/0") and sys.platform not in ['cygwin']:
     config.available_features.add('dev-fd-fs')
 
+# DW2 Target
+if not re.match(r'.*-win32$', config.target_triple):
+    config.available_features.add('dw2')
+
+# Not set on native MS environment.
+if not re.match(r'.*-win32$', config.target_triple):
+    config.available_features.add('non-ms-sdk')
+
 # [PR8833] LLP64-incompatible tests
 if not re.match(r'^x86_64.*-(win32|mingw32)$', config.target_triple):
     config.available_features.add('LP64')
@@ -292,40 +395,36 @@
 if not re.match(r'.*-(cygwin|mingw32)$', config.target_triple):
     config.available_features.add('clang-driver')
 
-# Registered Targets
-def get_llc_props(tool):
-    set_of_targets = set()
-    enable_assertions = False
+# [PR18856] Depends to remove opened file. On win32, a file could be removed
+# only if all handles were closed.
+if platform.system() not in ['Windows']:
+    config.available_features.add('can-remove-opened-file')
 
-    cmd = subprocess.Popen([tool, '-version'], stdout=subprocess.PIPE)
+# Returns set of available features, registered-target(s) and asserts.
+def get_llvm_config_props():
+    set_of_features = set()
 
-    # Parse the stdout to get the list of registered targets.
-    parse_targets = False
-    for line in cmd.stdout:
-        line = line.decode('ascii')
-        if parse_targets:
-            m = re.match( r'(.*) - ', line)
-            if m is not None:
-                set_of_targets.add(m.group(1).strip() + '-registered-target')
-            else:
-                break
-        elif "Registered Targets:" in line:
-            parse_targets = True
+    cmd = subprocess.Popen(
+        [
+            os.path.join(llvm_tools_dir, 'llvm-config'),
+            '--assertion-mode',
+            '--targets-built',
+            ],
+        stdout=subprocess.PIPE
+        )
+    # 1st line corresponds to --assertion-mode, "ON" or "OFF".
+    line = cmd.stdout.readline().strip().decode('ascii')
+    if line == "ON":
+        set_of_features.add('asserts')
 
-        if re.search(r'with assertions', line):
-            enable_assertions = True
+    # 2nd line corresponds to --targets-built, like;
+    # AArch64 ARM CppBackend X86
+    for arch in cmd.stdout.readline().decode('ascii').split():
+        set_of_features.add(arch.lower() + '-registered-target')
 
-    return {"set_of_targets":    set_of_targets,
-            "enable_assertions": enable_assertions}
+    return set_of_features
 
-llc_props = get_llc_props(os.path.join(llvm_tools_dir, 'llc'))
-if len(llc_props['set_of_targets']) > 0:
-    config.available_features.update(llc_props['set_of_targets'])
-else:
-    lit_config.fatal('No Targets Registered with the LLVM Tools!')
-
-if llc_props['enable_assertions']:
-    config.available_features.add('asserts')
+config.available_features.update(get_llvm_config_props())
 
 if lit.util.which('xmllint'):
     config.available_features.add('xmllint')
@@ -333,6 +432,8 @@
 # Sanitizers.
 if config.llvm_use_sanitizer == "Address":
     config.available_features.add("asan")
+else:
+    config.available_features.add("not_asan")
 if (config.llvm_use_sanitizer == "Memory" or
         config.llvm_use_sanitizer == "MemoryWithOrigins"):
     config.available_features.add("msan")