Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / third-party / benchmark / .ycm_extra_conf.py
blob1482c7b00202ea090d17fdebfe74cdf90baf8e16
1 import os
2 import ycm_core
4 # These are the compilation flags that will be used in case there's no
5 # compilation database set (by default, one is not set).
6 # CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
7 flags = [
8 "-Wall",
9 "-Werror",
10 "-pedantic-errors",
11 "-std=c++0x",
12 "-fno-strict-aliasing",
13 "-O3",
14 "-DNDEBUG",
15 # ...and the same thing goes for the magic -x option which specifies the
16 # language that the files to be compiled are written in. This is mostly
17 # relevant for c++ headers.
18 # For a C project, you would set this to 'c' instead of 'c++'.
19 "-x",
20 "c++",
21 "-I",
22 "include",
23 "-isystem",
24 "/usr/include",
25 "-isystem",
26 "/usr/local/include",
30 # Set this to the absolute path to the folder (NOT the file!) containing the
31 # compile_commands.json file to use that instead of 'flags'. See here for
32 # more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
34 # Most projects will NOT need to set this to anything; you can just change the
35 # 'flags' list of compilation flags. Notice that YCM itself uses that approach.
36 compilation_database_folder = ""
38 if os.path.exists(compilation_database_folder):
39 database = ycm_core.CompilationDatabase(compilation_database_folder)
40 else:
41 database = None
43 SOURCE_EXTENSIONS = [".cc"]
46 def DirectoryOfThisScript():
47 return os.path.dirname(os.path.abspath(__file__))
50 def MakeRelativePathsInFlagsAbsolute(flags, working_directory):
51 if not working_directory:
52 return list(flags)
53 new_flags = []
54 make_next_absolute = False
55 path_flags = ["-isystem", "-I", "-iquote", "--sysroot="]
56 for flag in flags:
57 new_flag = flag
59 if make_next_absolute:
60 make_next_absolute = False
61 if not flag.startswith("/"):
62 new_flag = os.path.join(working_directory, flag)
64 for path_flag in path_flags:
65 if flag == path_flag:
66 make_next_absolute = True
67 break
69 if flag.startswith(path_flag):
70 path = flag[len(path_flag) :]
71 new_flag = path_flag + os.path.join(working_directory, path)
72 break
74 if new_flag:
75 new_flags.append(new_flag)
76 return new_flags
79 def IsHeaderFile(filename):
80 extension = os.path.splitext(filename)[1]
81 return extension in [".h", ".hxx", ".hpp", ".hh"]
84 def GetCompilationInfoForFile(filename):
85 # The compilation_commands.json file generated by CMake does not have entries
86 # for header files. So we do our best by asking the db for flags for a
87 # corresponding source file, if any. If one exists, the flags for that file
88 # should be good enough.
89 if IsHeaderFile(filename):
90 basename = os.path.splitext(filename)[0]
91 for extension in SOURCE_EXTENSIONS:
92 replacement_file = basename + extension
93 if os.path.exists(replacement_file):
94 compilation_info = database.GetCompilationInfoForFile(replacement_file)
95 if compilation_info.compiler_flags_:
96 return compilation_info
97 return None
98 return database.GetCompilationInfoForFile(filename)
101 def FlagsForFile(filename, **kwargs):
102 if database:
103 # Bear in mind that compilation_info.compiler_flags_ does NOT return a
104 # python list, but a "list-like" StringVec object
105 compilation_info = GetCompilationInfoForFile(filename)
106 if not compilation_info:
107 return None
109 final_flags = MakeRelativePathsInFlagsAbsolute(
110 compilation_info.compiler_flags_, compilation_info.compiler_working_dir_
112 else:
113 relative_to = DirectoryOfThisScript()
114 final_flags = MakeRelativePathsInFlagsAbsolute(flags, relative_to)
116 return {"flags": final_flags, "do_cache": True}