Skip to content

Commit

Permalink
Merge pull request #20 from krasin/dcpu16
Browse files Browse the repository at this point in the history
Update clang to the upstream tip
  • Loading branch information
Blei committed Jul 5, 2012
2 parents 31e3eaa + 2ca3be4 commit 4b960e0
Show file tree
Hide file tree
Showing 369 changed files with 13,073 additions and 6,610 deletions.
8 changes: 8 additions & 0 deletions CMakeLists.txt
Expand Up @@ -53,6 +53,14 @@ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
set(LLVM_TABLEGEN_EXE "${PATH_TO_LLVM_BUILD}/bin/Debug/llvm-tblgen${CMAKE_EXECUTABLE_SUFFIX}")
endif()

# Define the default arguments to use with 'lit', and an option for the user
# to override.
set(LIT_ARGS_DEFAULT "-sv")
if (MSVC OR XCODE)
set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
endif()
set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")

set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib )
Expand Down
153 changes: 153 additions & 0 deletions bindings/python/clang/cindex.py
Expand Up @@ -2096,6 +2096,120 @@ def is_input_file(self):
"""True if the included file is the input file."""
return self.depth == 0

class CompilationDatabaseError(Exception):
"""Represents an error that occurred when working with a CompilationDatabase
Each error is associated to an enumerated value, accessible under
e.cdb_error. Consumers can compare the value with one of the ERROR_
constants in this class.
"""

# An unknown error occured
ERROR_UNKNOWN = 0

# The database could not be loaded
ERROR_CANNOTLOADDATABASE = 1

def __init__(self, enumeration, message):
assert isinstance(enumeration, int)

if enumeration > 1:
raise Exception("Encountered undefined CompilationDatabase error "
"constant: %d. Please file a bug to have this "
"value supported." % enumeration)

self.cdb_error = enumeration
Exception.__init__(self, 'Error %d: %s' % (enumeration, message))

class CompileCommand(object):
"""Represents the compile command used to build a file"""
def __init__(self, cmd, ccmds):
self.cmd = cmd
# Keep a reference to the originating CompileCommands
# to prevent garbage collection
self.ccmds = ccmds

@property
def directory(self):
"""Get the working directory for this CompileCommand"""
return CompileCommand_getDirectory(self.cmd).spelling

@property
def arguments(self):
"""
Get an iterable object providing each argument in the
command line for the compiler invocation as a _CXString.
Invariants :
- the first argument is the compiler executable
- the last argument is the file being compiled
"""
length = CompileCommand_getNumArgs(self.cmd)
for i in xrange(length):
yield CompileCommand_getArg(self.cmd, i)

class CompileCommands(object):
"""
CompileCommands is an iterable object containing all CompileCommand
that can be used for building a specific file.
"""
def __init__(self, ccmds):
self.ccmds = ccmds

def __del__(self):
CompileCommands_dispose(self.ccmds)

def __len__(self):
return int(CompileCommands_getSize(self.ccmds))

def __getitem__(self, i):
cc = CompileCommands_getCommand(self.ccmds, i)
if cc is None:
raise IndexError
return CompileCommand(cc, self)

@staticmethod
def from_result(res, fn, args):
if not res:
return None
return CompileCommands(res)

class CompilationDatabase(ClangObject):
"""
The CompilationDatabase is a wrapper class around
clang::tooling::CompilationDatabase
It enables querying how a specific source file can be built.
"""

def __del__(self):
CompilationDatabase_dispose(self)

@staticmethod
def from_result(res, fn, args):
if not res:
raise CompilationDatabaseError(0,
"CompilationDatabase loading failed")
return CompilationDatabase(res)

@staticmethod
def fromDirectory(buildDir):
"""Builds a CompilationDatabase from the database found in buildDir"""
errorCode = c_uint()
try:
cdb = CompilationDatabase_fromDirectory(buildDir, byref(errorCode))
except CompilationDatabaseError as e:
raise CompilationDatabaseError(int(errorCode.value),
"CompilationDatabase loading failed")
return cdb

def getCompileCommands(self, filename):
"""
Get an iterable object providing all the CompileCommands available to
build filename. Returns None if filename is not found in the database.
"""
return CompilationDatabase_getCompileCommands(self, filename)

# Additional Functions and Types

# String Functions
Expand Down Expand Up @@ -2463,9 +2577,48 @@ def is_input_file(self):
_clang_getCompletionPriority.argtypes = [c_void_p]
_clang_getCompletionPriority.restype = c_int

# Compilation Database
CompilationDatabase_fromDirectory = lib.clang_CompilationDatabase_fromDirectory
CompilationDatabase_fromDirectory.argtypes = [c_char_p, POINTER(c_uint)]
CompilationDatabase_fromDirectory.restype = c_object_p
CompilationDatabase_fromDirectory.errcheck = CompilationDatabase.from_result

CompilationDatabase_dispose = lib.clang_CompilationDatabase_dispose
CompilationDatabase_dispose.argtypes = [c_object_p]

CompilationDatabase_getCompileCommands = lib.clang_CompilationDatabase_getCompileCommands
CompilationDatabase_getCompileCommands.argtypes = [c_object_p, c_char_p]
CompilationDatabase_getCompileCommands.restype = c_object_p
CompilationDatabase_getCompileCommands.errcheck = CompileCommands.from_result

CompileCommands_dispose = lib.clang_CompileCommands_dispose
CompileCommands_dispose.argtypes = [c_object_p]

CompileCommands_getSize = lib.clang_CompileCommands_getSize
CompileCommands_getSize.argtypes = [c_object_p]
CompileCommands_getSize.restype = c_uint

CompileCommands_getCommand = lib.clang_CompileCommands_getCommand
CompileCommands_getCommand.argtypes = [c_object_p, c_uint]
CompileCommands_getCommand.restype = c_object_p

CompileCommand_getDirectory = lib.clang_CompileCommand_getDirectory
CompileCommand_getDirectory.argtypes = [c_object_p]
CompileCommand_getDirectory.restype = _CXString

CompileCommand_getNumArgs = lib.clang_CompileCommand_getNumArgs
CompileCommand_getNumArgs.argtypes = [c_object_p]
CompileCommand_getNumArgs.restype = c_uint

CompileCommand_getArg = lib.clang_CompileCommand_getArg
CompileCommand_getArg.argtypes = [c_object_p, c_uint]
CompileCommand_getArg.restype = _CXString

__all__ = [
'CodeCompletionResults',
'CompilationDatabase',
'CompileCommands',
'CompileCommand',
'CursorKind',
'Cursor',
'Diagnostic',
Expand Down
17 changes: 17 additions & 0 deletions bindings/python/tests/cindex/INPUTS/compile_commands.json
@@ -0,0 +1,17 @@
[
{
"directory": "/home/john.doe/MyProject",
"command": "clang++ -o project.o -c /home/john.doe/MyProject/project.cpp",
"file": "/home/john.doe/MyProject/project.cpp"
},
{
"directory": "/home/john.doe/MyProjectA",
"command": "clang++ -o project2.o -c /home/john.doe/MyProject/project2.cpp",
"file": "/home/john.doe/MyProject/project2.cpp"
},
{
"directory": "/home/john.doe/MyProjectB",
"command": "clang++ -DFEATURE=1 -o project2-feature.o -c /home/john.doe/MyProject/project2.cpp",
"file": "/home/john.doe/MyProject/project2.cpp"
}
]
81 changes: 81 additions & 0 deletions bindings/python/tests/cindex/test_cdb.py
@@ -0,0 +1,81 @@
from clang.cindex import CompilationDatabase
from clang.cindex import CompilationDatabaseError
from clang.cindex import CompileCommands
from clang.cindex import CompileCommand
import os
import gc

kInputsDir = os.path.join(os.path.dirname(__file__), 'INPUTS')

def test_create_fail():
"""Check we fail loading a database with an assertion"""
path = os.path.dirname(__file__)
try:
cdb = CompilationDatabase.fromDirectory(path)
except CompilationDatabaseError as e:
assert e.cdb_error == CompilationDatabaseError.ERROR_CANNOTLOADDATABASE
else:
assert False

def test_create():
"""Check we can load a compilation database"""
cdb = CompilationDatabase.fromDirectory(kInputsDir)

def test_lookup_fail():
"""Check file lookup failure"""
cdb = CompilationDatabase.fromDirectory(kInputsDir)
assert cdb.getCompileCommands('file_do_not_exist.cpp') == None

def test_lookup_succeed():
"""Check we get some results if the file exists in the db"""
cdb = CompilationDatabase.fromDirectory(kInputsDir)
cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp')
assert len(cmds) != 0

def test_1_compilecommand():
"""Check file with single compile command"""
cdb = CompilationDatabase.fromDirectory(kInputsDir)
cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp')
assert len(cmds) == 1
assert cmds[0].directory == '/home/john.doe/MyProject'
expected = [ 'clang++', '-o', 'project.o', '-c',
'/home/john.doe/MyProject/project.cpp']
for arg, exp in zip(cmds[0].arguments, expected):
assert arg.spelling == exp

def test_2_compilecommand():
"""Check file with 2 compile commands"""
cdb = CompilationDatabase.fromDirectory(kInputsDir)
cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project2.cpp')
assert len(cmds) == 2
expected = [
{ 'wd': '/home/john.doe/MyProjectA',
'line': ['clang++', '-o', 'project2.o', '-c',
'/home/john.doe/MyProject/project2.cpp']},
{ 'wd': '/home/john.doe/MyProjectB',
'line': ['clang++', '-DFEATURE=1', '-o', 'project2-feature.o', '-c',
'/home/john.doe/MyProject/project2.cpp']}
]
for i in range(len(cmds)):
assert cmds[i].directory == expected[i]['wd']
for arg, exp in zip(cmds[i].arguments, expected[i]['line']):
assert arg.spelling == exp

def test_compilationDB_references():
"""Ensure CompilationsCommands are independent of the database"""
cdb = CompilationDatabase.fromDirectory(kInputsDir)
cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp')
del cdb
gc.collect()
workingdir = cmds[0].directory

def test_compilationCommands_references():
"""Ensure CompilationsCommand keeps a reference to CompilationCommands"""
cdb = CompilationDatabase.fromDirectory(kInputsDir)
cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp')
del cdb
cmd0 = cmds[0]
del cmds
gc.collect()
workingdir = cmd0.directory

14 changes: 8 additions & 6 deletions docs/AddressSanitizer.html
Expand Up @@ -99,10 +99,10 @@ <h3 id="has_feature">__has_feature(address_sanitizer)</h3>
<a href="LanguageExtensions.html#__has_feature_extension">__has_feature</a>
can be used for this purpose.
<pre>
#if defined(__has_feature) &amp;&amp; __has_feature(address_sanitizer)
code that runs only under AddressSanitizer
#else
code that does not run under AddressSanitizer
#if defined(__has_feature)
# if __has_feature(address_sanitizer)
code that builds only under AddressSanitizer
# endif
#endif
</pre>

Expand All @@ -112,14 +112,16 @@ <h3 id="no_address_safety_analysis">__attribute__((no_address_safety_analysis))<
<a href="LanguageExtensions.html#address_sanitizer">
<tt>no_address_safety_analysis</tt></a>
to disable instrumentation of a particular function.
This attribute may not be supported by other compilers, so we suggest to
use it together with <tt>__has_feature(address_sanitizer)</tt>.
Note: currently, this attribute will be lost if the function is inlined.

<h2 id="platforms">Supported Platforms</h2>
AddressSanitizer is supported on
<ul><li>Linux x86_64 (tested on Ubuntu 10.04).
<li>MacOS 10.6 i386/x86_64.
<li>MacOS 10.6 and 10.7 (i386/x86_64).
</ul>
Support for Linux i386/ARM and MacOS 10.7 is in progress
Support for Linux i386/ARM is in progress
(it may work, but is not guaranteed too).


Expand Down
6 changes: 6 additions & 0 deletions docs/InternalsManual.html
Expand Up @@ -357,6 +357,12 @@ <h4>Formatting a Diagnostic Argument</h4>
<tr><td>Example:</td><td><tt>"candidate found by name lookup is %q0"</tt></td></tr>
<tr><td>Class:</td><td>NamedDecl*</td></tr>
<tr><td>Description</td><td><p>This formatter indicates that the fully-qualified name of the declaration should be printed, e.g., "std::vector" rather than "vector".</p></td></tr>

<tr><td colspan="2"><b>"diff" format</b></td></tr>
<tr><td>Example:</td><td><tt>"no known conversion %diff{from | to | }1,2"</tt></td></tr>
<tr><td>Class:</td><td>QualType</td></tr>
<tr><td>Description</td><td><p>This formatter takes two QualTypes and attempts to print a template difference between the two. If tree printing is off, the text inside the the braces before the pipe is printed, with the formatted text replacing the $. If tree printing is on, the text after the pipe is printed and a type tree is printed after the diagnostic message.
</p></td></tr>

</table>

Expand Down
49 changes: 49 additions & 0 deletions docs/ReleaseNotes.html
Expand Up @@ -121,6 +121,55 @@ <h4 id="diagnostics">Improvements to Clang's diagnostics</h4>
This functionality can be enabled or disabled separately from
<tt>-Wuninitialized</tt> with the <tt>-Wsometimes-uninitialized</tt> warning
flag.</li>

<li>Template type diffing improves the display of diagnostics with templated
types in them.

<pre>
int f(vector&lt;map&lt;int, double&gt;&gt;);
int x = f(vector&lt;map&lt;int, float&gt;&gt;());
</pre>
The error message is the same, but the note is different based on the options selected.
<pre>
<b>template-diff.cpp:5:9: <span class="error">error:</span> no matching function for call to 'f'</b>
int x = f(vector&lt;map&lt;int, float&gt;&gt;());
<span class="caret">^</span>
</pre>
Templated type diffing with type elision (default):
<pre>
<b>template-diff.cpp:4:5: <span class="note">note:</span></b> candidate function not viable: no known conversion from 'vector&lt;map&lt;[...], <span class="template-highlight">float</span>&gt;&gt;' to 'vector&lt;map&lt;[...], <span class="template-highlight">double</span>&gt;&gt;' for 1st argument;
int f(vector&lt;map&lt;int, double&gt;&gt;);
<span class="caret">^</span>
</pre>
Templated type diffing without type elision (-fno-elide-type):
<pre>
<b>template-diff.cpp:4:5: <span class="note">note:</span></b> candidate function not viable: no known conversion from 'vector&lt;map&lt;int, <span class="template-highlight">float</span>&gt;&gt;' to 'vector&lt;map&lt;int, <span class="template-highlight">double</span>&gt;&gt;' for 1st argument;
int f(vector&lt;map&lt;int, double&gt;&gt;);
<span class="caret">^</span>
</pre>
Templated tree printing with type elision (-fdiagnostics-show-template-tree):
<pre>
<b>template-diff.cpp:4:5: <span class="note">note:</span></b> candidate function not viable: no known conversion for 1st argument;
vector&lt;
map&lt;
[...],
[<span class="template-highlight">float</span> != <span class="template-highlight">double</span>]&gt;&gt;
int f(vector&lt;map&lt;int, double&gt;&gt;);
<span class="caret">^</span>
</pre>
Templated tree printing without type elision (-fdiagnostics-show-template-tree -fno-elide-type):
<pre>
<b>template-diff.cpp:4:5: <span class="note">note:</span></b> candidate function not viable: no known conversion for 1st argument;
vector&lt;
map&lt;
int,
[<span class="template-highlight">float</span> != <span class="template-highlight">double</span>]&gt;&gt;
int f(vector&lt;map&lt;int, double&gt;&gt;);
<span class="caret">^</span>
</pre>

</li>

</ul>

<h4 id="tlsmodel">Support for <code>tls_model</code> attribute</h4>
Expand Down

0 comments on commit 4b960e0

Please sign in to comment.