From 8584bb008a542b6c3a00783b39db96d713b241c6 Mon Sep 17 00:00:00 2001 From: "Lukasz A.J. Wrona" Date: Wed, 23 Aug 2017 16:06:40 +0100 Subject: [PATCH 01/80] Add nonstd/optional.hpp library --- src/nonstd/optional.hpp | 1087 +++++++++++++++++++++++++++++++++++++++ src/util/optional.h | 51 ++ 2 files changed, 1138 insertions(+) create mode 100644 src/nonstd/optional.hpp create mode 100644 src/util/optional.h diff --git a/src/nonstd/optional.hpp b/src/nonstd/optional.hpp new file mode 100644 index 00000000000..7b70afa1f90 --- /dev/null +++ b/src/nonstd/optional.hpp @@ -0,0 +1,1087 @@ +// +// Copyright (c) 2016 Martin Moene +// +// https://github.com/martinmoene/optional-lite +// +// This code is licensed under the MIT License (MIT). +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#pragma once + +#ifndef NONSTD_OPTIONAL_LITE_HPP +#define NONSTD_OPTIONAL_LITE_HPP + +#include +#include +#include + +#define optional_lite_VERSION "2.1.0" + +// variant-lite alignment configuration: + +#ifndef optional_CONFIG_MAX_ALIGN_HACK +# define optional_CONFIG_MAX_ALIGN_HACK 0 +#endif + +#ifndef optional_CONFIG_ALIGN_AS +// no default, used in #if defined() +#endif + +#ifndef optional_CONFIG_ALIGN_AS_FALLBACK +# define optional_CONFIG_ALIGN_AS_FALLBACK double +#endif + +// Compiler detection (C++17 is speculative): + +#define optional_CPP11_OR_GREATER ( __cplusplus >= 201103L ) +#define optional_CPP14_OR_GREATER ( __cplusplus >= 201402L ) +#define optional_CPP17_OR_GREATER ( __cplusplus >= 201700L ) + +// half-open range [lo..hi): +#define optional_BETWEEN( v, lo, hi ) ( lo <= v && v < hi ) + +#if defined(_MSC_VER) && !defined(__clang__) +# define optional_COMPILER_MSVC_VERSION (_MSC_VER / 100 - 5 - (_MSC_VER < 1900)) +#else +# define optional_COMPILER_MSVC_VERSION 0 +#endif + +#if defined __GNUC__ +# define optional_COMPILER_GNUC_VERSION __GNUC__ +#else +# define optional_COMPILER_GNUC_VERSION 0 +#endif + +#if optional_BETWEEN(optional_COMPILER_MSVC_VERSION, 7, 14 ) +# pragma warning( push ) +# pragma warning( disable: 4345 ) // initialization behavior changed +#endif + +#if optional_BETWEEN(optional_COMPILER_MSVC_VERSION, 7, 15 ) +# pragma warning( push ) +# pragma warning( disable: 4814 ) // in C++14 'constexpr' will not imply 'const' +#endif + +// Presence of C++11 language features: + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 10 +# define optional_HAVE_AUTO 1 +# define optional_HAVE_NULLPTR 1 +# define optional_HAVE_STATIC_ASSERT 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 12 +# define optional_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG 1 +# define optional_HAVE_INITIALIZER_LIST 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 14 +# define optional_HAVE_ALIAS_TEMPLATE 1 +# define optional_HAVE_CONSTEXPR_11 1 +# define optional_HAVE_ENUM_CLASS 1 +# define optional_HAVE_EXPLICIT_CONVERSION 1 +# define optional_HAVE_IS_DEFAULT 1 +# define optional_HAVE_IS_DELETE 1 +# define optional_HAVE_NOEXCEPT 1 +# define optional_HAVE_REF_QUALIFIER 1 +#endif + +// Presence of C++14 language features: + +#if optional_CPP14_OR_GREATER +# define optional_HAVE_CONSTEXPR_14 1 +#endif + +// Presence of C++17 language features: + +#if optional_CPP17_OR_GREATER +# define optional_HAVE_ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE 1 +#endif + +// Presence of C++ library features: + +#if optional_COMPILER_GNUC_VERSION +# define optional_HAVE_TR1_TYPE_TRAITS 1 +# define optional_HAVE_TR1_ADD_POINTER 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 9 +# define optional_HAVE_TYPE_TRAITS 1 +# define optional_HAVE_STD_ADD_POINTER 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 11 +# define optional_HAVE_ARRAY 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 12 +# define optional_HAVE_CONDITIONAL 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 14 || (optional_COMPILER_MSVC_VERSION >= 9 && _HAS_CPP0X) +# define optional_HAVE_CONTAINER_DATA_METHOD 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 12 +# define optional_HAVE_REMOVE_CV 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 14 +# define optional_HAVE_SIZED_TYPES 1 +#endif + +// For the rest, consider VC14 as C++11 for variant-lite: + +#if optional_COMPILER_MSVC_VERSION >= 14 +# undef optional_CPP11_OR_GREATER +# define optional_CPP11_OR_GREATER 1 +#endif + +// C++ feature usage: + +#if optional_HAVE_CONSTEXPR_11 +# define optional_constexpr constexpr +#else +# define optional_constexpr /*constexpr*/ +#endif + +#if optional_HAVE_CONSTEXPR_14 +# define optional_constexpr14 constexpr +#else +# define optional_constexpr14 /*constexpr*/ +#endif + +#if optional_HAVE_NOEXCEPT +# define optional_noexcept noexcept +#else +# define optional_noexcept /*noexcept*/ +#endif + +#if optional_HAVE_NULLPTR +# define optional_nullptr nullptr +#else +# define optional_nullptr NULL +#endif + +#if optional_HAVE_REF_QUALIFIER +# define optional_ref_qual & +# define optional_refref_qual && +#else +# define optional_ref_qual /*&*/ +# define optional_refref_qual /*&&*/ +#endif + +// additional includes: + +#if optional_CPP11_OR_GREATER +# include +#endif + +#if optional_HAVE_INITIALIZER_LIST +# include +#endif + +#if optional_HAVE_TYPE_TRAITS +# include +#elif optional_HAVE_TR1_TYPE_TRAITS +# include +#endif + +// +// in_place: code duplicated in any-lite, optional-lite, variant-lite: +// + +#if ! nonstd_lite_HAVE_IN_PLACE_TYPES + +namespace nonstd { + +namespace detail { + +template< class T > +struct in_place_type_tag {}; + +template< std::size_t I > +struct in_place_index_tag {}; + +} // namespace detail + +struct in_place_t {}; + +template< class T > +inline in_place_t in_place( detail::in_place_type_tag = detail::in_place_type_tag() ) +{ + return in_place_t(); +} + +template< std::size_t I > +inline in_place_t in_place( detail::in_place_index_tag = detail::in_place_index_tag() ) +{ + return in_place_t(); +} + +// mimic templated typedef: + +#define nonstd_lite_in_place_type_t( T) nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag ) +#define nonstd_lite_in_place_index_t(T) nonstd::in_place_t(&)( nonstd::detail::in_place_index_tag ) + +#define nonstd_lite_HAVE_IN_PLACE_TYPES 1 + +} // namespace nonstd + +#endif // nonstd_lite_HAVE_IN_PLACE_TYPES + +// +// optional: +// + +namespace nonstd { namespace optional_lite { + +/// class optional + +template< typename T > +class optional; + +namespace detail { + +// C++11 emulation: + +#if variant_HAVE_CONDITIONAL + +using std::conditional; + +#else + +template< bool Cond, class Then, class Else > +struct conditional; + +template< class Then, class Else > +struct conditional< true , Then, Else > { typedef Then type; }; + +template< class Then, class Else > +struct conditional< false, Then, Else > { typedef Else type; }; + +#endif // variant_HAVE_CONDITIONAL + +struct nulltype{}; + +template< typename Head, typename Tail > +struct typelist +{ + typedef Head head; + typedef Tail tail; +}; + +#if optional_CONFIG_MAX_ALIGN_HACK + +// Max align, use most restricted type for alignment: + +#define optional_UNIQUE( name ) optional_UNIQUE2( name, __LINE__ ) +#define optional_UNIQUE2( name, line ) optional_UNIQUE3( name, line ) +#define optional_UNIQUE3( name, line ) name ## line + +#define optional_ALIGN_TYPE( type ) \ + type optional_UNIQUE( _t ); struct_t< type > optional_UNIQUE( _st ) + +template< typename T > +struct struct_t { T _; }; + +union max_align_t +{ + optional_ALIGN_TYPE( char ); + optional_ALIGN_TYPE( short int ); + optional_ALIGN_TYPE( int ); + optional_ALIGN_TYPE( long int ); + optional_ALIGN_TYPE( float ); + optional_ALIGN_TYPE( double ); + optional_ALIGN_TYPE( long double ); + optional_ALIGN_TYPE( char * ); + optional_ALIGN_TYPE( short int * ); + optional_ALIGN_TYPE( int * ); + optional_ALIGN_TYPE( long int * ); + optional_ALIGN_TYPE( float * ); + optional_ALIGN_TYPE( double * ); + optional_ALIGN_TYPE( long double * ); + optional_ALIGN_TYPE( void * ); + +#ifdef HAVE_LONG_LONG + optional_ALIGN_TYPE( long long ); +#endif + + struct Unknown; + + Unknown ( * optional_UNIQUE(_) )( Unknown ); + Unknown * Unknown::* optional_UNIQUE(_); + Unknown ( Unknown::* optional_UNIQUE(_) )( Unknown ); + + struct_t< Unknown ( * )( Unknown) > optional_UNIQUE(_); + struct_t< Unknown * Unknown::* > optional_UNIQUE(_); + struct_t< Unknown ( Unknown::* )(Unknown) > optional_UNIQUE(_); +}; + +#undef optional_UNIQUE +#undef optional_UNIQUE2 +#undef optional_UNIQUE3 + +#undef optional_ALIGN_TYPE + +#elif defined( optional_CONFIG_ALIGN_AS ) // optional_CONFIG_MAX_ALIGN_HACK + +// Use user-specified type for alignment: + +#define optional_ALIGN_AS( unused ) \ + optional_CONFIG_ALIGN_AS + +#else // optional_CONFIG_MAX_ALIGN_HACK + +// Determine POD type to use for alignment: + +#define optional_ALIGN_AS( to_align ) \ + typename type_of_size< alignment_types, alignment_of< to_align >::value >::type + +template +struct alignment_of; + +template +struct alignment_of_hack +{ + char c; + T t; + alignment_of_hack(); +}; + +template +struct alignment_logic +{ + enum { value = A < S ? A : S }; +}; + +template< typename T > +struct alignment_of +{ + enum { value = alignment_logic< + sizeof( alignment_of_hack ) - sizeof(T), sizeof(T) >::value, }; +}; + +template< typename List, size_t N > +struct type_of_size +{ + typedef typename conditional< + N == sizeof( typename List::head ), + typename List::head, + typename type_of_size::type >::type type; +}; + +template< size_t N > +struct type_of_size< nulltype, N > +{ + typedef optional_CONFIG_ALIGN_AS_FALLBACK type; +}; + +template< typename T> +struct struct_t { T _; }; + +#define optional_ALIGN_TYPE( type ) \ + typelist< type , typelist< struct_t< type > + +struct Unknown; + +typedef + optional_ALIGN_TYPE( char ), + optional_ALIGN_TYPE( short ), + optional_ALIGN_TYPE( int ), + optional_ALIGN_TYPE( long ), + optional_ALIGN_TYPE( float ), + optional_ALIGN_TYPE( double ), + optional_ALIGN_TYPE( long double ), + + optional_ALIGN_TYPE( char *), + optional_ALIGN_TYPE( short * ), + optional_ALIGN_TYPE( int * ), + optional_ALIGN_TYPE( long * ), + optional_ALIGN_TYPE( float * ), + optional_ALIGN_TYPE( double * ), + optional_ALIGN_TYPE( long double * ), + + optional_ALIGN_TYPE( Unknown ( * )( Unknown ) ), + optional_ALIGN_TYPE( Unknown * Unknown::* ), + optional_ALIGN_TYPE( Unknown ( Unknown::* )( Unknown ) ), + + nulltype + > > > > > > > > > > > > > > + > > > > > > > > > > > > > > + > > > > > > + alignment_types; + +#undef optional_ALIGN_TYPE + +#endif // optional_CONFIG_MAX_ALIGN_HACK + +/// C++03 constructed union to hold value. + +template< typename T > +union storage_t +{ +private: + friend class optional; + + typedef T value_type; + + storage_t() {} + + storage_t( value_type const & v ) + { + construct_value( v ); + } + + void construct_value( value_type const & v ) + { + ::new( value_ptr() ) value_type( v ); + } + +#if optional_CPP11_OR_GREATER + + storage_t( value_type && v ) + { + construct_value( std::move( v ) ); + } + + void construct_value( value_type && v ) + { + ::new( value_ptr() ) value_type( std::move( v ) ); + } + +#endif + + void destruct_value() + { + value_ptr()->~T(); + } + + value_type const * value_ptr() const + { + return as(); + } + + value_type * value_ptr() + { + return as(); + } + + value_type const & value() const optional_ref_qual + { + return * value_ptr(); + } + + value_type & value() optional_ref_qual + { + return * value_ptr(); + } + +#if optional_CPP11_OR_GREATER + + value_type const && value() const optional_refref_qual + { + return * value_ptr(); + } + + value_type && value() optional_refref_qual + { + return * value_ptr(); + } + +#endif + +#if optional_CPP11_OR_GREATER + + using aligned_storage_t = typename std::aligned_storage< sizeof(value_type), alignof(value_type) >::type; + aligned_storage_t data; + +#elif optional_CONFIG_MAX_ALIGN_HACK + + typedef struct { unsigned char data[ sizeof(value_type) ]; } aligned_storage_t; + + max_align_t hack; + aligned_storage_t data; + +#else + typedef optional_ALIGN_AS(value_type) align_as_type; + + typedef struct { align_as_type data[ 1 + ( sizeof(value_type) - 1 ) / sizeof(align_as_type) ]; } aligned_storage_t; + aligned_storage_t data; + +# undef optional_ALIGN_AS + +#endif // optional_CONFIG_MAX_ALIGN_HACK + + void * ptr() optional_noexcept + { + return &data; + } + + void const * ptr() const optional_noexcept + { + return &data; + } + + template + U * as() + { + return reinterpret_cast( ptr() ); + } + + template + U const * as() const + { + return reinterpret_cast( ptr() ); + } +}; + +} // namespace detail + +/// disengaged state tag + +struct nullopt_t +{ + struct init{}; + optional_constexpr nullopt_t( init ) {} +}; + +#if optional_HAVE_CONSTEXPR_11 +constexpr nullopt_t nullopt{ nullopt_t::init{} }; +#else +// extra parenthesis to prevent the most vexing parse: +const nullopt_t nullopt(( nullopt_t::init() )); +#endif + +/// optional access error + +class bad_optional_access : public std::logic_error +{ +public: + explicit bad_optional_access() + : logic_error( "bad optional access" ) {} +}; + +/// optional + +template< typename T> +class optional +{ +private: + typedef void (optional::*safe_bool)() const; + +public: + typedef T value_type; + + optional_constexpr optional() optional_noexcept + : has_value_( false ) + , contained() + {} + + optional_constexpr optional( nullopt_t ) optional_noexcept + : has_value_( false ) + , contained() + {} + + optional( optional const & rhs ) + : has_value_( rhs.has_value() ) + { + if ( rhs.has_value() ) + contained.construct_value( rhs.contained.value() ); + } + +#if optional_CPP11_OR_GREATER + optional_constexpr14 optional( optional && rhs ) noexcept( std::is_nothrow_move_constructible::value ) + : has_value_( rhs.has_value() ) + { + if ( rhs.has_value() ) + contained.construct_value( std::move( rhs.contained.value() ) ); + } +#endif + + optional_constexpr optional( value_type const & value ) + : has_value_( true ) + , contained( value ) + {} + +#if optional_CPP11_OR_GREATER + + optional_constexpr optional( value_type && value ) + : has_value_( true ) + , contained( std::move( value ) ) + {} + + template< class... Args > + optional_constexpr explicit optional( nonstd_lite_in_place_type_t(T), Args&&... args ) + : has_value_( true ) + , contained( T( std::forward(args)...) ) + {} + + template< class U, class... Args > + optional_constexpr explicit optional( nonstd_lite_in_place_type_t(T), std::initializer_list il, Args&&... args ) + : has_value_( true ) + , contained( T( il, std::forward(args)...) ) + {} + +#endif // optional_CPP11_OR_GREATER + + ~optional() + { + if ( has_value() ) + contained.destruct_value(); + } + + // assignment + + optional & operator=( nullopt_t ) optional_noexcept + { + reset(); + return *this; + } + + optional & operator=( optional const & rhs ) +#if optional_CPP11_OR_GREATER + noexcept( std::is_nothrow_move_assignable::value && std::is_nothrow_move_constructible::value ) +#endif + { + if ( has_value() == true && rhs.has_value() == false ) reset(); + else if ( has_value() == false && rhs.has_value() == true ) initialize( *rhs ); + else if ( has_value() == true && rhs.has_value() == true ) contained.value() = *rhs; + return *this; + } + +#if optional_CPP11_OR_GREATER + + optional & operator=( optional && rhs ) noexcept + { + if ( has_value() == true && rhs.has_value() == false ) reset(); + else if ( has_value() == false && rhs.has_value() == true ) initialize( std::move( *rhs ) ); + else if ( has_value() == true && rhs.has_value() == true ) contained.value() = std::move( *rhs ); + return *this; + } + + template< class U, + typename = typename std::enable_if< std::is_same< typename std::decay::type, T>::value >::type > + optional & operator=( U && v ) + { + if ( has_value() ) contained.value() = std::forward( v ); + else initialize( T( std::forward( v ) ) ); + return *this; + } + + template< class... Args > + void emplace( Args&&... args ) + { + *this = nullopt; + initialize( T( std::forward(args)...) ); + } + + template< class U, class... Args > + void emplace( std::initializer_list il, Args&&... args ) + { + *this = nullopt; + initialize( T( il, std::forward(args)...) ); + } + +#endif // optional_CPP11_OR_GREATER + + // swap + + void swap( optional & rhs ) +#if optional_CPP11_OR_GREATER + noexcept( std::is_nothrow_move_constructible::value && noexcept( std::swap( std::declval(), std::declval() ) ) ) +#endif + { + using std::swap; + if ( has_value() == true && rhs.has_value() == true ) { swap( **this, *rhs ); } + else if ( has_value() == false && rhs.has_value() == true ) { initialize( *rhs ); rhs.reset(); } + else if ( has_value() == true && rhs.has_value() == false ) { rhs.initialize( **this ); reset(); } + } + + // observers + + optional_constexpr value_type const * operator ->() const + { + return assert( has_value() ), + contained.value_ptr(); + } + + optional_constexpr14 value_type * operator ->() + { + return assert( has_value() ), + contained.value_ptr(); + } + + optional_constexpr value_type const & operator *() const optional_ref_qual + { + return assert( has_value() ), + contained.value(); + } + + optional_constexpr14 value_type & operator *() optional_ref_qual + { + return assert( has_value() ), + contained.value(); + } + +#if optional_CPP11_OR_GREATER + + optional_constexpr value_type const && operator *() const optional_refref_qual + { + assert( has_value() ); + return std::move( contained.value() ); + } + + optional_constexpr14 value_type && operator *() optional_refref_qual + { + assert( has_value() ); + return std::move( contained.value() ); + } + +#endif + +#if optional_CPP11_OR_GREATER + optional_constexpr explicit operator bool() const optional_noexcept + { + return has_value(); + } +#else + optional_constexpr operator safe_bool() const optional_noexcept + { + return has_value() ? &optional::this_type_does_not_support_comparisons : 0; + } +#endif + + optional_constexpr bool has_value() const optional_noexcept + { + return has_value_; + } + + optional_constexpr14 value_type const & value() const optional_ref_qual + { + if ( ! has_value() ) + throw bad_optional_access(); + + return contained.value(); + } + + optional_constexpr14 value_type & value() optional_ref_qual + { + if ( ! has_value() ) + throw bad_optional_access(); + + return contained.value(); + } + +#if optional_HAVE_REF_QUALIFIER + + optional_constexpr14 value_type const && value() const optional_refref_qual + { + if ( ! has_value() ) + throw bad_optional_access(); + + return std::move( contained.value() ); + } + + optional_constexpr14 value_type && value() optional_refref_qual + { + if ( ! has_value() ) + throw bad_optional_access(); + + return std::move( contained.value() ); + } + +#endif + +#if optional_CPP11_OR_GREATER + + template< class U > + optional_constexpr value_type value_or( U && v ) const optional_ref_qual + { + return has_value() ? contained.value() : static_cast(std::forward( v ) ); + } + + template< class U > + optional_constexpr value_type value_or( U && v ) const optional_refref_qual + { + return has_value() ? std::move( contained.value() ) : static_cast(std::forward( v ) ); + } + +#else + + template< class U > + optional_constexpr value_type value_or( U const & v ) const + { + return has_value() ? contained.value() : static_cast( v ); + } + +#endif // optional_CPP11_OR_GREATER + + // modifiers + + void reset() optional_noexcept + { + if ( has_value() ) + contained.destruct_value(); + + has_value_ = false; + } + +private: + void this_type_does_not_support_comparisons() const {} + + template< typename V > + void initialize( V const & value ) + { + assert( ! has_value() ); + contained.construct_value( value ); + has_value_ = true; + } + +#if optional_CPP11_OR_GREATER + template< typename V > + void initialize( V && value ) + { + assert( ! has_value() ); + contained.construct_value( std::move( value ) ); + has_value_ = true; + } +#endif + +private: + bool has_value_; + detail::storage_t< value_type > contained; + +}; + +// Relational operators + +template< typename T > bool operator==( optional const & x, optional const & y ) +{ + return bool(x) != bool(y) ? false : bool(x) == false ? true : *x == *y; +} + +template< typename T > bool operator!=( optional const & x, optional const & y ) +{ + return !(x == y); +} + +template< typename T > bool operator<( optional const & x, optional const & y ) +{ + return (!y) ? false : (!x) ? true : *x < *y; +} + +template< typename T > bool operator>( optional const & x, optional const & y ) +{ + return (y < x); +} + +template< typename T > bool operator<=( optional const & x, optional const & y ) +{ + return !(y < x); +} + +template< typename T > bool operator>=( optional const & x, optional const & y ) +{ + return !(x < y); +} + +// Comparison with nullopt + +template< typename T > bool operator==( optional const & x, nullopt_t ) optional_noexcept +{ + return (!x); +} + +template< typename T > bool operator==( nullopt_t, optional const & x ) optional_noexcept +{ + return (!x); +} + +template< typename T > bool operator!=( optional const & x, nullopt_t ) optional_noexcept +{ + return bool(x); +} + +template< typename T > bool operator!=( nullopt_t, optional const & x ) optional_noexcept +{ + return bool(x); +} + +template< typename T > bool operator<( optional const &, nullopt_t ) optional_noexcept +{ + return false; +} + +template< typename T > bool operator<( nullopt_t, optional const & x ) optional_noexcept +{ + return bool(x); +} + +template< typename T > bool operator<=( optional const & x, nullopt_t ) optional_noexcept +{ + return (!x); +} + +template< typename T > bool operator<=( nullopt_t, optional const & ) optional_noexcept +{ + return true; +} + +template< typename T > bool operator>( optional const & x, nullopt_t ) optional_noexcept +{ + return bool(x); +} + +template< typename T > bool operator>( nullopt_t, optional const & ) optional_noexcept +{ + return false; +} + +template< typename T > bool operator>=( optional const &, nullopt_t ) +{ + return true; +} + +template< typename T > bool operator>=( nullopt_t, optional const & x ) +{ + return (!x); +} + +// Comparison with T + +template< typename T > bool operator==( optional const & x, const T& v ) +{ + return bool(x) ? *x == v : false; +} + +template< typename T > bool operator==( T const & v, optional const & x ) +{ + return bool(x) ? v == *x : false; +} + +template< typename T > bool operator!=( optional const & x, const T& v ) +{ + return bool(x) ? *x != v : true; +} + +template< typename T > bool operator!=( T const & v, optional const & x ) +{ + return bool(x) ? v != *x : true; +} + +template< typename T > bool operator<( optional const & x, const T& v ) +{ + return bool(x) ? *x < v : true; +} + +template< typename T > bool operator<( T const & v, optional const & x ) +{ + return bool(x) ? v < *x : false; +} + +template< typename T > bool operator<=( optional const & x, const T& v ) +{ + return bool(x) ? *x <= v : true; +} + +template< typename T > bool operator<=( T const & v, optional const & x ) +{ + return bool(x) ? v <= *x : false; +} + +template< typename T > bool operator>( optional const & x, const T& v ) +{ + return bool(x) ? *x > v : false; +} + +template< typename T > bool operator>( T const & v, optional const & x ) +{ + return bool(x) ? v > *x : true; +} + +template< typename T > bool operator>=( optional const & x, const T& v ) +{ + return bool(x) ? *x >= v : false; +} + +template< typename T > bool operator>=( T const & v, optional const & x ) +{ + return bool(x) ? v >= *x : true; +} + +// Specialized algorithms + +template< typename T > +void swap( optional & x, optional & y ) +#if optional_CPP11_OR_GREATER + noexcept( noexcept( x.swap(y) ) ) +#endif +{ + x.swap( y ); +} + +#if optional_CPP11_OR_GREATER + +template< class T > +optional_constexpr optional< typename std::decay::type > make_optional( T && v ) +{ + return optional< typename std::decay::type >( std::forward( v ) ); +} + +template< class T, class...Args > +optional_constexpr optional make_optional( Args&&... args ) +{ + return optional( in_place, std::forward(args)...); +} + +template< class T, class U, class... Args > +optional_constexpr optional make_optional( std::initializer_list il, Args&&... args ) +{ + return optional( in_place, il, std::forward(args)...); +} + +#else + +template< typename T > +optional make_optional( T const & v ) +{ + return optional( v ); +} + +#endif // optional_CPP11_OR_GREATER + +} // namespace optional + +using namespace optional_lite; + +} // namespace nonstd + +#if optional_CPP11_OR_GREATER + +// specialize the std::hash algorithm: + +namespace std { + +template< class T > +class hash< nonstd::optional > +{ +public: + std::size_t operator()( nonstd::optional const & v ) const optional_noexcept + { + return bool( v ) ? hash()( *v ) : 0; + } +}; + +} //namespace std + +#endif // optional_CPP11_OR_GREATER + +#endif // NONSTD_OPTIONAL_LITE_HPP diff --git a/src/util/optional.h b/src/util/optional.h new file mode 100644 index 00000000000..1a5f554bca3 --- /dev/null +++ b/src/util/optional.h @@ -0,0 +1,51 @@ +/*******************************************************************\ + + Module: typedef for optional class template. To be replaced with + std::optional once C++17 support is enabled + + Author: Diffblue Limited. All rights reserved. + +\*******************************************************************/ + +#ifndef CPROVER_UTIL_OPTIONAL_H +#define CPROVER_UTIL_OPTIONAL_H + +#if defined __clang__ + #pragma clang diagnostic push ignore "-Wall" + #pragma clang diagnostic push ignore "-Wpedantic" + #pragma clang diagnostic push ignore "-Wunknown-pragmas" + #pragma clang diagnostic push ignore "-Wc++1y-extensions" + #pragma clang diagnostic push ignore "-Wc++14-extensions" +#elif defined __GNUC__ + #pragma GCC diagnostic push ignore "-Wall" + #pragma GCC diagnostic push ignore "-Wpedantic" + #pragma GCC diagnostic push ignore "-Wunknown-pragmas" + #pragma GCC diagnostic push ignore "-Wc++1y-extensions" + #pragma GCC diagnostic push ignore "-Wc++14-extensions" +#elif defined _MSC_VER + #pragma warning(push) +#endif +#include +#if defined __clang__ + #pragma clang diagnostic pop + #pragma clang diagnostic pop + #pragma clang diagnostic pop + #pragma clang diagnostic pop + #pragma clang diagnostic pop +#elif defined __GNUC__ + #pragma GCC diagnostic pop + #pragma GCC diagnostic pop + #pragma GCC diagnostic pop + #pragma GCC diagnostic pop + #pragma GCC diagnostic pop +#elif defined _MSC_VER + #pragma warning(pop) +#endif + +// Swap for std::optional when switching to C++17 +template +using optionalt=nonstd::optional; // NOLINT template typedef + +typedef nonstd::bad_optional_access bad_optional_accesst; + +#endif // CPROVER_UTIL_OPTIONAL_H From 43d0602b250376ea1bb8ad9bb91987ebc49dad4e Mon Sep 17 00:00:00 2001 From: "Lukasz A.J. Wrona" Date: Fri, 25 Aug 2017 11:16:57 +0100 Subject: [PATCH 02/80] Add unit tests for nonstd::optional --- unit/Makefile | 4 ++++ unit/optional.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 unit/optional.cpp diff --git a/unit/Makefile b/unit/Makefile index a47b3d6ec62..ea99fdfada7 100644 --- a/unit/Makefile +++ b/unit/Makefile @@ -5,6 +5,10 @@ SRC = src/expr/require_expr.cpp \ src/ansi-c/c_to_expr.cpp \ unit_tests.cpp \ catch_example.cpp \ + util/expr_iterator.cpp \ + optional.cpp \ + analyses/call_graph.cpp \ + java_bytecode/java_bytecode_convert_class/convert_abstract_class.cpp \ # Empty last line # Test source files diff --git a/unit/optional.cpp b/unit/optional.cpp new file mode 100644 index 00000000000..9c22596bd3d --- /dev/null +++ b/unit/optional.cpp @@ -0,0 +1,32 @@ +/*******************************************************************\ + + Module: nonstd::optional unit tests + + Author: Diffblue Limited. All rights reserved. + +\*******************************************************************/ + +#include "catch.hpp" +#include + +TEST_CASE("Optional without a value", "[core][util][optional]") +{ + optionalt maybe_value; + REQUIRE(maybe_value.has_value()==false); + REQUIRE_THROWS_AS(maybe_value.value(), bad_optional_accesst); +} + +TEST_CASE("Optional with a value", "[core][util][optional]") +{ + optionalt maybe_value=false; + REQUIRE(maybe_value.has_value()); + REQUIRE(maybe_value.value()==false); +} + + +TEST_CASE("Optional with a value (operator access)", "[core][util][optional]") +{ + optionalt maybe_value=true; + REQUIRE(maybe_value.has_value()); + REQUIRE(*maybe_value==true); +} From 4dbf939b2641f5a6336ba3a2f48fe084bf352b7c Mon Sep 17 00:00:00 2001 From: "Lukasz A.J. Wrona" Date: Wed, 30 Aug 2017 23:36:51 +0100 Subject: [PATCH 03/80] Manually fix optional --- src/nonstd/optional.hpp | 7 +++---- src/util/optional.h | 12 ------------ 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/nonstd/optional.hpp b/src/nonstd/optional.hpp index 7b70afa1f90..2634200523b 100644 --- a/src/nonstd/optional.hpp +++ b/src/nonstd/optional.hpp @@ -516,7 +516,7 @@ union storage_t typedef struct { align_as_type data[ 1 + ( sizeof(value_type) - 1 ) / sizeof(align_as_type) ]; } aligned_storage_t; aligned_storage_t data; -# undef optional_ALIGN_AS +#undef optional_ALIGN_AS #endif // optional_CONFIG_MAX_ALIGN_HACK @@ -735,8 +735,7 @@ class optional optional_constexpr value_type const && operator *() const optional_refref_qual { - assert( has_value() ); - return std::move( contained.value() ); + return assert( has_value() ), std::move( contained.value() ); } optional_constexpr14 value_type && operator *() optional_refref_qual @@ -1071,7 +1070,7 @@ using namespace optional_lite; namespace std { template< class T > -class hash< nonstd::optional > +struct hash< nonstd::optional > { public: std::size_t operator()( nonstd::optional const & v ) const optional_noexcept diff --git a/src/util/optional.h b/src/util/optional.h index 1a5f554bca3..a649d8e5ce4 100644 --- a/src/util/optional.h +++ b/src/util/optional.h @@ -13,15 +13,9 @@ #if defined __clang__ #pragma clang diagnostic push ignore "-Wall" #pragma clang diagnostic push ignore "-Wpedantic" - #pragma clang diagnostic push ignore "-Wunknown-pragmas" - #pragma clang diagnostic push ignore "-Wc++1y-extensions" - #pragma clang diagnostic push ignore "-Wc++14-extensions" #elif defined __GNUC__ #pragma GCC diagnostic push ignore "-Wall" #pragma GCC diagnostic push ignore "-Wpedantic" - #pragma GCC diagnostic push ignore "-Wunknown-pragmas" - #pragma GCC diagnostic push ignore "-Wc++1y-extensions" - #pragma GCC diagnostic push ignore "-Wc++14-extensions" #elif defined _MSC_VER #pragma warning(push) #endif @@ -29,15 +23,9 @@ #if defined __clang__ #pragma clang diagnostic pop #pragma clang diagnostic pop - #pragma clang diagnostic pop - #pragma clang diagnostic pop - #pragma clang diagnostic pop #elif defined __GNUC__ #pragma GCC diagnostic pop #pragma GCC diagnostic pop - #pragma GCC diagnostic pop - #pragma GCC diagnostic pop - #pragma GCC diagnostic pop #elif defined _MSC_VER #pragma warning(pop) #endif From ae584df67c9372427d1a91a0872eed2ae991a608 Mon Sep 17 00:00:00 2001 From: "Lukasz A.J. Wrona" Date: Fri, 1 Sep 2017 12:51:50 +0100 Subject: [PATCH 04/80] Move optional unit tests into util directory --- unit/Makefile | 2 +- unit/{ => util}/optional.cpp | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename unit/{ => util}/optional.cpp (100%) diff --git a/unit/Makefile b/unit/Makefile index ea99fdfada7..52c60febfda 100644 --- a/unit/Makefile +++ b/unit/Makefile @@ -6,7 +6,7 @@ SRC = src/expr/require_expr.cpp \ unit_tests.cpp \ catch_example.cpp \ util/expr_iterator.cpp \ - optional.cpp \ + util/optional.cpp \ analyses/call_graph.cpp \ java_bytecode/java_bytecode_convert_class/convert_abstract_class.cpp \ # Empty last line diff --git a/unit/optional.cpp b/unit/util/optional.cpp similarity index 100% rename from unit/optional.cpp rename to unit/util/optional.cpp From ebbbf5f58bf6e70dd3a5c9e1aa3d0b2aa7eeee05 Mon Sep 17 00:00:00 2001 From: janmroczkowski Date: Fri, 1 Sep 2017 17:01:50 +0100 Subject: [PATCH 05/80] Make goto_modelt.output const --- src/goto-programs/goto_model.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/goto-programs/goto_model.h b/src/goto-programs/goto_model.h index 6e9ebbc6f37..2f9c5939bc2 100644 --- a/src/goto-programs/goto_model.h +++ b/src/goto-programs/goto_model.h @@ -31,7 +31,7 @@ class goto_modelt goto_functions.clear(); } - void output(std::ostream &out) + void output(std::ostream &out) const { namespacet ns(symbol_table); goto_functions.output(ns, out); From 567eaa7cfffb4356dd9180daead5222efaf96702 Mon Sep 17 00:00:00 2001 From: janmroczkowski Date: Tue, 5 Sep 2017 17:19:03 +0100 Subject: [PATCH 06/80] Make basic_blockst.output const --- src/goto-instrument/cover.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/goto-instrument/cover.cpp b/src/goto-instrument/cover.cpp index 258b790a887..d76afe03b71 100644 --- a/src/goto-instrument/cover.cpp +++ b/src/goto-instrument/cover.cpp @@ -28,6 +28,8 @@ Date: May 2016 #include #include +namespace +{ class basic_blockst { public: @@ -237,7 +239,7 @@ class basic_blockst } } - void output(std::ostream &out) + void output(std::ostream &out) const { for(block_mapt::const_iterator b_it=block_map.begin(); @@ -289,6 +291,7 @@ class basic_blockst block_info.source_location.set_basic_block_covered_lines(covered_lines); } }; +} bool coverage_goalst::get_coverage_goals( const std::string &coverage_file, From 9be84eae757fb4be3d4b9b0db5a972599fd181e4 Mon Sep 17 00:00:00 2001 From: janmroczkowski Date: Tue, 5 Sep 2017 17:39:11 +0100 Subject: [PATCH 07/80] Make automatont.output const --- src/goto-instrument/accelerate/trace_automaton.cpp | 2 +- src/goto-instrument/accelerate/trace_automaton.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/goto-instrument/accelerate/trace_automaton.cpp b/src/goto-instrument/accelerate/trace_automaton.cpp index 551d0c7b6d8..6a070807553 100644 --- a/src/goto-instrument/accelerate/trace_automaton.cpp +++ b/src/goto-instrument/accelerate/trace_automaton.cpp @@ -473,7 +473,7 @@ void trace_automatont::minimise() determinise(); } -void automatont::output(std::ostream &str) +void automatont::output(std::ostream &str) const { str << "Init: " << init_state << '\n'; diff --git a/src/goto-instrument/accelerate/trace_automaton.h b/src/goto-instrument/accelerate/trace_automaton.h index cb113ef1076..b4d31159175 100644 --- a/src/goto-instrument/accelerate/trace_automaton.h +++ b/src/goto-instrument/accelerate/trace_automaton.h @@ -54,7 +54,7 @@ class automatont std::size_t count_transitions(); - void output(std::ostream &str); + void output(std::ostream &str) const; void clear() { From 211fcc225eb8519d48c7efb181a125f4729fa120 Mon Sep 17 00:00:00 2001 From: janmroczkowski Date: Tue, 5 Sep 2017 17:53:29 +0100 Subject: [PATCH 08/80] Make path_nodet.output const --- src/goto-instrument/accelerate/path.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/goto-instrument/accelerate/path.h b/src/goto-instrument/accelerate/path.h index 7dae7fcf989..9044e0e3f72 100644 --- a/src/goto-instrument/accelerate/path.h +++ b/src/goto-instrument/accelerate/path.h @@ -36,7 +36,7 @@ class path_nodet { } - void output(const goto_programt &program, std::ostream &str); + void output(const goto_programt &program, std::ostream &str) const; goto_programt::targett loc; const exprt guard; From 388a25e449ce73606ac763f5fc57e5abe4b7aed7 Mon Sep 17 00:00:00 2001 From: janmroczkowski Date: Tue, 5 Sep 2017 17:58:09 +0100 Subject: [PATCH 09/80] Make uncaught_exceptions_analysis.output const --- src/analyses/uncaught_exceptions_analysis.cpp | 17 ++++++++++------- src/analyses/uncaught_exceptions_analysis.h | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/analyses/uncaught_exceptions_analysis.cpp b/src/analyses/uncaught_exceptions_analysis.cpp index 65baa49e082..4b0674c375d 100644 --- a/src/analyses/uncaught_exceptions_analysis.cpp +++ b/src/analyses/uncaught_exceptions_analysis.cpp @@ -186,19 +186,22 @@ void uncaught_exceptions_analysist::collect_uncaught_exceptions( /// Prints the exceptions map that maps each method to the set of exceptions /// that may escape it void uncaught_exceptions_analysist::output( - const goto_functionst &goto_functions) + const goto_functionst &goto_functions) const { #ifdef DEBUG forall_goto_functions(it, goto_functions) { - if(exceptions_map[it->first].size()>0) + const auto fn=it->first; + const exceptions_mapt::const_iterator found=exceptions_map.find(fn); + INVARIANT( + found!=exceptions_map.end(), + "each function expected to be recorded in `exceptions_map`"); + const auto &fs=found->second; + if(!fs.empty()) { std::cout << "Uncaught exceptions in function " << - it->first << ": " << std::endl; - INVARIANT( - exceptions_map.find(it->first)!=exceptions_map.end(), - "each function expected to be recorded in `exceptions_map`"); - for(auto exc_id : exceptions_map[it->first]) + fn << ": " << std::endl; + for(const auto exc_id : fs) std::cout << id2string(exc_id) << " "; std::cout << std::endl; } diff --git a/src/analyses/uncaught_exceptions_analysis.h b/src/analyses/uncaught_exceptions_analysis.h index a53998b4bd2..aef256afba0 100644 --- a/src/analyses/uncaught_exceptions_analysis.h +++ b/src/analyses/uncaught_exceptions_analysis.h @@ -64,7 +64,7 @@ class uncaught_exceptions_analysist const goto_functionst &, const namespacet &); - void output(const goto_functionst &); + void output(const goto_functionst &) const; void operator()( const goto_functionst &, From d79067e568859789f9f31425cfcaa62167e27ecb Mon Sep 17 00:00:00 2001 From: Michael Tautschnig Date: Fri, 7 Apr 2017 13:33:15 +0100 Subject: [PATCH 10/80] Remove long-deprecated c_sizeof in favour of size_of_expr et al. --- src/ansi-c/Makefile | 1 - src/ansi-c/c_sizeof.cpp | 320 -------------------------- src/ansi-c/c_sizeof.h | 51 ---- src/ansi-c/c_typecheck_expr.cpp | 12 +- src/ansi-c/c_typecheck_type.cpp | 3 +- src/cpp/cpp_typecheck_expr.cpp | 6 +- src/cpp/cpp_typecheck_initializer.cpp | 8 +- src/goto-instrument/stack_depth.cpp | 1 + src/util/pointer_offset_size.cpp | 67 ++++-- 9 files changed, 60 insertions(+), 409 deletions(-) delete mode 100644 src/ansi-c/c_sizeof.cpp delete mode 100644 src/ansi-c/c_sizeof.h diff --git a/src/ansi-c/Makefile b/src/ansi-c/Makefile index f251dc3910c..58dd5b46025 100644 --- a/src/ansi-c/Makefile +++ b/src/ansi-c/Makefile @@ -14,7 +14,6 @@ SRC = anonymous_member.cpp \ c_nondet_symbol_factory.cpp \ c_preprocess.cpp \ c_qualifiers.cpp \ - c_sizeof.cpp \ c_storage_spec.cpp \ c_typecast.cpp \ c_typecheck_argc_argv.cpp \ diff --git a/src/ansi-c/c_sizeof.cpp b/src/ansi-c/c_sizeof.cpp deleted file mode 100644 index fad6d00ce9f..00000000000 --- a/src/ansi-c/c_sizeof.cpp +++ /dev/null @@ -1,320 +0,0 @@ -/*******************************************************************\ - -Module: Conversion of sizeof Expressions - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -/// \file -/// Conversion of sizeof Expressions - -#include "c_sizeof.h" - -#include -#include -#include -#include -#include - -#include "c_typecast.h" - -exprt c_sizeoft::sizeof_rec(const typet &type) -{ - // this implementation will eventually be replaced - // by size_of_expr in util/pointer_offset_size.h - exprt dest; - - if(type.id()==ID_signedbv || - type.id()==ID_unsignedbv || - type.id()==ID_floatbv || - type.id()==ID_fixedbv || - type.id()==ID_c_bool) - { - // We round up to bytes. - // See special treatment for bit-fields below. - std::size_t bits=to_bitvector_type(type).get_width(); - std::size_t bytes=bits/8; - if((bits%8)!=0) - bytes++; - dest=from_integer(bytes, size_type()); - } - else if(type.id()==ID_incomplete_c_enum) - { - // refuse to give a size - return nil_exprt(); - } - else if(type.id()==ID_c_enum) - { - // check the subtype - dest=sizeof_rec(type.subtype()); - } - else if(type.id()==ID_c_enum_tag) - { - // follow the tag - dest=sizeof_rec(ns.follow_tag(to_c_enum_tag_type(type))); - } - else if(type.id()==ID_pointer) - { - // the following is an MS extension - if(type.get_bool(ID_C_ptr32)) - return from_integer(4, size_type()); - - std::size_t bits=config.ansi_c.pointer_width; - std::size_t bytes=bits/8; - if((bits%8)!=0) - bytes++; - dest=from_integer(bytes, size_type()); - } - else if(type.id()==ID_bool) - { - // We fit booleans into a byte. - // Don't confuse with c_bool, which is a bit-vector type. - dest=from_integer(1, size_type()); - } - else if(type.id()==ID_array) - { - const exprt &size_expr= - to_array_type(type).size(); - - if(size_expr.is_nil()) - { - // treated like an empty array - dest=from_integer(0, size_type()); - } - else - { - exprt tmp_dest=sizeof_rec(type.subtype()); - - if(tmp_dest.is_nil()) - return tmp_dest; - - mp_integer a, b; - - if(!to_integer(tmp_dest, a) && - !to_integer(size_expr, b)) - { - dest=from_integer(a*b, size_type()); - } - else - { - dest.id(ID_mult); - dest.type()=size_type(); - dest.copy_to_operands(size_expr); - dest.move_to_operands(tmp_dest); - c_implicit_typecast(dest.op0(), dest.type(), ns); - c_implicit_typecast(dest.op1(), dest.type(), ns); - } - } - } - else if(type.id()==ID_struct) - { - const struct_typet::componentst &components= - to_struct_type(type).components(); - - dest=from_integer(0, size_type()); - - mp_integer bit_field_width=0; - - for(const auto &comp : components) - { - const typet &sub_type=ns.follow(comp.type()); - - if(comp.get_bool(ID_is_type)) - { - } - else if(sub_type.id()==ID_code) - { - } - else if(sub_type.id()==ID_c_bit_field) - { - // We just sum them up. - // This assumes they are properly padded. - bit_field_width+=to_c_bit_field_type(sub_type).get_width(); - } - else - { - exprt tmp=sizeof_rec(sub_type); - - if(tmp.is_nil()) - return tmp; - - dest=plus_exprt(dest, tmp); - } - } - - if(bit_field_width!=0) - dest=plus_exprt(dest, from_integer(bit_field_width/8, size_type())); - } - else if(type.id()==ID_union) - { - // the empty union will have size 0 - exprt max_size=from_integer(0, size_type()); - - const union_typet::componentst &components= - to_union_type(type).components(); - - for(const auto &comp : components) - { - if(comp.get_bool(ID_is_type) || comp.type().id()==ID_code) - continue; - - const typet &sub_type=comp.type(); - - exprt tmp; - - if(sub_type.id()==ID_c_bit_field) - { - std::size_t width=to_c_bit_field_type(sub_type).get_width(); - tmp= - from_integer(width/8, size_type()); - } - else - { - tmp=sizeof_rec(sub_type); - - if(tmp.is_nil()) - return nil_exprt(); - } - - max_size=if_exprt( - binary_relation_exprt(max_size, ID_lt, tmp), - tmp, max_size); - - simplify(max_size, ns); - } - - dest=max_size; - } - else if(type.id()==ID_symbol) - { - return sizeof_rec(ns.follow(type)); - } - else if(type.id()==ID_empty) - { - // gcc says that sizeof(void)==1, ISO C doesn't - dest=from_integer(1, size_type()); - } - else if(type.id()==ID_vector) - { - // simply multiply - const exprt &size_expr= - to_vector_type(type).size(); - - exprt tmp_dest=sizeof_rec(type.subtype()); - - if(tmp_dest.is_nil()) - return tmp_dest; - - mp_integer a, b; - - if(!to_integer(tmp_dest, a) && - !to_integer(size_expr, b)) - { - dest=from_integer(a*b, size_type()); - } - else - { - dest.id(ID_mult); - dest.type()=size_type(); - dest.copy_to_operands(size_expr); - dest.move_to_operands(tmp_dest); - c_implicit_typecast(dest.op0(), dest.type(), ns); - c_implicit_typecast(dest.op1(), dest.type(), ns); - } - } - else if(type.id()==ID_complex) - { - // this is a pair - - exprt tmp_dest=sizeof_rec(type.subtype()); - - if(tmp_dest.is_nil()) - return tmp_dest; - - mp_integer a; - - if(!to_integer(tmp_dest, a)) - dest=from_integer(a*2, size_type()); - else - return nil_exprt(); - } - else - { - // We give up; this shouldn't really happen on 'proper' C types, - // but we do have some artificial ones that simply have no - // meaningful size. - dest.make_nil(); - } - - return dest; -} - -exprt c_sizeoft::c_offsetof( - const struct_typet &type, - const irep_idt &component_name) -{ - const struct_typet::componentst &components= - type.components(); - - exprt dest=from_integer(0, size_type()); - - mp_integer bit_field_width=0; - - for(const auto &comp : components) - { - if(comp.get_name()==component_name) - { - // done - if(bit_field_width!=0) - dest=plus_exprt(dest, from_integer(bit_field_width/8, size_type())); - return dest; - } - - if(comp.get_bool(ID_is_type)) - continue; - - const typet &sub_type=ns.follow(comp.type()); - - if(sub_type.id()==ID_code) - { - } - else if(sub_type.id()==ID_c_bit_field) - { - // We just sum them up. - // This assumes they are properly padded. - bit_field_width+=to_c_bit_field_type(sub_type).get_width(); - } - else - { - exprt tmp=sizeof_rec(sub_type); - - if(tmp.is_nil()) - return tmp; - - exprt sum=plus_exprt(dest, tmp); - dest=sum; - } - } - - return nil_exprt(); -} - -exprt c_sizeof(const typet &src, const namespacet &ns) -{ - c_sizeoft c_sizeof_inst(ns); - exprt tmp=c_sizeof_inst(src); - simplify(tmp, ns); - return tmp; -} - -exprt c_offsetof( - const struct_typet &src, - const irep_idt &component_name, - const namespacet &ns) -{ - c_sizeoft c_sizeof_inst(ns); - exprt tmp=c_sizeof_inst.c_offsetof(src, component_name); - simplify(tmp, ns); - return tmp; -} diff --git a/src/ansi-c/c_sizeof.h b/src/ansi-c/c_sizeof.h deleted file mode 100644 index de5421c0510..00000000000 --- a/src/ansi-c/c_sizeof.h +++ /dev/null @@ -1,51 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - - -#ifndef CPROVER_ANSI_C_C_SIZEOF_H -#define CPROVER_ANSI_C_C_SIZEOF_H - -#include -#include - -class c_sizeoft -{ -public: - explicit c_sizeoft(const namespacet &_ns):ns(_ns) - { - } - - virtual ~c_sizeoft() - { - } - - exprt operator()(const typet &type) - { - return sizeof_rec(type); - } - - exprt c_offsetof( - const struct_typet &type, - const irep_idt &component_name); - -protected: - const namespacet &ns; - - virtual exprt sizeof_rec(const typet &type); -}; - -exprt c_sizeof( - const typet &src, - const namespacet &ns); - -exprt c_offsetof( - const struct_typet &src, - const irep_idt &component_name, - const namespacet &ns); - -#endif // CPROVER_ANSI_C_C_SIZEOF_H diff --git a/src/ansi-c/c_typecheck_expr.cpp b/src/ansi-c/c_typecheck_expr.cpp index 54eab363d7b..746e03be6d3 100644 --- a/src/ansi-c/c_typecheck_expr.cpp +++ b/src/ansi-c/c_typecheck_expr.cpp @@ -26,7 +26,6 @@ Author: Daniel Kroening, kroening@kroening.com #include #include "c_typecast.h" -#include "c_sizeof.h" #include "c_qualifiers.h" #include "string_constant.h" #include "anonymous_member.h" @@ -556,7 +555,9 @@ void c_typecheck_baset::typecheck_expr_builtin_offsetof(exprt &expr) if(type.id()==ID_struct) { - exprt o=c_offsetof(to_struct_type(type), component_name, *this); + exprt o= + member_offset_expr( + to_struct_type(type), component_name, *this); if(o.is_nil()) { @@ -597,7 +598,8 @@ void c_typecheck_baset::typecheck_expr_builtin_offsetof(exprt &expr) if(type.id()==ID_struct) { exprt o= - c_offsetof(to_struct_type(type), c_it->get_name(), *this); + member_offset_expr( + to_struct_type(type), c_it->get_name(), *this); if(o.is_nil()) { @@ -649,7 +651,7 @@ void c_typecheck_baset::typecheck_expr_builtin_offsetof(exprt &expr) // still need to typecheck index typecheck_expr(index); - exprt sub_size=c_sizeof(type.subtype(), *this); + exprt sub_size=size_of_expr(type.subtype(), *this); if(index.type()!=size_type()) index.make_typecast(size_type()); result=plus_exprt(result, mult_exprt(sub_size, index)); @@ -946,7 +948,7 @@ void c_typecheck_baset::typecheck_expr_sizeof(exprt &expr) throw 0; } - exprt new_expr=c_sizeof(type, *this); + exprt new_expr=size_of_expr(type, *this); if(new_expr.is_nil()) { diff --git a/src/ansi-c/c_typecheck_type.cpp b/src/ansi-c/c_typecheck_type.cpp index 1a3998de19d..1a6bf27adad 100644 --- a/src/ansi-c/c_typecheck_type.cpp +++ b/src/ansi-c/c_typecheck_type.cpp @@ -21,7 +21,6 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include "c_sizeof.h" #include "c_qualifiers.h" #include "ansi_c_declaration.h" #include "padding.h" @@ -661,7 +660,7 @@ void c_typecheck_baset::typecheck_vector_type(vector_typet &type) } // the subtype must have constant size - exprt size_expr=c_sizeof(type.subtype(), *this); + exprt size_expr=size_of_expr(type.subtype(), *this); simplify(size_expr, *this); diff --git a/src/cpp/cpp_typecheck_expr.cpp b/src/cpp/cpp_typecheck_expr.cpp index cac26bd5dc3..dec8510eb7b 100644 --- a/src/cpp/cpp_typecheck_expr.cpp +++ b/src/cpp/cpp_typecheck_expr.cpp @@ -13,6 +13,7 @@ Author: Daniel Kroening, kroening@cs.cmu.edu #include +#include #include #include #include @@ -22,7 +23,6 @@ Author: Daniel Kroening, kroening@cs.cmu.edu #include #include -#include #include @@ -856,8 +856,8 @@ void cpp_typecheckt::typecheck_expr_new(exprt &expr) // runtime library exprt &sizeof_expr=static_cast(expr.add(ID_sizeof)); - sizeof_expr=c_sizeof(expr.type().subtype(), *this); - sizeof_expr.add("#c_sizeof_type")=expr.type().subtype(); + sizeof_expr=size_of_expr(expr.type().subtype(), *this); + sizeof_expr.add(ID_C_c_sizeof_type)=expr.type().subtype(); } static exprt collect_comma_expression(const exprt &src) diff --git a/src/cpp/cpp_typecheck_initializer.cpp b/src/cpp/cpp_typecheck_initializer.cpp index 7795b71e4c0..013f861886d 100644 --- a/src/cpp/cpp_typecheck_initializer.cpp +++ b/src/cpp/cpp_typecheck_initializer.cpp @@ -12,11 +12,11 @@ Author: Daniel Kroening, kroening@cs.cmu.edu #include "cpp_typecheck.h" #include +#include +#include #include #include -#include -#include #include "cpp_util.h" @@ -228,8 +228,6 @@ void cpp_typecheckt::zero_initializer( } else if(final_type.id()==ID_union) { - c_sizeoft c_sizeof(*this); - // Select the largest component for zero-initialization mp_integer max_comp_size=0; @@ -244,7 +242,7 @@ void cpp_typecheckt::zero_initializer( if(component.type().id()==ID_code) continue; - exprt component_size=c_sizeof(component.type()); + exprt component_size=size_of_expr(component.type(), *this); mp_integer size_int; if(!to_integer(component_size, size_int)) diff --git a/src/goto-instrument/stack_depth.cpp b/src/goto-instrument/stack_depth.cpp index 2897a4e6697..df319f3deb5 100644 --- a/src/goto-instrument/stack_depth.cpp +++ b/src/goto-instrument/stack_depth.cpp @@ -13,6 +13,7 @@ Date: November 2011 #include "stack_depth.h" +#include #include #include #include diff --git a/src/util/pointer_offset_size.cpp b/src/util/pointer_offset_size.cpp index 798266792eb..e5e3dea6796 100644 --- a/src/util/pointer_offset_size.cpp +++ b/src/util/pointer_offset_size.cpp @@ -211,14 +211,11 @@ mp_integer pointer_offset_bits( type.id()==ID_fixedbv || type.id()==ID_floatbv || type.id()==ID_bv || - type.id()==ID_c_bool) + type.id()==ID_c_bool || + type.id()==ID_c_bit_field) { return to_bitvector_type(type).get_width(); } - else if(type.id()==ID_c_bit_field) - { - return to_c_bit_field_type(type).get_width(); - } else if(type.id()==ID_c_enum) { return to_bitvector_type(type.subtype()).get_width(); @@ -233,6 +230,10 @@ mp_integer pointer_offset_bits( } else if(type.id()==ID_pointer) { + // the following is an MS extension + if(type.get_bool(ID_C_ptr32)) + return 32; + return config.ansi_c.pointer_width; } else if(type.id()==ID_symbol) @@ -248,7 +249,7 @@ mp_integer pointer_offset_bits( return 32; } else - return mp_integer(-1); + return -1; } exprt member_offset_expr( @@ -408,7 +409,8 @@ exprt size_of_expr( const union_typet::componentst &components= union_type.components(); - mp_integer result=0; + mp_integer max_bytes=0; + exprt result=from_integer(0, size_type()); // compute max @@ -418,35 +420,52 @@ exprt size_of_expr( it++) { const typet &subtype=it->type(); - mp_integer sub_size; + exprt sub_size; - if(subtype.id()==ID_c_bit_field) + mp_integer sub_bits=pointer_offset_bits(subtype, ns); + + if(sub_bits==-1) { - std::size_t bits=to_c_bit_field_type(subtype).get_width(); - sub_size=bits/8; - if((bits%8)!=0) - ++sub_size; + max_bytes=-1; + + sub_size=size_of_expr(subtype, ns); + if(sub_size.is_nil()) + return nil_exprt(); } else - sub_size=pointer_offset_size(subtype, ns); - - if(sub_size==-1) { - result=-1; - break; + mp_integer sub_bytes=(sub_bits+7)/8; + + if(max_bytes>=0) + { + if(max_bytesresult) - result=sub_size; + + result=if_exprt( + binary_relation_exprt(result, ID_lt, sub_size), + sub_size, result); + + simplify(result, ns); } - return from_integer(result, size_type()); + return result; } else if(type.id()==ID_signedbv || type.id()==ID_unsignedbv || type.id()==ID_fixedbv || type.id()==ID_floatbv || type.id()==ID_bv || - type.id()==ID_c_bool) + type.id()==ID_c_bool || + type.id()==ID_c_bit_field) { std::size_t width=to_bitvector_type(type).get_width(); std::size_t bytes=width/8; @@ -472,6 +491,10 @@ exprt size_of_expr( } else if(type.id()==ID_pointer) { + // the following is an MS extension + if(type.get_bool(ID_C_ptr32)) + return from_integer(4, size_type()); + std::size_t width=config.ansi_c.pointer_width; std::size_t bytes=width/8; if(bytes*8!=width) From 1fa569fd17ca8b7512d830211ebf985dc7861336 Mon Sep 17 00:00:00 2001 From: Michael Tautschnig Date: Mon, 7 Aug 2017 14:38:57 +0000 Subject: [PATCH 11/80] sizeof(*(void*)) is sizeof(char) --- regression/ansi-c/sizeof5/main.c | 15 +++++++++++++++ regression/ansi-c/sizeof5/test.desc | 8 ++++++++ src/ansi-c/c_typecheck_expr.cpp | 6 ++++++ 3 files changed, 29 insertions(+) create mode 100644 regression/ansi-c/sizeof5/main.c create mode 100644 regression/ansi-c/sizeof5/test.desc diff --git a/regression/ansi-c/sizeof5/main.c b/regression/ansi-c/sizeof5/main.c new file mode 100644 index 00000000000..7149902ced6 --- /dev/null +++ b/regression/ansi-c/sizeof5/main.c @@ -0,0 +1,15 @@ +#define STATIC_ASSERT(condition) \ + int some_array##__LINE__[(condition) ? 1 : -1]; + +struct S +{ + int x; +}; + +int main() +{ + struct S s; + __typeof__(*((void *)&s.x)) *_s=&s.x; + STATIC_ASSERT(sizeof(*_s)==1); + return 0; +} diff --git a/regression/ansi-c/sizeof5/test.desc b/regression/ansi-c/sizeof5/test.desc new file mode 100644 index 00000000000..466da18b2b5 --- /dev/null +++ b/regression/ansi-c/sizeof5/test.desc @@ -0,0 +1,8 @@ +CORE +main.c + +^EXIT=0$ +^SIGNAL=0$ +-- +^warning: ignoring +^CONVERSION ERROR$ diff --git a/src/ansi-c/c_typecheck_expr.cpp b/src/ansi-c/c_typecheck_expr.cpp index 746e03be6d3..b28156b52a5 100644 --- a/src/ansi-c/c_typecheck_expr.cpp +++ b/src/ansi-c/c_typecheck_expr.cpp @@ -948,6 +948,12 @@ void c_typecheck_baset::typecheck_expr_sizeof(exprt &expr) throw 0; } + if(type.id()==ID_empty && + expr.operands().size()==1 && + expr.op0().id()==ID_dereference && + expr.op0().op0().type()==pointer_type(void_type())) + type=char_type(); + exprt new_expr=size_of_expr(type, *this); if(new_expr.is_nil()) From 3273bf5b97660d7c0a87120f938762f04caa3465 Mon Sep 17 00:00:00 2001 From: Michael Tautschnig Date: Fri, 18 Aug 2017 16:27:24 +0000 Subject: [PATCH 12/80] Fix type casts from initializer lists to arrays of unspecified size --- regression/ansi-c/Initializer_cast2/main.c | 6 ++++++ regression/ansi-c/Initializer_cast2/test.desc | 7 +++++++ src/ansi-c/c_typecheck_expr.cpp | 9 ++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 regression/ansi-c/Initializer_cast2/main.c create mode 100644 regression/ansi-c/Initializer_cast2/test.desc diff --git a/regression/ansi-c/Initializer_cast2/main.c b/regression/ansi-c/Initializer_cast2/main.c new file mode 100644 index 00000000000..710bbdc0683 --- /dev/null +++ b/regression/ansi-c/Initializer_cast2/main.c @@ -0,0 +1,6 @@ +int main() +{ + int A[(sizeof((int[]){1, 2, 3})==3*sizeof(int))?1:-1]; + + return 0; +} diff --git a/regression/ansi-c/Initializer_cast2/test.desc b/regression/ansi-c/Initializer_cast2/test.desc new file mode 100644 index 00000000000..854d67addcf --- /dev/null +++ b/regression/ansi-c/Initializer_cast2/test.desc @@ -0,0 +1,7 @@ +CORE +main.c + +^EXIT=0$ +^SIGNAL=0$ +-- +^CONVERSION ERROR$ diff --git a/src/ansi-c/c_typecheck_expr.cpp b/src/ansi-c/c_typecheck_expr.cpp index b28156b52a5..e45dc1a4d89 100644 --- a/src/ansi-c/c_typecheck_expr.cpp +++ b/src/ansi-c/c_typecheck_expr.cpp @@ -1100,7 +1100,14 @@ void c_typecheck_baset::typecheck_expr_typecast(exprt &expr) // or an expression for a pointer or scalar. // We produce a compound_literal expression. exprt tmp(ID_compound_literal, expr.type()); - tmp.move_to_operands(op); + tmp.copy_to_operands(op); + + // handle the case of TYPE being an array with unspecified size + if(op.id()==ID_array && + expr.type().id()==ID_array && + to_array_type(expr.type()).size().is_nil()) + tmp.type()=op.type(); + expr=tmp; expr.set(ID_C_lvalue, true); // these are l-values return; From 3613ebca0a4197fb51f076277f41696e46e6036e Mon Sep 17 00:00:00 2001 From: Michael Tautschnig Date: Fri, 18 Aug 2017 15:51:18 +0000 Subject: [PATCH 13/80] When possible, update array types before typechecking initializer This fixes a bug in compiling a Linux kernel driver. --- .../ansi-c/array_initialization3/main.c | 13 +++++ .../ansi-c/array_initialization3/test.desc | 8 ++++ src/ansi-c/c_typecheck_base.cpp | 47 +++++++------------ 3 files changed, 39 insertions(+), 29 deletions(-) create mode 100644 regression/ansi-c/array_initialization3/main.c create mode 100644 regression/ansi-c/array_initialization3/test.desc diff --git a/regression/ansi-c/array_initialization3/main.c b/regression/ansi-c/array_initialization3/main.c new file mode 100644 index 00000000000..6e7fb047488 --- /dev/null +++ b/regression/ansi-c/array_initialization3/main.c @@ -0,0 +1,13 @@ +#define STATIC_ASSERT_sizeof(condition) \ + int[(condition) ? 1 : -1] + +int A[]; +int B[]; + +int A[1]={sizeof(A)}; +int B[1]={sizeof(STATIC_ASSERT_sizeof(sizeof(B)==sizeof(int)))}; + +int main() +{ + return 0; +} diff --git a/regression/ansi-c/array_initialization3/test.desc b/regression/ansi-c/array_initialization3/test.desc new file mode 100644 index 00000000000..466da18b2b5 --- /dev/null +++ b/regression/ansi-c/array_initialization3/test.desc @@ -0,0 +1,8 @@ +CORE +main.c + +^EXIT=0$ +^SIGNAL=0$ +-- +^warning: ignoring +^CONVERSION ERROR$ diff --git a/src/ansi-c/c_typecheck_base.cpp b/src/ansi-c/c_typecheck_base.cpp index 0d18016602d..b0a8f1734c3 100644 --- a/src/ansi-c/c_typecheck_base.cpp +++ b/src/ansi-c/c_typecheck_base.cpp @@ -11,6 +11,7 @@ Author: Daniel Kroening, kroening@kroening.com #include "c_typecheck_base.h" +#include #include #include #include @@ -256,6 +257,16 @@ void c_typecheck_baset::typecheck_redefinition_non_type( // this is ok, just use old type new_symbol.type=old_symbol.type; } + else if(final_old.id()==ID_array && + to_array_type(final_old).size().is_nil() && + initial_new.id()==ID_array && + to_array_type(initial_new).size().is_not_nil() && + final_old.subtype()==initial_new.subtype()) + { + // update the type to enable the use of sizeof(x) on the + // right-hand side of a definition of x + old_symbol.type=new_symbol.type; + } // do initializer, this may change the type if(follow(new_symbol.type).id()!=ID_code && @@ -386,36 +397,14 @@ void c_typecheck_baset::typecheck_redefinition_non_type( if(final_old!=final_new) { if(final_old.id()==ID_array && - to_array_type(final_old).size().is_nil() && - final_new.id()==ID_array && - to_array_type(final_new).size().is_not_nil() && - final_old.subtype()==final_new.subtype()) + to_array_type(final_old).size().is_nil() && + final_new.id()==ID_array && + to_array_type(final_new).size().is_not_nil() && + final_old.subtype()==final_new.subtype()) { - // this is also ok - if(old_symbol.type.id()==ID_symbol) - { - // fix the symbol, not just the type - const irep_idt identifier= - to_symbol_type(old_symbol.type).get_identifier(); - - symbol_tablet::symbolst::iterator s_it= - symbol_table.symbols.find(identifier); - - if(s_it==symbol_table.symbols.end()) - { - error().source_location=old_symbol.location; - error() << "typecheck_redefinition_non_type: " - << "failed to find symbol `" << identifier << "'" - << eom; - throw 0; - } - - symbolt &symbol=s_it->second; - - symbol.type=final_new; - } - else - old_symbol.type=new_symbol.type; + // we don't do symbol types for arrays anymore + PRECONDITION(old_symbol.type.id()!=ID_symbol); + old_symbol.type=new_symbol.type; } else if((final_old.id()==ID_incomplete_c_enum || final_old.id()==ID_c_enum) && From f6d94cf7169bdd39a8c551be5b7fa7f0fec0eac3 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Thu, 7 Sep 2017 12:05:54 +0100 Subject: [PATCH 14/80] clean out an unused method --- src/goto-symex/goto_symex_state.cpp | 15 --------------- src/goto-symex/goto_symex_state.h | 2 -- 2 files changed, 17 deletions(-) diff --git a/src/goto-symex/goto_symex_state.cpp b/src/goto-symex/goto_symex_state.cpp index 9616a3daa20..f2db40c8b71 100644 --- a/src/goto-symex/goto_symex_state.cpp +++ b/src/goto-symex/goto_symex_state.cpp @@ -34,21 +34,6 @@ goto_symex_statet::goto_symex_statet(): goto_symex_statet::~goto_symex_statet()=default; -void goto_symex_statet::initialize(const goto_functionst &goto_functions) -{ - goto_functionst::function_mapt::const_iterator it= - goto_functions.function_map.find(goto_functionst::entry_point()); - - if(it==goto_functions.function_map.end()) - throw "program has no entry point"; - - const goto_programt &body=it->second.body; - - source=symex_targett::sourcet(body); - top().end_of_function=--body.instructions.end(); - top().calling_location.pc=top().end_of_function; -} - void goto_symex_statet::level0t::operator()( ssa_exprt &ssa_expr, const namespacet &ns, diff --git a/src/goto-symex/goto_symex_state.h b/src/goto-symex/goto_symex_state.h index 3c2deecf994..37d7d94d334 100644 --- a/src/goto-symex/goto_symex_state.h +++ b/src/goto-symex/goto_symex_state.h @@ -42,8 +42,6 @@ class goto_symex_statet final symex_targett::sourcet source; symex_targett *symex_target; - void initialize(const goto_functionst &goto_functions); - // we have a two-level renaming typedef std::map original_identifierst; From 296349c7e3a3a1ac6d8dbb460423556d90503413 Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Thu, 7 Sep 2017 11:56:30 +0100 Subject: [PATCH 15/80] Add dry-run mode to test.pl This gives [OK] status for tests that will be run and [SKIPPED] otherwise. Useful for tools that want to inspect tests that ran / will run. --- regression/test.pl | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/regression/test.pl b/regression/test.pl index 3118fd375f6..c9a90edc333 100755 --- a/regression/test.pl +++ b/regression/test.pl @@ -59,8 +59,8 @@ ($) return @data; } -sub test($$$$$) { - my ($name, $test, $t_level, $cmd, $ign) = @_; +sub test($$$$$$) { + my ($name, $test, $t_level, $cmd, $ign, $dry_run) = @_; my ($level, $input, $options, $grep_options, @results) = load("$test"); # If the 4th line is activate-multi-line-match we enable multi-line checks @@ -106,6 +106,11 @@ ($$$$$) my $failed = 2; if($level & $t_level) { + + if ($dry_run) { + return 0; + } + $failed = run($name, $input, $cmd, $options, $output); if(!$failed) { @@ -211,6 +216,7 @@ ($$$$) -c CMD run tests on CMD - required option -i options in test.desc matching the specified perl regex are ignored -j run tests in parallel (requires Thread::Pool::Simple) + -n dry-run: print the tests that would be run, but don't actually run them -h show this help and exit -C core: run all essential tests (default if none of C/T/F/K are given) -T thorough: run expensive tests @@ -249,9 +255,9 @@ ($$$$) use Getopt::Std; $main::VERSION = 0.1; $Getopt::Std::STANDARD_HELP_VERSION = 1; -our ($opt_c, $opt_i, $opt_j, $opt_h, $opt_C, $opt_T, $opt_F, $opt_K); # the variables for getopt +our ($opt_c, $opt_i, $opt_j, $opt_n, $opt_h, $opt_C, $opt_T, $opt_F, $opt_K); # the variables for getopt $opt_j = 0; -getopts('c:i:j:hCTFK') or &main::HELP_MESSAGE(\*STDOUT, "", $main::VERSION, ""); +getopts('c:i:j:nhCTFK') or &main::HELP_MESSAGE(\*STDOUT, "", $main::VERSION, ""); $opt_c or &main::HELP_MESSAGE(\*STDOUT, "", $main::VERSION, ""); (!$opt_j || $has_thread_pool) or &main::HELP_MESSAGE(\*STDOUT, "", $main::VERSION, ""); $opt_h and &main::HELP_MESSAGE(\*STDOUT, "", $main::VERSION, ""); @@ -260,7 +266,7 @@ ($$$$) $t_level += 4 if($opt_F); $t_level += 8 if($opt_K); $t_level += 1 if($opt_C || 0 == $t_level); - +my $dry_run = $opt_n; open LOG,">tests.log"; @@ -287,7 +293,7 @@ ($) my @files = glob "$test/*.desc"; for (0..$#files){ defined($pool) or print " Running $files[$_]"; - $failed_skipped = test($test, $files[$_], $t_level, $opt_c, $opt_i); + $failed_skipped = test($test, $files[$_], $t_level, $opt_c, $opt_i, $dry_run); lock($skips); defined($pool) and print " Running $test $files[$_]"; From 359a3e32bfc43fc078311efdb3cdcb68b89c805d Mon Sep 17 00:00:00 2001 From: thk123 Date: Thu, 7 Sep 2017 14:11:27 +0100 Subject: [PATCH 16/80] Modified verbosity for loaded message This indicates nothing particuarly exciting and when loading the models library brings in a lot of noise to the output. --- src/java_bytecode/java_class_loader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java_bytecode/java_class_loader.cpp b/src/java_bytecode/java_class_loader.cpp index e627c9e1f8b..bb945ddcc10 100644 --- a/src/java_bytecode/java_class_loader.cpp +++ b/src/java_bytecode/java_class_loader.cpp @@ -207,7 +207,7 @@ void java_class_loadert::read_jar_file( // does it end on .class? if(has_suffix(file_name, ".class")) { - status() << "read class file " << file_name << " from " << file << eom; + debug() << "read class file " << file_name << " from " << file << eom; irep_idt class_name=file_to_class_name(file_name); // record From 2217501ba7258f6293082cc877cf28d4f15c3f83 Mon Sep 17 00:00:00 2001 From: reuk Date: Thu, 7 Sep 2017 14:33:04 +0100 Subject: [PATCH 17/80] Remove unused files --- src/goto-cc/xml_binaries/read_goto_object.cpp | 135 -- src/goto-cc/xml_binaries/read_goto_object.h | 28 - .../xml_binaries/xml_goto_function.cpp | 38 - src/goto-cc/xml_binaries/xml_goto_function.h | 23 - .../xml_goto_function_hashing.cpp | 43 - .../xml_binaries/xml_goto_function_hashing.h | 38 - src/goto-cc/xml_binaries/xml_goto_program.cpp | 405 ------ src/goto-cc/xml_binaries/xml_goto_program.h | 33 - .../xml_binaries/xml_goto_program_hashing.cpp | 403 ------ .../xml_binaries/xml_goto_program_hashing.h | 43 - src/goto-cc/xml_binaries/xml_irep_hashing.cpp | 294 ----- src/goto-cc/xml_binaries/xml_irep_hashing.h | 116 -- src/goto-cc/xml_binaries/xml_symbol.cpp | 128 -- src/goto-cc/xml_binaries/xml_symbol.h | 23 - .../xml_binaries/xml_symbol_hashing.cpp | 39 - src/goto-cc/xml_binaries/xml_symbol_hashing.h | 38 - src/goto-instrument/accelerate/linearize.cpp | 18 - src/goto-instrument/accelerate/linearize.h | 41 - src/java_bytecode/java_bytecode_vtable.cpp | 449 ------- src/java_bytecode/java_bytecode_vtable.h | 37 - src/solvers/Makefile | 9 + src/solvers/cvc/cvc_prop.cpp | 307 ----- src/solvers/cvc/cvc_prop.h | 88 -- src/solvers/dplib/dplib_conv.cpp | 1170 ----------------- src/solvers/dplib/dplib_conv.h | 73 - src/solvers/dplib/dplib_dec.cpp | 159 --- src/solvers/dplib/dplib_dec.h | 43 - src/solvers/dplib/dplib_prop.cpp | 305 ----- src/solvers/dplib/dplib_prop.h | 91 -- src/solvers/floatbv/float_approximation.cpp | 2 +- src/solvers/floatbv/float_approximation.h | 2 +- src/solvers/smt1/smt1_prop.cpp | 297 ----- src/solvers/smt1/smt1_prop.h | 81 -- src/solvers/smt2/smt2_prop.cpp | 334 ----- src/solvers/smt2/smt2_prop.h | 90 -- 35 files changed, 11 insertions(+), 5412 deletions(-) delete mode 100644 src/goto-cc/xml_binaries/read_goto_object.cpp delete mode 100644 src/goto-cc/xml_binaries/read_goto_object.h delete mode 100644 src/goto-cc/xml_binaries/xml_goto_function.cpp delete mode 100644 src/goto-cc/xml_binaries/xml_goto_function.h delete mode 100644 src/goto-cc/xml_binaries/xml_goto_function_hashing.cpp delete mode 100644 src/goto-cc/xml_binaries/xml_goto_function_hashing.h delete mode 100644 src/goto-cc/xml_binaries/xml_goto_program.cpp delete mode 100644 src/goto-cc/xml_binaries/xml_goto_program.h delete mode 100644 src/goto-cc/xml_binaries/xml_goto_program_hashing.cpp delete mode 100644 src/goto-cc/xml_binaries/xml_goto_program_hashing.h delete mode 100644 src/goto-cc/xml_binaries/xml_irep_hashing.cpp delete mode 100644 src/goto-cc/xml_binaries/xml_irep_hashing.h delete mode 100644 src/goto-cc/xml_binaries/xml_symbol.cpp delete mode 100644 src/goto-cc/xml_binaries/xml_symbol.h delete mode 100644 src/goto-cc/xml_binaries/xml_symbol_hashing.cpp delete mode 100644 src/goto-cc/xml_binaries/xml_symbol_hashing.h delete mode 100644 src/goto-instrument/accelerate/linearize.cpp delete mode 100644 src/goto-instrument/accelerate/linearize.h delete mode 100644 src/java_bytecode/java_bytecode_vtable.cpp delete mode 100644 src/java_bytecode/java_bytecode_vtable.h delete mode 100644 src/solvers/cvc/cvc_prop.cpp delete mode 100644 src/solvers/cvc/cvc_prop.h delete mode 100644 src/solvers/dplib/dplib_conv.cpp delete mode 100644 src/solvers/dplib/dplib_conv.h delete mode 100644 src/solvers/dplib/dplib_dec.cpp delete mode 100644 src/solvers/dplib/dplib_dec.h delete mode 100644 src/solvers/dplib/dplib_prop.cpp delete mode 100644 src/solvers/dplib/dplib_prop.h delete mode 100644 src/solvers/smt1/smt1_prop.cpp delete mode 100644 src/solvers/smt1/smt1_prop.h delete mode 100644 src/solvers/smt2/smt2_prop.cpp delete mode 100644 src/solvers/smt2/smt2_prop.h diff --git a/src/goto-cc/xml_binaries/read_goto_object.cpp b/src/goto-cc/xml_binaries/read_goto_object.cpp deleted file mode 100644 index 24dde49bec9..00000000000 --- a/src/goto-cc/xml_binaries/read_goto_object.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/*******************************************************************\ - -Module: Read goto object files. - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Read goto object files. - -#include "read_goto_object.h" - -#include -#include -#include -#include - -#define XML_VERSION "1.4" - -#include - -#include "xml_goto_function_hashing.h" -#include "xml_irep_hashing.h" -#include "xml_symbol_hashing.h" - -/// reads a goto object xml file back into a symbol and a function table -/// \par parameters: input stream, symbol_table, functions -/// \return true on error, false otherwise -bool read_goto_object( - std::istream &in, - const std::string &filename, - symbol_tablet &symbol_table, - goto_functionst &functions, - message_handlert &message_handler) -{ - messaget message(message_handler); - - xml_parser.clear(); - xml_parser.filename = filename; - xml_parser.in = ∈ - xml_parser.set_message_handler(message_handler); - - if(xml_parser.parse()) - return true; - - xmlt &top = xml_parser.parse_tree.element; - - if(top.get_attribute("version")!=XML_VERSION) - { - message.error() << - "The input was compiled with a different version of " - "goto-cc, please recompile." << messaget::eom; - return true; - } - - xml_irep_convertt::ireps_containert ic; - xml_irep_convertt irepconverter(ic); - xml_symbol_convertt symbolconverter(ic); - xml_goto_function_convertt gfconverter(ic); - - if(top.name.substr(0, 11)=="goto-object") - { - for(xmlt::elementst::const_iterator - sec_it=top.elements.begin(); - sec_it != top.elements.end(); - sec_it++) - { - xmlt sec = *sec_it; - if(sec.name=="irep_hash_map") - { - for(xmlt::elementst::const_iterator - irep_it = sec.elements.begin(); - irep_it != sec.elements.end(); - irep_it++) - { - irept i; - irepconverter.convert(*irep_it, i); - irepconverter.insert(irep_it->get_attribute("id"), i); - } - } - else if(sec.name=="symbols") - { - for(xmlt::elementst::const_iterator - sym_it = sec.elements.begin(); - sym_it != sec.elements.end(); - sym_it++) - { - symbolt symbol; - symbolconverter.convert(*sym_it, symbol); - // std::cout << "Adding Symbol: " << symbol.name << '\n'; - if(!symbol.is_type && - symbol.type.id()=="code") - { - // makes sure there is an empty function - // for this symbol. if we got code for it, - // it will be added later on. - functions.function_map[symbol.name].type= - to_code_type(symbol.type); - } - symbol_table.add(symbol); - } - } - else if(sec.name=="functions") - { - for(xmlt::elementst::const_iterator - fun_it = sec.elements.begin(); - fun_it != sec.elements.end(); - fun_it++) - { - std::string fname = fun_it->get_attribute("name"); - // std::cout << "Adding function body: " << fname << '\n'; - goto_functionst::goto_functiont &f = functions.function_map[fname]; - gfconverter.convert(*fun_it, f); - } - } - else - { - message.error() << "Unknown Section '" << sec.name - << "' in object file." << messaget::eom; - return true; - } - } - } - else - { - message.error() << "no goto-object" << messaget::eom; - return true; - } - - xml_parser.clear(); - return false; -} diff --git a/src/goto-cc/xml_binaries/read_goto_object.h b/src/goto-cc/xml_binaries/read_goto_object.h deleted file mode 100644 index 36981051008..00000000000 --- a/src/goto-cc/xml_binaries/read_goto_object.h +++ /dev/null @@ -1,28 +0,0 @@ -/*******************************************************************\ - -Module: Read goto object files. - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Read goto object files. - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_READ_GOTO_OBJECT_H -#define CPROVER_GOTO_CC_XML_BINARIES_READ_GOTO_OBJECT_H - -#include -#include -#include - -bool read_goto_object( - std::istream &in, - const std::string &filename, - symbol_tablet &symbol_table, - goto_functionst &functions, - message_handlert &msg_hndlr); - -#endif // CPROVER_GOTO_CC_XML_BINARIES_READ_GOTO_OBJECT_H diff --git a/src/goto-cc/xml_binaries/xml_goto_function.cpp b/src/goto-cc/xml_binaries/xml_goto_function.cpp deleted file mode 100644 index 7475a990a4b..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_function.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto functions to xml structures and back. - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto functions to xml structures and back. - -#include "xml_goto_function.h" - -#include - -#include "xml_goto_program.h" - -/// takes a goto_function and creates an according xml structure -/// \par parameters: goto_function and an xml node -/// \return none -void convert(const goto_functionst::goto_functiont &function, xmlt &xml) -{ - if(function.body_available) - convert(function.body, xml); -} - -/// constructs the goto_function according to the information in the xml -/// structure. -/// \par parameters: xml structure and a goto_function to fill -/// \return none -void convert(const xmlt &xml, goto_functionst::goto_functiont &function) -{ - function.body.clear(); - convert(xml, function.body); - // don't forget to fix the functions type via the symbol table! -} diff --git a/src/goto-cc/xml_binaries/xml_goto_function.h b/src/goto-cc/xml_binaries/xml_goto_function.h deleted file mode 100644 index b15722976b8..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_function.h +++ /dev/null @@ -1,23 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto functions into xml structures and back - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto functions into xml structures and back - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_FUNCTION_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_FUNCTION_H - -#include -#include - -void convert(const xmlt&, goto_functionst::goto_functiont&); -void convert(const goto_functionst::goto_functiont&, xmlt&); - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_FUNCTION_H diff --git a/src/goto-cc/xml_binaries/xml_goto_function_hashing.cpp b/src/goto-cc/xml_binaries/xml_goto_function_hashing.cpp deleted file mode 100644 index a0a2f428dab..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_function_hashing.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto functions to xml structures and back (with irep - hashing) - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto functions to xml structures and back (with irep hashing) - -#include "xml_goto_function_hashing.h" - -#include "xml_goto_program_hashing.h" - -/// takes a goto_function and creates an according xml structure -/// \par parameters: goto_function and an xml node -/// \return none -void xml_goto_function_convertt::convert( - const goto_functionst::goto_functiont &function, - xmlt &xml) -{ - xml_goto_program_convertt gpconverter(ireps_container); - if(function.body_available) - gpconverter.convert(function.body, xml); -} - -/// constructs the goto_function according to the information in the xml -/// structure. -/// \par parameters: xml structure and a goto_function to fill -/// \return none -void xml_goto_function_convertt::convert( - const xmlt &xml, - goto_functionst::goto_functiont &function) -{ - xml_goto_program_convertt gpconverter(ireps_container); - function.body.clear(); - gpconverter.convert(xml, function.body); - // don't forget to fix the functions type via the symbol table! -} diff --git a/src/goto-cc/xml_binaries/xml_goto_function_hashing.h b/src/goto-cc/xml_binaries/xml_goto_function_hashing.h deleted file mode 100644 index e558a702c68..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_function_hashing.h +++ /dev/null @@ -1,38 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto functions into xml structures and back (with irep - hashing). - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto functions into xml structures and back (with irep hashing). - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_FUNCTION_HASHING_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_FUNCTION_HASHING_H - -#include -#include - -#include "xml_irep_hashing.h" - -class xml_goto_function_convertt -{ -private: - xml_irep_convertt::ireps_containert &ireps_container; - -public: - explicit xml_goto_function_convertt(xml_irep_convertt::ireps_containert &ic): - ireps_container(ic) - { - } - - void convert(const xmlt&, goto_functionst::goto_functiont&); - void convert(const goto_functionst::goto_functiont&, xmlt&); -}; - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_FUNCTION_HASHING_H diff --git a/src/goto-cc/xml_binaries/xml_goto_program.cpp b/src/goto-cc/xml_binaries/xml_goto_program.cpp deleted file mode 100644 index 1f12fcff98f..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_program.cpp +++ /dev/null @@ -1,405 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto programs to xml structures and back. - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto programs to xml structures and back. - -#include "xml_goto_program.h" - -#include -#include - -#include - -/// constructs the xml structure according to the goto program and the namespace -/// into the given xml object. -/// \par parameters: goto program, namespace and an xml structure to fill -/// \return none -void convert(const goto_programt &goto_program, - xmlt &xml) -{ - std::stringstream tmp; - // std::cout << "TNO: " << goto_program.target_numbers.size() << '\n'; - - for(const auto &inst : goto_program.instructions) - { - xmlt &ins=xml.new_element("instruction"); - - if(!inst.location.is_nil()) - { - convert(inst.location, ins.new_element("location")); - } - - if(!inst.labels.empty()) - { - xmlt &lbl=ins.new_element("labels"); - for(goto_programt::instructiont::labelst::const_iterator - l_it=inst.labels.begin(); - l_it!=inst.labels.end(); - l_it++) - { - lbl.new_element("label").set_attribute("name", id2string(*l_it)); - } - } - - - if(inst.target_number!=0) - { - // std::cout << "Targetlabel found!\n"; - tmp.str(""); - tmp << inst.target_number; - ins.set_attribute("targetlabel", tmp.str()); - } - - switch(inst.type) - { - case GOTO: - { - ins.name="goto"; - if(!inst.guard.is_true()) - { - xmlt &g=ins.new_element("guard"); - convert(inst.guard, g); - } - xmlt &tgt=ins.new_element("targets"); - for(goto_programt::instructiont::targetst::const_iterator - gt_it=inst.targets.begin(); - gt_it!=inst.targets.end(); - gt_it++) - { - tmp.str(""); - tmp << (*gt_it)->target_number; - tgt.new_element("target").data=tmp.str(); - } - break; - } - - case ASSUME: - { - ins.name="assume"; - xmlt &g=ins.new_element("guard"); - convert(inst.guard, g); - - const irep_idt &comment=inst.location.get("comment"); - - if(comment!="") - ins.new_element("comment").data=id2string(comment); - - break; - } - - case ASSERT: - { - ins.name="assert"; - xmlt &g=ins.new_element("guard"); - convert(inst.guard, g); - const irep_idt &comment=inst.location.get("comment"); - - if(comment!="") - ins.new_element("comment").data=id2string(comment); - - break; - } - - case SKIP: - ins.name="skip"; - break; - - case END_FUNCTION: - ins.name="end_function"; - break; - - case LOCATION: - ins.name="location"; - break; - - case DEAD: - ins.name="dead"; - break; - - case ATOMIC_BEGIN: - ins.name="atomic_begin"; - break; - - case ATOMIC_END: - ins.name="atomic_end"; - break; - - case RETURN: - { - ins.name="return"; - xmlt &c=ins.new_element("code"); - convert(inst.code, c); - break; - } - - case OTHER: - { - ins.name="instruction"; - xmlt &c=ins.new_element("code"); - convert(inst.code, c); - break; - } - - case ASSIGN: - { - ins.name="assign"; - xmlt &c=ins.new_element("code"); - convert(inst.code, c); - break; - } - - case FUNCTION_CALL: - { - ins.name="functioncall"; - xmlt &c=ins.new_element("code"); - convert(inst.code, c); - break; - } - - case START_THREAD: - { - ins.name="thread_start"; - xmlt &tgt=ins.new_element("targets"); - if(inst.targets.size()==1) - { - tmp.str(""); - tmp << inst.targets.front()->target_number; - tgt.new_element("target").data=tmp.str(); - } - break; - } - - case END_THREAD: - ins.name="thread_end"; - break; - - default: - ins.name="unknown"; - break; - } - - if(inst.function!="") - { - xmlt &fnc=ins.new_element("function"); - fnc.data=id2string(inst.function); - } - } -} - -/// constructs the goto program according to the xml structure and the namespace -/// into the given goto program object. -/// \par parameters: an xml structure, namespace, function symbol -/// and a goto program to fill -/// \return none -void convert(const xmlt &xml, goto_programt &goto_program) -{ - goto_program.clear(); - goto_programt::instructionst &instructions = goto_program.instructions; - - xmlt::elementst::const_iterator it = xml.elements.begin(); - for(; it != xml.elements.end(); it++) - { - goto_programt::targett inst = goto_program.add_instruction(); - inst->targets.clear(); - - if(it->name=="goto") - { - inst->type = GOTO; - } - else if(it->name=="assume") - { - inst->type = ASSUME; - } - else if(it->name=="assert") - { - inst->type = ASSERT; - } - else if(it->name=="skip") - { - inst->type = SKIP; - } - else if(it->name=="end_function") - { - inst->type = END_FUNCTION; - } - else if(it->name=="location") - { - inst->type = LOCATION; - } - else if(it->name=="dead") - { - inst->type = DEAD; - } - else if(it->name=="atomic_begin") - { - inst->type = ATOMIC_BEGIN; - } - else if(it->name=="atomic_end") - { - inst->type = ATOMIC_END; - } - else if(it->name=="return") - { - inst->make_return(); - } - else if(it->name=="instruction") // OTHER - { - inst->make_other(); - } - else if(it->name=="assign") - { - inst->make_other(); - inst->type=ASSIGN; - } - else if(it->name=="functioncall") - { - inst->make_other(); - inst->type=FUNCTION_CALL; - } - else if(it->name=="thread_start") - { - inst->type = START_THREAD; - } - else if(it->name=="thread_end") - { - inst->type = END_THREAD; - } - else - { - std::cout << "Unknown instruction type encountered (" << it->name - << ")\n"; - return; - } - - xmlt::elementst::const_iterator eit = it->elements.begin(); - for(; eit != it->elements.end(); eit++) - { - if(eit->name=="location") - { - convert(*eit, inst->location); - } - else if(eit->name=="variables") - { - } - else if(eit->name=="labels") - { - xmlt::elementst::const_iterator lit = eit->elements.begin(); - for(; lit != eit->elements.end(); lit++) - { - if(lit->name=="label") - { - std::string ls = lit->get_attribute("name"); - inst->labels.push_back(ls); - } - else - { - std::cout << "Unknown node in labels section.\n"; - return; - } - } - } - else if(eit->name=="guard") - { - inst->guard.remove("value"); - convert(*eit, inst->guard); - } - else if(eit->name=="code") - { - convert(*eit, inst->code); - } - else if(eit->name=="targets") - { - // Don't do anything here, we'll need a second run for that - } - else if(eit->name=="comment") - { - inst->location.set("comment", eit->data); - } - else if(eit->name=="function") - { - inst->function = eit->data; - } - } - } - - // assign line numbers - goto_program.compute_location_numbers(); - - // second run, for targets - goto_programt::targett ins_it = instructions.begin(); - it = xml.elements.begin(); - for(; it != xml.elements.end() && ins_it!=instructions.end(); it++) - { - xmlt::elementst::const_iterator eit = it->elements.begin(); - for(; eit != it->elements.end(); eit++) - { - if(eit->name=="targets") - { - xmlt::elementst::const_iterator tit = eit->elements.begin(); - for(; tit != eit->elements.end(); tit++) - { - if(tit->name=="target") - { - goto_programt::targett tins = - find_instruction(xml, instructions, tit->data); - if(tins != instructions.end()) - { - // Here we insert the iterators that somehow seem - // to be strange afterwards (see line 87) - ins_it->targets.push_back(tins); - } - else - { - std::cout << "Warning: instruction not found when " - "resolving target links.\n"; - } - } - else - { - std::cout << "Unknown node in targets section.\n"; - return; - } - } - } - } - ins_it++; - } - - // resolve links - goto_program.update(); - - // std::cout << "TNI: " << goto_program.target_numbers.size() << '\n'; -} - -/// finds the index of the instruction labelled with the given target label in -/// the given xml-program -/// \par parameters: a target label string, the instructions list and an xml -/// program -/// \return iterator to the found instruction or .end() -goto_programt::targett -find_instruction( - const xmlt &xml, - goto_programt::instructionst &instructions, - const irep_idt &label) -{ - goto_programt::targett ins_it=instructions.begin(); - xmlt::elementst::const_iterator it=xml.elements.begin(); - - for(; it != xml.elements.end() && ins_it!=instructions.end(); it++) - { - if(label==it->get_attribute("targetlabel")) - return ins_it; - - ins_it++; - } - - return instructions.end(); -} diff --git a/src/goto-cc/xml_binaries/xml_goto_program.h b/src/goto-cc/xml_binaries/xml_goto_program.h deleted file mode 100644 index cd5cb4e6c17..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_program.h +++ /dev/null @@ -1,33 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto programs into xml structures and back - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto programs into xml structures and back - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_PROGRAM_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_PROGRAM_H - -#include -#include - -void convert( - const goto_programt&, - xmlt&); - -void convert( - const xmlt&, - goto_programt&); - -goto_programt::targett find_instruction( - const xmlt &, - goto_programt::instructionst &, - const irep_idt &); - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_PROGRAM_H diff --git a/src/goto-cc/xml_binaries/xml_goto_program_hashing.cpp b/src/goto-cc/xml_binaries/xml_goto_program_hashing.cpp deleted file mode 100644 index 129f90dd9d6..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_program_hashing.cpp +++ /dev/null @@ -1,403 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto programs to xml structures and back (with irep - hashing) - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto programs to xml structures and back (with irep hashing) - -#include "xml_goto_program_hashing.h" - -#include -#include - -#include "xml_irep_hashing.h" - -/// constructs the xml structure according to the goto program and the namespace -/// into the given xml object. -/// \par parameters: goto program and an xml structure to fill -/// \return none -void xml_goto_program_convertt::convert( - const goto_programt &goto_program, - xmlt &xml) -{ - std::stringstream tmp; - // std::cout << "TNO: " << goto_program.target_numbers.size() << '\n'; - - for(const auto &inst : goto_program.instructions) - { - xmlt &ins=xml.new_element("instruction"); - if(!inst.location.is_nil()) - { - irepconverter.reference_convert( - inst.location, ins.new_element("location")); - } - - if(!inst.labels.empty()) - { - xmlt &lbl=ins.new_element("labels"); - for(goto_programt::instructiont::labelst::const_iterator - l_it=inst.labels.begin(); - l_it!=inst.labels.end(); - l_it++) - { - lbl.new_element("label").set_attribute("name", id2string(*l_it)); - } - } - - - if(inst.target_number!=0) - { - // std::cout << "Targetlabel found!\n"; - tmp.str(""); - tmp << inst.target_number; - ins.set_attribute("targetlabel", tmp.str()); - } - - switch(inst.type) - { - case GOTO: - { - ins.name="goto"; - if(!inst.guard.is_true()) - { - xmlt &g=ins.new_element("guard"); - irepconverter.reference_convert(inst.guard, g); - } - xmlt &tgt=ins.new_element("targets"); - for(goto_programt::instructiont::targetst::const_iterator - gt_it=inst.targets.begin(); - gt_it!=inst.targets.end(); - gt_it++) - { - tmp.str(""); - tmp << (*gt_it)->target_number; - tgt.new_element("target").data=tmp.str(); - } - break; - } - - case ASSUME: - { - ins.name="assume"; - xmlt &g=ins.new_element("guard"); - irepconverter.reference_convert(inst.guard, g); - const irep_idt &comment=inst.location.get("comment"); - if(comment!="") - ins.new_element("comment").data=id2string(comment); - break; - } - - case ASSERT: - { - ins.name="assert"; - xmlt &g=ins.new_element("guard"); - irepconverter.reference_convert(inst.guard, g); - const irep_idt &comment=inst.location.get("comment"); - if(comment!="") - ins.new_element("comment").data=id2string(comment); - break; - } - - case SKIP: - ins.name="skip"; - break; - - case END_FUNCTION: - ins.name="end_function"; - break; - - case LOCATION: - ins.name="location"; - break; - - case DEAD: - ins.name="dead"; - break; - - case ATOMIC_BEGIN: - ins.name="atomic_begin"; - break; - - case ATOMIC_END: - ins.name="atomic_end"; - break; - - case RETURN: - { - ins.name="return"; - xmlt &c=ins.new_element("code"); - irepconverter.reference_convert(inst.code, c); - break; - } - - case OTHER: - { - ins.name="instruction"; - xmlt &c=ins.new_element("code"); - irepconverter.reference_convert(inst.code, c); - break; - } - - case ASSIGN: - { - ins.name="assign"; - xmlt &c=ins.new_element("code"); - irepconverter.reference_convert(inst.code, c); - break; - } - - case FUNCTION_CALL: - { - ins.name="functioncall"; - xmlt &c=ins.new_element("code"); - irepconverter.reference_convert(inst.code, c); - break; - } - - case START_THREAD: - { - ins.name="thread_start"; - xmlt &tgt=ins.new_element("targets"); - if(inst.targets.size()==1) - { - tmp.str(""); - tmp << inst.targets.front()->target_number; - tgt.new_element("target").data=tmp.str(); - } - break; - } - - case END_THREAD: - ins.name="thread_end"; - break; - - default: - ins.name="unknown"; - break; - } - - if(inst.function!="") - { - xmlt &fnc=ins.new_element("function"); - fnc.data=id2string(inst.function); - } - } -} - -/// constructs the goto program according to the xml structure and the namespace -/// into the given goto program object. -/// \par parameters: an xml structure and a goto program to fill -/// \return none -void xml_goto_program_convertt::convert( - const xmlt &xml, - goto_programt &goto_program) -{ - goto_program.clear(); - goto_programt::instructionst &instructions=goto_program.instructions; - - for(const auto &element : xml.elements) - { - goto_programt::targett inst=goto_program.add_instruction(); - inst->targets.clear(); - - if(element.name=="goto") - { - inst->type=GOTO; - } - else if(element.name=="assume") - { - inst->type=ASSUME; - } - else if(element.name=="assert") - { - inst->type=ASSERT; - } - else if(element.name=="skip") - { - inst->type=SKIP; - } - else if(element.name=="end_function") - { - inst->type=END_FUNCTION; - } - else if(element.name=="location") - { - inst->type=LOCATION; - } - else if(element.name=="dead") - { - inst->type=DEAD; - } - else if(element.name=="atomic_begin") - { - inst->type=ATOMIC_BEGIN; - } - else if(element.name=="atomic_end") - { - inst->type=ATOMIC_END; - } - else if(element.name=="return") - { - inst->make_return(); - } - else if(element.name=="instruction") // OTHER - { - inst->make_other(); - } - else if(element.name=="assign") // OTHER - { - inst->make_other(); - inst->type=ASSIGN; - } - else if(element.name=="functioncall") // OTHER - { - inst->make_other(); - inst->type=FUNCTION_CALL; - } - else if(element.name=="thread_start") - { - inst->type=START_THREAD; - } - else if(element.name=="thread_end") - { - inst->type=END_THREAD; - } - else - { - std::cout << "Unknown instruction type encountered (" - << element.name << ")\n"; - return; - } - - xmlt::elementst::const_iterator eit=element.elements.begin(); - for(const auto &sub : element.elements) - { - if(sub.name=="location") - { - irepconverter.convert(*eit, inst->location); - irepconverter.resolve_references(inst->location); - } - else if(sub.name=="variables") - { - } - else if(sub.name=="labels") - { - xmlt::elementst::const_iterator lit=sub.elements.begin(); - for(; lit != sub.elements.end(); lit++) - { - if(lit->name=="label") - { - std::string ls=lit->get_attribute("name"); - inst->labels.push_back(ls); - } - else - { - std::cout << "Unknown node in labels section.\n"; - return; - } - } - } - else if(sub.name=="guard") - { - inst->guard.remove("value"); - irepconverter.convert(*eit, inst->guard); - irepconverter.resolve_references(inst->guard); - } - else if(sub.name=="code") - { - irepconverter.convert(*eit, inst->code); - irepconverter.resolve_references(inst->code); - } - else if(sub.name=="targets") - { - // Don't do anything here, we'll need a second run for that - } - else if(sub.name=="comment") - { - inst->location.set("comment", sub.data); - } - else if(sub.name=="function") - { - inst->function=sub.data; - } - } - } - - // assign line numbers - goto_program.compute_location_numbers(); - - // second run, for targets - goto_programt::targett ins_it=instructions.begin(); - for(const auto &element : xml.elements) - { - if(ins_it==instructions.end()) - break; - - for(const auto &sub : element.elements) - { - if(sub.name=="targets") - { - for(const auto &t : sub.elements) - { - if(t.name=="target") - { - goto_programt::targett tins = - find_instruction(xml, instructions, t.data); - if(tins!=instructions.end()) - { - // Here we insert the iterators that somehow seem - // to be strange afterwards (see line 87) - ins_it->targets.push_back(tins); - } - else - { - std::cout << "Warning: instruction not found when " - "resolving target links.\n"; - } - } - else - { - std::cout << "Unknown node in targets section.\n"; - return; - } - } - } - } - ins_it++; - } - - // resolve links - goto_program.update(); - - // std::cout << "TNI: " << goto_program.target_numbers.size() << '\n'; -} - -/// finds the index of the instruction labelled with the given target label in -/// the given xml-program -/// \par parameters: a target label string, the instructions list and an xml -/// program -/// \return iterator to the found instruction or .end() -goto_programt::targett xml_goto_program_convertt::find_instruction( - const xmlt &xml, - goto_programt::instructionst &instructions, - const std::string &label) -{ - goto_programt::targett ins_it=instructions.begin(); - for(const auto &element : xml.elements) - { - if(ins_it==instructions.end()) - break; - - if(label==element.get_attribute("targetlabel")) - return ins_it; - ins_it++; - } - return instructions.end(); -} diff --git a/src/goto-cc/xml_binaries/xml_goto_program_hashing.h b/src/goto-cc/xml_binaries/xml_goto_program_hashing.h deleted file mode 100644 index 63622775799..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_program_hashing.h +++ /dev/null @@ -1,43 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto programs into xml structures and back (with - irep hashing) - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto programs into xml structures and back (with irep hashing) - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_PROGRAM_HASHING_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_PROGRAM_HASHING_H - -#include -#include - -#include "xml_irep_hashing.h" - -class xml_goto_program_convertt -{ -private: - xml_irep_convertt irepconverter; - -public: - explicit xml_goto_program_convertt(xml_irep_convertt::ireps_containert &ic): - irepconverter(ic) - { - } - - void convert(const goto_programt&, xmlt&); - void convert(const xmlt&, goto_programt&); - - goto_programt::targett find_instruction( - const xmlt &, - goto_programt::instructionst &, - const std::string &); -}; - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_PROGRAM_HASHING_H diff --git a/src/goto-cc/xml_binaries/xml_irep_hashing.cpp b/src/goto-cc/xml_binaries/xml_irep_hashing.cpp deleted file mode 100644 index 312a076befe..00000000000 --- a/src/goto-cc/xml_binaries/xml_irep_hashing.cpp +++ /dev/null @@ -1,294 +0,0 @@ -/*******************************************************************\ - -Module: XML-irep conversions with hashing - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// XML-irep conversions with hashing - -#include "xml_irep_hashing.h" - -#include -#include - -#include "string_hash.h" - -void xml_irep_convertt::convert( - const irept &irep, - xmlt &xml) -{ - if(irep.id()!="nil") - xml.new_element("id").data=irep.id_string(); - - forall_irep(it, irep.get_sub()) - { - xmlt &x_sub=xml.new_element("s"); - reference_convert(*it, x_sub); - } - - forall_named_irep(it, irep.get_named_sub()) - { - xmlt &x_nsub=xml.new_element("ns"); - x_nsub.set_attribute("n", name2string(it->first)); - reference_convert(it->second, x_nsub); - } - - forall_named_irep(it, irep.get_comments()) - { - xmlt &x_com=xml.new_element("c"); - x_com.set_attribute("n", name2string(it->first)); - reference_convert(it->second, x_com); - } -} - -void xml_irep_convertt::convert( - const xmlt &xml, - irept &irep) -{ - irep.id("nil"); - xmlt::elementst::const_iterator it=xml.elements.begin(); - for(; it != xml.elements.end(); it++) - { - if(it->name=="R") - { - irep.id("__REFERENCE__"); - irep.set("REF", it->data); - } - else if(it->name=="id") - { - irep.id(it->data); - } - else if(it->name=="ns") - { - irept r; - convert(*it, r); - std::string named_name=it->get_attribute("n"); - irep.move_to_named_sub(named_name, r); - } - else if(it->name=="s") - { - irept r; - convert(*it, r); - irep.move_to_sub(r); - } - else if(it->name=="c") - { - irept r; - convert(*it, r); - std::string named_name=it->get_attribute("n"); - irep.move_to_named_sub(named_name, r); - } - else - { - // Should not happen - std::cout << "Unknown sub found (" << it->name << "); malformed xml?\n"; - } - } -} - -void xml_irep_convertt::reference_convert( - const irept &irep, - xmlt &xml) -{ - xmlt &ir=xml.new_element("R"); - - ireps_containert::content_containert::const_iterator fi= - find_irep_by_content(irep); - if(fi==ireps_container.content_container.end()) - { - unsigned id=ireps_container.id_replace_map[add_with_childs(irep)]; - ir.data=long_to_string(id); - } - else - { - ir.data= - long_to_string(ireps_container.id_replace_map[fi->second]); - } -} - -unsigned long xml_irep_convertt::add_with_childs(const irept &iwi) -{ - unsigned long id=insert((unsigned long)&iwi, iwi); - if(id!=(unsigned long)&iwi) - return id; - - forall_irep(it, iwi.get_sub()) - { - ireps_containert::content_containert::const_iterator fi= - find_irep_by_content(*it); - if(fi==ireps_container.content_container.end()) - { - add_with_childs(*it); - } - } - forall_named_irep(it, iwi.get_named_sub()) - { - ireps_containert::content_containert::const_iterator fi= - find_irep_by_content(it->second); - if(fi==ireps_container.content_container.end()) - { - add_with_childs(it->second); - } - } - forall_named_irep(it, iwi.get_comments()) - { - ireps_containert::content_containert::const_iterator fi= - find_irep_by_content(it->second); - if(fi==ireps_container.content_container.end()) - { - add_with_childs(it->second); - } - } - return id; -} - -/// resolves references to ireps from an irep after reading an irep hash map -/// into memory. -/// \return none -void xml_irep_convertt::resolve_references(const irept &cur) -{ - if(cur.id() == "__REFERENCE__") - { - unsigned long id=string_to_long(cur.get_string("REF")); - ireps_containert::id_containert::const_iterator itr=find_irep_by_id(id); - if(itr==ireps_container.id_container.end()) - { - std::cout << "Warning: can't resolve irep reference (sub " - << cur.get("REF") << ")\n"; - } - else - { - irept &curX=const_cast(cur); - curX=itr->second; - } - } - - forall_irep(iti, cur.get_sub()) - resolve_references(*iti); - - forall_named_irep(iti, cur.get_named_sub()) - resolve_references(iti->second); - - forall_named_irep(iti, cur.get_comments()) - resolve_references(iti->second); -} - -/// converts the hash value to a readable string -/// \par parameters: an irep pointer -/// \return a new string -std::string xml_irep_convertt::long_to_string(const unsigned long l) -{ - std::stringstream s; - s << std::hex << l; - return s.str(); -} - -/// converts the string to an unsigned long that used to give a pointer to an -/// irep in an old compilation -/// \par parameters: a string -/// \return an unsigned long -unsigned long xml_irep_convertt::string_to_long(const std::string &s) -{ - std::stringstream ss(s); - unsigned long res=0; - ss >> std::hex >> res; - return res; -} - -/// finds an irep in the ireps hash set by its id -/// \par parameters: an id -/// \return an iterator into the ireps hash set -xml_irep_convertt::ireps_containert::id_containert::const_iterator - xml_irep_convertt::find_irep_by_id(const unsigned int id) -{ - return ireps_container.id_container.find(id); -} - -/// finds an irep in the ireps hash set by checking contents -/// \par parameters: an irep -/// \return an iterator into the ireps hash set -xml_irep_convertt::ireps_containert::content_containert::const_iterator - xml_irep_convertt::find_irep_by_content(const irept &irep) -{ - return ireps_container.content_container.find(irep); -} - -/// inserts an irep into the hashtable -/// \par parameters: an unsigned long and an irep -/// \return true on success, false otherwise -unsigned long xml_irep_convertt::insert( - unsigned long id, - const irept &i) -{ - ireps_containert::content_containert::const_iterator sit; - sit=find_irep_by_content(i); - if(sit==ireps_container.content_container.end()) - { - ireps_container.content_container.insert( - std::pair(i, id)); - - if(ireps_container.id_container.insert( - std::pair(id, i)).second) - { - ireps_container.id_replace_map[id] = - ireps_container.id_container.size(); - } - - return id; - } - else - { - return sit->second; - } -} - -/// inserts an irep into the hashtable -/// \par parameters: a string and an irep -/// \return true on success, false otherwise -unsigned long xml_irep_convertt::insert( - const std::string &id, - const irept &i) -{ - return insert(string_to_long(id), i); -} - -/// converts the current hash map of ireps into the given xml structure -/// \par parameters: an xml node -/// \return nothing -void xml_irep_convertt::convert_map(xmlt &xml) -{ - ireps_containert::id_containert::iterator hit= - ireps_container.id_container.begin(); - for(; hit!=ireps_container.id_container.end(); hit++) - { - xmlt &xmlhe=xml.new_element("irep"); - xmlhe.set_attribute( - "id", - long_to_string(ireps_container.id_replace_map[hit->first])); - convert(hit->second, xmlhe); - } -} - -/// converts the current hash map of ireps into xml nodes and outputs them to -/// the stream -/// \par parameters: an output stream -/// \return nothing -void xml_irep_convertt::output_map(std::ostream &out, unsigned indent) -{ - ireps_containert::id_containert::iterator hit= - ireps_container.id_container.begin(); - for(; hit!=ireps_container.id_container.end(); hit++) - { - xmlt xmlhe("irep"); - xmlhe.set_attribute( - "id", - long_to_string(ireps_container.id_replace_map[hit->first])); - convert(hit->second, xmlhe); - xmlhe.output(out, indent); - } -} diff --git a/src/goto-cc/xml_binaries/xml_irep_hashing.h b/src/goto-cc/xml_binaries/xml_irep_hashing.h deleted file mode 100644 index 2391580a61b..00000000000 --- a/src/goto-cc/xml_binaries/xml_irep_hashing.h +++ /dev/null @@ -1,116 +0,0 @@ -/*******************************************************************\ - -Module: XML-irep conversions with hashing - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// XML-irep conversions with hashing - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_IREP_HASHING_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_IREP_HASHING_H - -#include -#include - -class xml_irep_convertt -{ -private: - // NOLINTNEXTLINE(readability/identifiers) - struct ul_hash - { - unsigned short operator()(const unsigned long l) const - { - return (l &0xFFFF); - } - }; - - // NOLINTNEXTLINE(readability/identifiers) - struct ul_eq - { - bool operator()(const unsigned long l, const unsigned long r) const - { - return (l==r); - } - }; - - // NOLINTNEXTLINE(readability/identifiers) - struct irep_full_hash - { - size_t operator()(const irept &i) const - { - return i.full_hash(); - } - }; - - // NOLINTNEXTLINE(readability/identifiers) - struct irep_content_eq - { - bool operator()(const irept &l, const irept &r) const - { - return l.full_eq(l, r); - } - }; - -public: - struct ireps_containert - { - typedef std::unordered_map - id_containert; - id_containert id_container; - - typedef std::unordered_map - content_containert; - content_containert content_container; - - typedef std::map id_replace_mapt; - id_replace_mapt id_replace_map; - - void clear() - { - id_container.clear(); - content_container.clear(); - id_replace_map.clear(); - } - }; - - explicit xml_irep_convertt(ireps_containert &ic):ireps_container(ic) - { - }; - - unsigned long insert(unsigned long, const irept&); - unsigned long insert(const std::string&, const irept&); - - void convert(const irept &irep, xmlt &xml); - void convert(const xmlt &xml, irept &irep); - void reference_convert(const irept &irep, xmlt &xml); - void resolve_references(const irept &cur); - - void convert_map(xmlt &xml); - void output_map(std::ostream &out, unsigned indent); - - void clear() - { - ireps_container.clear(); - } - -private: - ireps_containert &ireps_container; - - ireps_containert::id_containert::const_iterator - find_irep_by_id(const unsigned int); - ireps_containert::content_containert::const_iterator - find_irep_by_content(const irept &irep); - - std::string long_to_string(const unsigned long); - unsigned long string_to_long(const std::string &); - - unsigned long add_with_childs(const irept&); -}; - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_IREP_HASHING_H diff --git a/src/goto-cc/xml_binaries/xml_symbol.cpp b/src/goto-cc/xml_binaries/xml_symbol.cpp deleted file mode 100644 index 0fa7acd8069..00000000000 --- a/src/goto-cc/xml_binaries/xml_symbol.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/*******************************************************************\ - -Module: Compile and link source and object files. - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Compile and link source and object files. - -#include "xml_symbol.h" - -#include "xml_irep.h" - -/// converts a symbol to an xml symbol node -/// \par parameters: a symbol and an xml node -/// \return none -void convert(const symbolt &sym, xmlt &root) -{ - xmlt &xmlsym = root.new_element("symbol"); - xmlsym.set_attribute("name", id2string(sym.name)); - - xmlt &xmltype = xmlsym.new_element("type"); - convert(sym.type, xmltype); - - xmlt &xmlval = xmlsym.new_element("value"); - if(!sym.is_type && sym.type.id() == "code" && !sym.value.is_nil()) - xmlval.data = "compiled"; // only for implemented functions - else - convert(sym.value, xmlval); - - xmlt &flags = xmlsym.new_element("flags"); - - flags.set_attribute_bool("lvalue", sym.is_lvalue); - flags.set_attribute_bool("static_lifetime", sym.is_static_lifetime); - flags.set_attribute_bool("file_local", sym.is_file_local); - flags.set_attribute_bool("theorem", sym.is_property); - flags.set_attribute_bool("thread_local", sym.is_thread_local); - flags.set_attribute_bool("type", sym.is_type); - flags.set_attribute_bool("extern", sym.is_extern); - flags.set_attribute_bool("input", sym.is_input); - flags.set_attribute_bool("output", sym.is_output); - flags.set_attribute_bool("macro", sym.is_macro); - // flags.set_attribute_bool("actual", sym.is_actual); - // flags.set_attribute_bool("binding", sym.binding); - // flags.set_attribute_bool("free_var", sym.free_var); - flags.set_attribute_bool("statevar", sym.is_state_var); - - xmlt &mode = flags.new_element("mode"); - mode.data = id2string(sym.mode); - - flags.new_element("base_name").data=id2string(sym.base_name); - flags.new_element("module").data=id2string(sym.module); - - if(!sym.pretty_name.empty()) - flags.new_element("pretty_name").data=id2string(sym.pretty_name); - - xmlt &xmlloc = xmlsym.new_element("location"); - convert(sym.location, xmlloc); - xmlloc.name = "location"; // convert overwrote this -} - -/// converts an xml symbol node to a symbol -/// \par parameters: an xml node and a symbol -/// \return none -void convert(const xmlt &xmlsym, symbolt &symbol) -{ - symbol.name=xmlsym.get_attribute("name"); - - for(xmlt::elementst::const_iterator - it=xmlsym.elements.begin(); - it!=xmlsym.elements.end(); - it++) - { - if(it->name=="type") - { - convert(*it, symbol.type); - } - else if(it->name=="value") - { - if(it->data=="compiled") - { - symbol.value.id("code"); - } - else - { - convert(*it, symbol.value); - } - } - else if(it->name=="flags") - { - symbol.is_lvalue = it->get_attribute_bool("lvalue"); - symbol.is_static_lifetime = it->get_attribute_bool("static_lifetime"); - symbol.is_file_local = it->get_attribute_bool("file_local"); - symbol.is_property = it->get_attribute_bool("theorem"); - symbol.is_thread_local = it->get_attribute_bool("thread_local"); - symbol.is_type = it->get_attribute_bool("type"); - symbol.is_extern = it->get_attribute_bool("extern"); - symbol.is_input = it->get_attribute_bool("input"); - symbol.is_output = it->get_attribute_bool("output"); - symbol.is_macro = it->get_attribute_bool("macro"); - // symbol.is_actual = it->get_attribute_bool("actual"); - // symbol.binding = it->get_attribute_bool("binding"); - // symbol.free_var = it->get_attribute_bool("free_var"); - symbol.is_state_var = it->get_attribute_bool("statevar"); - - for(xmlt::elementst::const_iterator - fit=it->elements.begin(); - fit!=it->elements.end(); - fit++) - { - if(fit->name=="mode") - symbol.mode=fit->data; - else if(fit->name=="base_name") - symbol.base_name=fit->data; - else if(fit->name=="module") - symbol.module=fit->data; - } - } - else if(it->name=="location") - { - convert(*it, symbol.location); - } - } -} diff --git a/src/goto-cc/xml_binaries/xml_symbol.h b/src/goto-cc/xml_binaries/xml_symbol.h deleted file mode 100644 index 0044cf98000..00000000000 --- a/src/goto-cc/xml_binaries/xml_symbol.h +++ /dev/null @@ -1,23 +0,0 @@ -/*******************************************************************\ - -Module: Converts symbols to xml structures and back. - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Converts symbols to xml structures and back. - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_SYMBOL_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_SYMBOL_H - -#include -#include - -void convert(const symbolt &, xmlt &); -void convert(const xmlt &, symbolt &); - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_SYMBOL_H diff --git a/src/goto-cc/xml_binaries/xml_symbol_hashing.cpp b/src/goto-cc/xml_binaries/xml_symbol_hashing.cpp deleted file mode 100644 index e666487df76..00000000000 --- a/src/goto-cc/xml_binaries/xml_symbol_hashing.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/*******************************************************************\ - -Module: XML-symbol conversions with irep hashing - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// XML-symbol conversions with irep hashing - -#include "xml_irep_hashing.h" - -#include "xml_symbol_hashing.h" - -/// converts a symbol to an xml symbol node -/// \par parameters: a symbol and an xml node -/// \return none -void xml_symbol_convertt::convert(const symbolt &sym, xmlt &root) -{ - xmlt &xmlsym = root.new_element("symbol"); - irepcache.push_back(irept()); - sym.to_irep(irepcache.back()); - irepconverter.reference_convert(irepcache.back(), xmlsym); -} - -/// converts an xml symbol node to a symbol -/// \par parameters: an xml node and a symbol -/// \return none -void xml_symbol_convertt::convert(const xmlt &xmlsym, symbolt &symbol) -{ - irept t; - - irepconverter.convert(xmlsym, t); - irepconverter.resolve_references(t); - symbol.from_irep(t); -} diff --git a/src/goto-cc/xml_binaries/xml_symbol_hashing.h b/src/goto-cc/xml_binaries/xml_symbol_hashing.h deleted file mode 100644 index bb5f3e9a060..00000000000 --- a/src/goto-cc/xml_binaries/xml_symbol_hashing.h +++ /dev/null @@ -1,38 +0,0 @@ -/*******************************************************************\ - -Module: XML-symbol conversions with irep hashing - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// XML-symbol conversions with irep hashing - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_SYMBOL_HASHING_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_SYMBOL_HASHING_H - -#include -#include - -#include "xml_irep_hashing.h" - -class xml_symbol_convertt -{ -private: - xml_irep_convertt irepconverter; - std::list irepcache; - -public: - explicit xml_symbol_convertt(xml_irep_convertt::ireps_containert &ic): - irepconverter(ic) - { - } - - void convert(const symbolt &, xmlt &); - void convert(const xmlt &, symbolt &); -}; - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_SYMBOL_HASHING_H diff --git a/src/goto-instrument/accelerate/linearize.cpp b/src/goto-instrument/accelerate/linearize.cpp deleted file mode 100644 index 87c4db589cb..00000000000 --- a/src/goto-instrument/accelerate/linearize.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/*******************************************************************\ - -Module: Loop Acceleration - -Author: Matt Lewis - -\*******************************************************************/ - -/// \file -/// Loop Acceleration - -#include "linearize.h" - -#include - -bool linearize(symex_target_equationt &equation, linear_recurrencet &recurrence) -{ -} diff --git a/src/goto-instrument/accelerate/linearize.h b/src/goto-instrument/accelerate/linearize.h deleted file mode 100644 index 90192ce1dfe..00000000000 --- a/src/goto-instrument/accelerate/linearize.h +++ /dev/null @@ -1,41 +0,0 @@ -/*******************************************************************\ - -Module: Loop Acceleration - -Author: Matt Lewis - -\*******************************************************************/ - -/// \file -/// Loop Acceleration - -#ifndef CPROVER_GOTO_INSTRUMENT_ACCELERATE_LINEARIZE_H -#define CPROVER_GOTO_INSTRUMENT_ACCELERATE_LINEARIZE_H - -#include - -#include -#include - -#include "Eigen/Eigen" - -/* - * The idea here is that a linear_recurrencet describes a linear recurrence in - * the following way: - * - * vars' = matrix * vars; - * - * i.e. the next value of the vars vector is calculated by applying the matrix - * to the current vars vector. - */ -struct linear_recurrencet -{ - Eigen::MatrixXd matrix; - std::vector vars; -}; - -bool linearize( - symex_target_equationt &equation, - linear_recurrencet &recurrence); - -#endif // CPROVER_GOTO_INSTRUMENT_ACCELERATE_LINEARIZE_H diff --git a/src/java_bytecode/java_bytecode_vtable.cpp b/src/java_bytecode/java_bytecode_vtable.cpp deleted file mode 100644 index 68da4c6b494..00000000000 --- a/src/java_bytecode/java_bytecode_vtable.cpp +++ /dev/null @@ -1,449 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -#include "java_bytecode_vtable.h" - -#include -#include - -#include -#include -#include -#include -#include -#include - -const char ID_virtual_name[]="virtual_name"; - -class is_virtual_name_equalt -{ - const irep_idt &virtual_name; -public: - explicit is_virtual_name_equalt(const class_typet::methodt &method): - virtual_name(method.get(ID_virtual_name)) - { - } - - bool operator()(const class_typet::methodt &method) const - { - return virtual_name==method.get(ID_virtual_name); - } -}; - -class is_name_equalt -{ - const irep_idt &name; - -public: - explicit is_name_equalt(const irep_idt &name): - name(name) - { - } - - bool operator()(const class_typet::componentt &component) const - { - return name==component.get_name(); - } -}; - -class java_bytecode_vtable_factoryt -{ - symbol_tablet &symbol_table; - const std::string &module; - const namespacet ns; - -public: - bool has_error; - - java_bytecode_vtable_factoryt( - symbol_tablet &symbol_table, - const std::string &module): - symbol_table(symbol_table), - module(module), - ns(symbol_table), - has_error(false) - { - } - - symbolt &get_vt_type_symbol(const class_typet &class_type) - { - const std::string &class_name(id2string(class_type.get(ID_name))); - return symbol_table.lookup(vtnamest::get_type(class_name)); - } - - void create_vtable_symbol(symbolt &result, const class_typet &class_type) - { - const std::string &class_name=id2string(class_type.get(ID_name)); - const std::string &base_class_name=id2string(class_type.get(ID_base_name)); - const symbolt &type_symbol(get_vt_type_symbol(class_type)); - result.name=vtnamest::get_table(class_name); - result.base_name=vtnamest::get_table_base(base_class_name); - result.pretty_name=result.base_name; - result.mode=type_symbol.mode; - result.module=module; - result.location=type_symbol.location; - result.type=symbol_typet(type_symbol.name); - result.is_lvalue=true; - result.is_state_var=true; - result.is_static_lifetime=true; - } - - bool has_component(const class_typet &vtable_type, const irep_idt &ifc_name) - { - const class_typet::componentst &comps(vtable_type.components()); - const is_name_equalt pred(ifc_name); - return std::find_if(comps.begin(), comps.end(), pred)!=comps.end(); - } - - void add_vtable_entry(struct_exprt &vtable_value, - const class_typet &interface, const class_typet &implementor, - const class_typet::methodt &implementation) - { - const class_typet::methodst &methods(interface.methods()); - const is_virtual_name_equalt pred(implementation); - const class_typet::methodst::const_iterator ifc_method( - std::find_if(methods.begin(), methods.end(), pred)); - assert(methods.end()!=ifc_method); - symbolt &vtable_type_symbol(get_vt_type_symbol(implementor)); - class_typet &vtable_type(to_class_type(vtable_type_symbol.type)); - const irep_idt &ifc_name(ifc_method->get_name()); - if(has_component(vtable_type, ifc_name)) - return; - - struct_typet::componentt entry_component; - entry_component.set_name(ifc_name); - entry_component.set_base_name(ifc_method->get_base_name()); - entry_component.type()=pointer_type(implementation.type()); - vtable_type.components().push_back(entry_component); - - const irep_idt &impl_name(implementation.get_name()); - const symbol_exprt impl_symbol(impl_name, implementation.type()); - const address_of_exprt impl_ref(impl_symbol); - vtable_value.copy_to_operands(impl_ref); - } - - const class_typet &get_class_type(const irept &base) - { - const typet &type(static_cast(base.find(ID_type))); - const symbol_typet &symbol_type(to_symbol_type(type)); - const irep_idt &base_class_name(symbol_type.get_identifier()); - assert(symbol_table.has_symbol(base_class_name)); - const symbolt &base_class_symbol(ns.lookup(base_class_name)); - return to_class_type(base_class_symbol.type); - } - - bool has_method(const irept &base, const class_typet::methodt &method) - { - const typet &type(static_cast(base.find(ID_type))); - const symbol_typet &symbol_type(to_symbol_type(type)); - const irep_idt &base_class_name(symbol_type.get_identifier()); - if(!symbol_table.has_symbol(base_class_name)) - return false; - const symbolt &base_class_symbol(ns.lookup(base_class_name)); - const class_typet &base_class_type(to_class_type(base_class_symbol.type)); - const class_typet::methodst &methods(base_class_type.methods()); - const is_virtual_name_equalt pred(method); - return std::find_if(methods.begin(), methods.end(), pred)!=methods.end(); - } - - void extract_types( - std::vector &result, - const irept::subt &types, - const class_typet::methodt &method) - { - for(irept::subt::const_iterator it=types.begin(); - it!=types.end(); ++it) - { - if(!has_method(*it, method)) - continue; - result.push_back(get_class_type(*it)); - } - } - - bool is_virtual(const class_typet::methodt &method) - { - return method.get_bool(ID_is_virtual) - && !method.get_bool(ID_constructor); - } - - void create_base_vtable_entries( - struct_exprt &vtable_value, - const class_typet &class_type, - const class_typet::methodt &method) - { - if(!is_virtual(method)) - return; - std::vector bases; - extract_types(bases, class_type.bases(), method); - // extract_types(bases, class_type.find(ID_interfaces).get_sub(), method); - for(const std::vector::value_type &b : bases) - add_vtable_entry(vtable_value, b, class_type, method); - } - - void create_vtable_entry(struct_exprt &vtable_value, - const class_typet &class_type, const class_typet::methodt &method) - { - if(!is_virtual(method)) - return; - add_vtable_entry(vtable_value, class_type, class_type, method); - } - - void set_vtable_value(symbolt &vtable_symbol, const class_typet &class_type, - struct_exprt &vtable_value) - { - const std::string &class_name(id2string(class_type.get(ID_name))); - const irep_idt vttype(vtnamest::get_type(class_name)); - vtable_value.type()=symbol_typet(vttype); - vtable_symbol.value=vtable_value; - } - - bool is_class_with_vt(const symbolt &symbol) - { - if(!symbol.is_type || ID_struct!=symbol.type.id()) - return false; - const class_typet &class_type(to_class_type(symbol.type)); - const std::string &class_name(id2string(class_type.get(ID_name))); - return symbol_table.has_symbol(vtnamest::get_type(class_name)); - } - - void operator()(const irep_idt &symbol_name) - { - const symbolt &symbol=symbol_table.lookup(symbol_name); - if(!is_class_with_vt(symbol)) - return; - const class_typet &class_type(to_class_type(symbol.type)); - const std::string &class_name(id2string(symbol_name)); - if(symbol_table.has_symbol(vtnamest::get_table(class_name))) - return; - symbolt vtable_symbol; - create_vtable_symbol(vtable_symbol, class_type); - const class_typet::methodst &methods(class_type.methods()); - struct_exprt vtable_value; - for(const class_typet::methodst::value_type &m : methods) - create_base_vtable_entries(vtable_value, class_type, m); - for(const class_typet::methodst::value_type &m : methods) - create_vtable_entry(vtable_value, class_type, m); - set_vtable_value(vtable_symbol, class_type, vtable_value); - assert(!symbol_table.add(vtable_symbol)); - } -}; - - -/******************************************************************* - - Function: java_bytecode_vtable - - Inputs: - - Outputs: - - Purpose: - -\*******************************************************************/ - -bool java_bytecode_vtable( - symbol_tablet &symbol_table, - const std::string &module) -{ - const symbol_tablet::symbolst &symbols(symbol_table.symbols); - std::vector names; - names.reserve(symbols.size()); - std::transform(symbols.begin(), symbols.end(), std::back_inserter(names), - [](const std::pair &entry) - { return entry.first;}); - java_bytecode_vtable_factoryt factory(symbol_table, module); - std::for_each(names.begin(), names.end(), factory); - return factory.has_error; -} - -static void create_vtable_type( - const irep_idt &vt_name, - symbol_tablet &symbol_table, - const symbolt &class_symbol) -{ - symbolt vt_symb_type; - vt_symb_type.name=vt_name; - vt_symb_type.base_name=vtnamest::get_type_base( - id2string(class_symbol.base_name)); - vt_symb_type.pretty_name=vt_symb_type.base_name; - vt_symb_type.mode=class_symbol.mode; - vt_symb_type.module=class_symbol.module; - vt_symb_type.location=class_symbol.location; - vt_symb_type.type=struct_typet(); - vt_symb_type.type.set(ID_name, vt_symb_type.name); - vt_symb_type.is_type=true; - assert(!symbol_table.add(vt_symb_type)); -} - -#define ID_vtable_pointer "@vtable_pointer" - -static void add_vtable_pointer_member( - const irep_idt &vt_name, - symbolt &class_symbol) -{ - struct_typet::componentt comp; - - comp.type()=pointer_type(symbol_typet(vt_name)); - comp.set_name(ID_vtable_pointer); - comp.set_base_name(ID_vtable_pointer); - comp.set_pretty_name(ID_vtable_pointer); - comp.set("is_vtptr", true); - - struct_typet &class_type=to_struct_type(class_symbol.type); - class_type.components().push_back(comp); -} - -/******************************************************************* - - Function: create_vtable_symbol - - Inputs: - - Outputs: - - Purpose: - -\*******************************************************************/ - -void create_vtable_symbol( - symbol_tablet &symbol_table, - const symbolt &class_symbol) -{ - const irep_idt vttype= - vtnamest::get_type(id2string(class_symbol.name)); - - if(!symbol_table.has_symbol(vttype)) - create_vtable_type(vttype, symbol_table, class_symbol); -} - -/******************************************************************* - - Function: has_vtable_info - - Inputs: - - Outputs: - - Purpose: - -\*******************************************************************/ - -bool has_vtable_info( - const symbol_tablet &symbol_table, - const symbolt &class_symbol) -{ - return - symbol_table.has_symbol(vtnamest::get_type(id2string(class_symbol.name))) && - to_struct_union_type(class_symbol.type).has_component(ID_vtable_pointer); -} - -/******************************************************************* - - Function: create_vtable_pointer - - Inputs: - - Outputs: - - Purpose: - -\*******************************************************************/ - -void create_vtable_pointer(symbolt &class_symbol) -{ - const irep_idt vttype= - vtnamest::get_type(id2string(class_symbol.name)); - - add_vtable_pointer_member(vttype, class_symbol); -} - -/******************************************************************* - - Function: get_virtual_name - - Inputs: - - Outputs: - - Purpose: - -\*******************************************************************/ - -void set_virtual_name(class_typet::methodt &method) -{ - const std::string &name(id2string(method.get(ID_name))); - const std::string::size_type vname_start(name.find_last_of('.') + 1); - std::string virtual_name(name.substr(vname_start)); - method.set(ID_virtual_name, virtual_name); -} - -static exprt get_ref( - const exprt &this_obj, - const symbol_typet &target_type) -{ - const typet &type(this_obj.type()); - const irep_idt &type_id(type.id()); - if(ID_symbol==type_id) - return get_ref(address_of_exprt(this_obj), target_type); - assert(ID_pointer==type_id); - const typecast_exprt cast(this_obj, pointer_type(target_type)); - return dereference_exprt(cast, target_type); -} - -static std::string get_full_class_name(const std::string &name) -{ - const bool has_prefix(name.find("java::")!=std::string::npos); - const std::string::size_type offset= - has_prefix ? std::string("java::").size() : 0; - const std::string::size_type end(name.find_first_of(':', offset)); - const std::string::size_type last_sep(name.rfind('.', end)); - return name.substr(0, last_sep); -} - -/******************************************************************* - - Function: make_vtable_function - - Inputs: - - Outputs: - - Purpose: - -\*******************************************************************/ - -exprt make_vtable_function( - const exprt &func, - const exprt &this_obj) -{ - const irep_idt &func_name(func.get(ID_identifier)); - const std::string class_id(get_full_class_name(id2string(func_name))); - - // TODO: Handle unavailable models! - if(class_id.find("java.")!=std::string::npos) - { - // When translating a single java_bytecode_parse_treet, we don't know - // which classes will eventually be available yet. If we could provide - // access to the class loader here, we know which classes have been - // loaded successfully. For classes which have not been loaded, returning - // "func" is equivalent to an unimplemented function. - return func; - } - - const symbol_typet vtable_type(vtnamest::get_type(class_id)); - const pointer_typet vt_ptr_type=pointer_type(vtable_type); - const symbol_typet target_type(class_id); - const exprt this_ref(get_ref(this_obj, target_type)); - const typet ref_type(this_ref.type()); - const member_exprt vtable_member(this_ref, ID_vtable_pointer, vt_ptr_type); - const dereference_exprt vtable(vtable_member, vtable_type); // TODO: cast? - const pointer_typet func_ptr_type=pointer_type(func.type()); - const member_exprt func_ptr(vtable, func_name, func_ptr_type); - const dereference_exprt virtual_func(func_ptr, func.type()); - return virtual_func; -} diff --git a/src/java_bytecode/java_bytecode_vtable.h b/src/java_bytecode/java_bytecode_vtable.h deleted file mode 100644 index 44a7f35bf1b..00000000000 --- a/src/java_bytecode/java_bytecode_vtable.h +++ /dev/null @@ -1,37 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - - -#ifndef CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_VTABLE_H -#define CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_VTABLE_H - -#include - -void create_vtable_pointer( - class symbolt &class_symbol); - -void create_vtable_symbol( - symbol_tablet &symbol_table, - const class symbolt &class_symbol); - -bool has_vtable_info( - const symbol_tablet &symbol_table, - const symbolt &class_symbol); - -exprt make_vtable_function( - const exprt &function, - const exprt &this_obj); - -void set_virtual_name( - class_typet::methodt &method); - -bool java_bytecode_vtable( - symbol_tablet &symbol_table, - const std::string &module); - -#endif // CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_VTABLE_H diff --git a/src/solvers/Makefile b/src/solvers/Makefile index b7b9c5b43d9..a3e7219db4d 100644 --- a/src/solvers/Makefile +++ b/src/solvers/Makefile @@ -69,6 +69,13 @@ ifneq ($(LINGELING),) CP_CXXFLAGS += -DHAVE_LINGELING endif +ifneq ($(LIMMAT),) + LIMMAT_SRC=sat/satcheck_limmat.cpp + LIMMAT_INCLUDE=-I $(LIMMAT) + LIMMAT_LIB=$(LIMMAT)/liblimmat$(LIBEXT) + CP_CXXFLAGS += -DHAVE_LIMMAT +endif + SRC = $(BOOLEFORCE_SRC) \ $(CHAFF_SRC) \ $(CUDD_SRC) \ @@ -80,6 +87,7 @@ SRC = $(BOOLEFORCE_SRC) \ $(PRECOSAT_SRC) \ $(SMVSAT_SRC) \ $(SQUOLEM2_SRC) \ + $(LIMMAT_SRC) \ cvc/cvc_conv.cpp \ cvc/cvc_dec.cpp \ flattening/arrays.cpp \ @@ -138,6 +146,7 @@ SRC = $(BOOLEFORCE_SRC) \ flattening/pointer_logic.cpp \ floatbv/float_bv.cpp \ floatbv/float_utils.cpp \ + floatbv/float_approximation.cpp \ miniBDD/miniBDD.cpp \ prop/aig.cpp \ prop/aig_prop.cpp \ diff --git a/src/solvers/cvc/cvc_prop.cpp b/src/solvers/cvc/cvc_prop.cpp deleted file mode 100644 index 7a02bd65335..00000000000 --- a/src/solvers/cvc/cvc_prop.cpp +++ /dev/null @@ -1,307 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -#include "cvc_prop.h" - -#include -#include - -explicit cvc_propt::cvc_propt(std::ostream &_out):out(_out) -{ - _no_variables=0; -} - -cvc_propt::~cvc_propt() -{ -} - -void cvc_propt::land(literalt a, literalt b, literalt o) -{ - out << "%% land\n"; - out << "ASSERT (" << cvc_literal(a) << " AND " - << cvc_literal(b) << ") <=> " << cvc_literal(o) - << ";\n\n"; -} - -void cvc_propt::lor(literalt a, literalt b, literalt o) -{ - out << "%% lor\n"; - out << "ASSERT (" << cvc_literal(a) << " OR " - << cvc_literal(b) << ") <=> " << cvc_literal(o) - << ";\n\n"; -} - -void cvc_propt::lxor(literalt a, literalt b, literalt o) -{ - out << "%% lxor\n"; - out << "ASSERT (" << cvc_literal(a) << " XOR " - << cvc_literal(b) << ") <=> " << cvc_literal(o) - << ";\n\n"; -} - -void cvc_propt::lnand(literalt a, literalt b, literalt o) -{ - out << "%% lnand\n"; - out << "ASSERT (NOT (" << cvc_literal(a) << " AND " - << cvc_literal(b) << ")) <=> " << cvc_literal(o) - << ";\n\n"; -} - -void cvc_propt::lnor(literalt a, literalt b, literalt o) -{ - out << "%% lnor\n"; - out << "ASSERT (NOT (" << cvc_literal(a) << " OR " - << cvc_literal(b) << ")) <=> " << cvc_literal(o) - << ";\n\n"; -} - -void cvc_propt::lequal(literalt a, literalt b, literalt o) -{ - out << "%% lequal\n"; - out << "ASSERT (" << cvc_literal(a) << " <=> " - << cvc_literal(b) << ") <=> " << cvc_literal(o) - << ";\n\n"; -} - -void cvc_propt::limplies(literalt a, literalt b, literalt o) -{ - out << "%% limplies\n"; - out << "ASSERT (" << cvc_literal(a) << " => " - << cvc_literal(b) << ") <=> " << cvc_literal(o) - << ";\n\n"; -} - -literalt cvc_propt::land(const bvt &bv) -{ - out << "%% land\n"; - - literalt literal=def_cvc_literal(); - - forall_literals(it, bv) - { - if(it!=bv.begin()) - out << " AND "; - out << cvc_literal(*it); - } - - out << ";\n\n"; - - return literal; -} - -literalt cvc_propt::lor(const bvt &bv) -{ - out << "%% lor\n"; - - literalt literal=def_cvc_literal(); - - forall_literals(it, bv) - { - if(it!=bv.begin()) - out << " OR "; - out << cvc_literal(*it); - } - - out << ";\n\n"; - - return literal; -} - -literalt cvc_propt::lxor(const bvt &bv) -{ - if(bv.empty()) - return const_literal(false); - if(bv.size()==1) - return bv[0]; - if(bv.size()==2) - return lxor(bv[0], bv[1]); - - literalt literal=const_literal(false); - - forall_literals(it, bv) - literal=lxor(*it, literal); - - return literal; -} - -literalt cvc_propt::land(literalt a, literalt b) -{ - if(a==const_literal(true)) - return b; - if(b==const_literal(true)) - return a; - if(a==const_literal(false)) - return const_literal(false); - if(b==const_literal(false)) - return const_literal(false); - if(a==b) - return a; - - out << "%% land\n"; - - literalt o=def_cvc_literal(); - - out << cvc_literal(a) << " AND " << cvc_literal(b) << ";\n\n"; - - return o; -} - -literalt cvc_propt::lor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return const_literal(true); - if(b==const_literal(true)) - return const_literal(true); - if(a==b) - return a; - - out << "%% lor\n"; - - literalt o=def_cvc_literal(); - - out << cvc_literal(a) << " OR " << cvc_literal(b) << ";\n\n"; - - return o; -} - -literalt cvc_propt::lxor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return !b; - if(b==const_literal(true)) - return !a; - - out << "%% lxor\n"; - - literalt o=def_cvc_literal(); - - out << cvc_literal(a) << " XOR " << cvc_literal(b) << ";\n\n"; - - return o; -} - -literalt cvc_propt::lnand(literalt a, literalt b) -{ - return !land(a, b); -} - -literalt cvc_propt::lnor(literalt a, literalt b) -{ - return !lor(a, b); -} - -literalt cvc_propt::lequal(literalt a, literalt b) -{ - return !lxor(a, b); -} - -literalt cvc_propt::limplies(literalt a, literalt b) -{ - return lor(!a, b); -} - -literalt cvc_propt::lselect(literalt a, literalt b, literalt c) -{ - if(a==const_literal(true)) - return b; - if(a==const_literal(false)) - return c; - if(b==c) - return b; - - out << "%% lselect\n"; - - literalt o=def_cvc_literal(); - - out << "IF " << cvc_literal(a) << " THEN " - << cvc_literal(b) << " ELSE " - << cvc_literal(c) << " ENDIF;\n\n"; - - return o; -} - -literalt cvc_propt::new_variable() -{ - out << "l" << _no_variables << ": BOOLEAN;\n"; - literalt l; - l.set(_no_variables, false); - _no_variables++; - return l; -} - -literalt cvc_propt::def_cvc_literal() -{ - out << "l" << _no_variables << ": BOOLEAN = "; - literalt l; - l.set(_no_variables, false); - _no_variables++; - return l; -} - -void cvc_propt::lcnf(const bvt &bv) -{ - if(bv.empty()) - return; - bvt new_bv; - - std::set s; - - new_bv.reserve(bv.size()); - - for(bvt::const_iterator it=bv.begin(); it!=bv.end(); it++) - { - if(s.insert(*it).second) - new_bv.push_back(*it); - - if(s.find(!*it)!=s.end()) - return; // clause satisfied - - assert(it->var_no()<_no_variables); - } - - assert(!new_bv.empty()); - - out << "%% lcnf\n"; - out << "ASSERT "; - - for(bvt::const_iterator it=new_bv.begin(); it!=new_bv.end(); it++) - { - if(it!=new_bv.begin()) - out << " OR "; - out << cvc_literal(*it); - } - - out << ";\n\n"; -} - -std::string cvc_propt::cvc_literal(literalt l) -{ - if(l==const_literal(false)) - return "FALSE"; - else if(l==const_literal(true)) - return "TRUE"; - - if(l.sign()) - return "(NOT l"+std::to_string(l.var_no())+")"; - - return "l"+std::to_string(l.var_no()); -} - -propt::resultt cvc_propt::prop_solve() -{ - out << "QUERY FALSE;\n"; - return P_ERROR; -} diff --git a/src/solvers/cvc/cvc_prop.h b/src/solvers/cvc/cvc_prop.h deleted file mode 100644 index 82786e0a2bb..00000000000 --- a/src/solvers/cvc/cvc_prop.h +++ /dev/null @@ -1,88 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - - -#ifndef CPROVER_SOLVERS_CVC_CVC_PROP_H -#define CPROVER_SOLVERS_CVC_CVC_PROP_H - -#include - -#include - -#include - -class cvc_propt:virtual public propt -{ -public: - explicit cvc_propt(std::ostream &_out); - virtual ~cvc_propt(); - - virtual void land(literalt a, literalt b, literalt o); - virtual void lor(literalt a, literalt b, literalt o); - virtual void lxor(literalt a, literalt b, literalt o); - virtual void lnand(literalt a, literalt b, literalt o); - virtual void lnor(literalt a, literalt b, literalt o); - virtual void lequal(literalt a, literalt b, literalt o); - virtual void limplies(literalt a, literalt b, literalt o); - - virtual literalt land(literalt a, literalt b); - virtual literalt lor(literalt a, literalt b); - virtual literalt land(const bvt &bv); - virtual literalt lor(const bvt &bv); - virtual literalt lxor(const bvt &bv); - virtual literalt lxor(literalt a, literalt b); - virtual literalt lnand(literalt a, literalt b); - virtual literalt lnor(literalt a, literalt b); - virtual literalt lequal(literalt a, literalt b); - virtual literalt limplies(literalt a, literalt b); - virtual literalt lselect(literalt a, literalt b, literalt c); // a?b:c - virtual literalt new_variable(); - virtual size_t no_variables() const { return _no_variables; } - virtual void set_no_variables(size_t no) { assert(false); } - - virtual void lcnf(const bvt &bv); - - virtual const std::string solver_text() - { return "CVC"; } - - virtual tvt l_get(literalt literal) const - { - unsigned v=literal.var_no(); - if(v>=assignment.size()) - return tvt(tvt::tv_enumt::TV_UNKNOWN); - tvt r=assignment[v]; - return literal.sign()?!r:r; - } - - virtual propt::resultt prop_solve(); - - friend class cvc_convt; - friend class cvc_dect; - - virtual void clear() - { - assignment.clear(); - } - - void reset_assignment() - { - assignment.clear(); - assignment.resize(no_variables(), tvt(tvt::tv_enumt::TV_UNKNOWN)); - } - -protected: - unsigned _no_variables; - std::ostream &out; - - std::string cvc_literal(literalt l); - literalt def_cvc_literal(); - - std::vector assignment; -}; - -#endif // CPROVER_SOLVERS_CVC_CVC_PROP_H diff --git a/src/solvers/dplib/dplib_conv.cpp b/src/solvers/dplib/dplib_conv.cpp deleted file mode 100644 index a87cd0c25a2..00000000000 --- a/src/solvers/dplib/dplib_conv.cpp +++ /dev/null @@ -1,1170 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -#include "dplib_conv.h" - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -std::string dplib_convt::bin_zero(unsigned bits) -{ - assert(bits!=0); - std::string result="0bin"; - while(bits!=0) { result+='0'; bits--; } - return result; -} - -std::string dplib_convt::dplib_pointer_type() -{ - assert(config.ansi_c.pointer_width!=0); - return "[# object: INT, offset: BITVECTOR("+ - std::to_string(config.ansi_c.pointer_width)+") #]"; -} - -std::string dplib_convt::array_index_type() -{ - return std::string("SIGNED [")+std::to_string(32)+"]"; -} - -typet dplib_convt::gen_array_index_type() -{ - typet t(ID_signedbv); - t.set(ID_width, 32); - return t; -} - -std::string dplib_convt::array_index(unsigned i) -{ - return "0bin"+integer2binary(i, config.ansi_c.int_width); -} - -void dplib_convt::convert_array_index(const exprt &expr) -{ - if(expr.type()==gen_array_index_type()) - { - convert_dplib_expr(expr); - } - else - { - exprt tmp(ID_typecast, gen_array_index_type()); - tmp.copy_to_operands(expr); - convert_dplib_expr(tmp); - } -} - -void dplib_convt::convert_address_of_rec(const exprt &expr) -{ - if(expr.id()==ID_symbol || - expr.id()==ID_constant || - expr.id()==ID_string_constant) - { - dplib_prop.out - << "(# object:=" - << pointer_logic.add_object(expr) - << ", offset:=" - << bin_zero(config.ansi_c.pointer_width) << " #)"; - } - else if(expr.id()==ID_index) - { - if(expr.operands().size()!=2) - throw "index takes two operands"; - - const exprt &array=expr.op0(); - const exprt &index=expr.op1(); - - if(index.is_zero()) - { - if(array.type().id()==ID_pointer) - convert_dplib_expr(array); - else if(array.type().id()==ID_array) - convert_address_of_rec(array); - else - assert(false); - } - else - { - dplib_prop.out << "(LET P: "; - dplib_prop.out << dplib_pointer_type(); - dplib_prop.out << " = "; - - if(array.type().id()==ID_pointer) - convert_dplib_expr(array); - else if(array.type().id()==ID_array) - convert_address_of_rec(array); - else - assert(false); - - dplib_prop.out << " IN P WITH .offset:=BVPLUS(" - << config.ansi_c.pointer_width - << ", P.offset, "; - convert_dplib_expr(index); - dplib_prop.out << "))"; - } - } - else if(expr.id()==ID_member) - { - if(expr.operands().size()!=1) - throw "member takes one operand"; - - const exprt &struct_op=expr.op0(); - - dplib_prop.out << "(LET P: "; - dplib_prop.out << dplib_pointer_type(); - dplib_prop.out << " = "; - - convert_address_of_rec(struct_op); - - const irep_idt &component_name= - to_member_expr(expr).get_component_name(); - - mp_integer offset=member_offset(ns, - to_struct_type(struct_op.type()), component_name); - assert(offset>=0); - - typet index_type(ID_unsignedbv); - index_type.set(ID_width, config.ansi_c.pointer_width); - - exprt index=from_integer(offset, index_type); - - dplib_prop.out << " IN P WITH .offset:=BVPLUS(" - << config.ansi_c.pointer_width - << ", P.offset, "; - convert_dplib_expr(index); - dplib_prop.out << "))"; - } - else - throw "don't know how to take address of: "+expr.id_string(); -} - -literalt dplib_convt::convert_rest(const exprt &expr) -{ - // dplib_prop.out << "%% E: " << expr << '\n'; - - literalt l=prop.new_variable(); - - find_symbols(expr); - - if(expr.id()==ID_equal || expr.id()==ID_notequal) - { - assert(expr.operands().size()==2); - - dplib_prop.out << "ASSERT " << dplib_prop.dplib_literal(l) << " <=> ("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ((expr.id()==ID_equal)?"=":"/="); - convert_dplib_expr(expr.op1()); - dplib_prop.out << ");\n"; - } - - return l; -} - -void dplib_convt::convert_identifier(const std::string &identifier) -{ - for(std::string::const_iterator - it=identifier.begin(); - it!=identifier.end(); - it++) - { - char ch=*it; - - if(isalnum(ch) || ch=='$' || ch=='?') - dplib_prop.out << ch; - else if(ch==':') - { - std::string::const_iterator next_it(it); - next_it++; - if(next_it!=identifier.end() && *next_it==':') - { - dplib_prop.out << "__"; - it=next_it; - } - else - { - dplib_prop.out << '_'; - dplib_prop.out << int(ch); - dplib_prop.out << '_'; - } - } - else - { - dplib_prop.out << '_'; - dplib_prop.out << int(ch); - dplib_prop.out << '_'; - } - } -} - -void dplib_convt::convert_as_bv(const exprt &expr) -{ - if(expr.type().id()==ID_bool) - { - dplib_prop.out << "IF "; - convert_dplib_expr(expr); - dplib_prop.out << " THEN 0bin1 ELSE 0bin0 ENDIF"; - } - else - convert_dplib_expr(expr); -} - -void dplib_convt::convert_array_value(const exprt &expr) -{ - convert_as_bv(expr); -} - -void dplib_convt::convert_dplib_expr(const exprt &expr) -{ - if(expr.id()==ID_symbol) - { - convert_identifier(expr.get_string(ID_identifier)); - } - else if(expr.id()==ID_nondet_symbol) - { - convert_identifier("nondet$"+expr.get_string(ID_identifier)); - } - else if(expr.id()==ID_typecast) - { - assert(expr.operands().size()==1); - const exprt &op=expr.op0(); - - if(expr.type().id()==ID_bool) - { - if(op.type().id()==ID_signedbv || - op.type().id()==ID_unsignedbv || - op.type().id()==ID_pointer) - { - convert_dplib_expr(op); - dplib_prop.out << "/="; - convert_dplib_expr(from_integer(0, op.type())); - } - else - { - // NOLINTNEXTLINE(readability/throw) - throw "TODO typecast1 "+op.type().id_string()+" -> bool"; - } - } - else if(expr.type().id()==ID_signedbv || - expr.type().id()==ID_unsignedbv) - { - unsigned to_width= - unsafe_string2unsigned(id2string(expr.type().get(ID_width))); - - if(op.type().id()==ID_signedbv) - { - unsigned from_width= - unsafe_string2unsigned(id2string(op.type().get(ID_width))); - - if(from_width==to_width) - convert_dplib_expr(op); - else if(from_width1) - { - dplib_prop.out << "(0bin"; - - for(unsigned i=1; i "+expr.type().id_string(); - } - } - else if(expr.type().id()==ID_pointer) - { - if(op.type().id()==ID_pointer) - { - convert_dplib_expr(op); - } - else - // NOLINTNEXTLINE(readability/throw) - throw "TODO typecast3 "+op.type().id_string()+" -> pointer"; - } - else - // NOLINTNEXTLINE(readability/throw) - throw "TODO typecast4 ? -> "+expr.type().id_string(); - } - else if(expr.id()==ID_struct) - { - dplib_prop.out << "(# "; - - const struct_typet &struct_type=to_struct_type(expr.type()); - - const struct_typet::componentst &components= - struct_type.components(); - - assert(components.size()==expr.operands().size()); - - unsigned i=0; - for(struct_typet::componentst::const_iterator - it=components.begin(); - it!=components.end(); - it++, i++) - { - if(i!=0) - dplib_prop.out << ", "; - dplib_prop.out << it->get(ID_name); - dplib_prop.out << ":="; - convert_dplib_expr(expr.operands()[i]); - } - - dplib_prop.out << " #)"; - } - else if(expr.id()==ID_constant) - { - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv || - expr.type().id()==ID_bv) - { - dplib_prop.out << "0bin" << expr.get(ID_value); - } - else if(expr.type().id()==ID_pointer) - { - const irep_idt &value=expr.get(ID_value); - - if(value=="NULL") - { - dplib_prop.out << "(# object:=" - << pointer_logic.get_null_object() - << ", offset:=" - << bin_zero(config.ansi_c.pointer_width) << " #)"; - } - else - throw "unknown pointer constant: "+id2string(value); - } - else if(expr.type().id()==ID_bool) - { - if(expr.is_true()) - dplib_prop.out << "TRUE"; - else if(expr.is_false()) - dplib_prop.out << "FALSE"; - else - throw "unknown boolean constant"; - } - else if(expr.type().id()==ID_array) - { - dplib_prop.out << "ARRAY (i: " << array_index_type() << "):"; - - assert(!expr.operands().empty()); - - unsigned i=0; - forall_operands(it, expr) - { - if(i==0) - dplib_prop.out << "\n IF "; - else - dplib_prop.out << "\n ELSIF "; - - dplib_prop.out << "i=" << array_index(i) << " THEN "; - convert_array_value(*it); - i++; - } - - dplib_prop.out << "\n ELSE "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << "\n ENDIF"; - } - else if(expr.type().id()==ID_integer || - expr.type().id()==ID_natural || - expr.type().id()==ID_range) - { - dplib_prop.out << expr.get(ID_value); - } - else - throw "unknown constant: "+expr.type().id_string(); - } - else if(expr.id()==ID_concatenation || - expr.id()==ID_bitand || - expr.id()==ID_bitor) - { - dplib_prop.out << "("; - - forall_operands(it, expr) - { - if(it!=expr.operands().begin()) - { - if(expr.id()==ID_concatenation) - dplib_prop.out << " @ "; - else if(expr.id()==ID_bitand) - dplib_prop.out << " & "; - else if(expr.id()==ID_bitor) - dplib_prop.out << " | "; - } - - convert_as_bv(*it); - } - - dplib_prop.out << ")"; - } - else if(expr.id()==ID_bitxor) - { - assert(!expr.operands().empty()); - - if(expr.operands().size()==1) - { - convert_dplib_expr(expr.op0()); - } - else if(expr.operands().size()==2) - { - dplib_prop.out << "BVXOR("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - { - assert(expr.operands().size()>=3); - - exprt tmp(expr); - tmp.operands().resize(tmp.operands().size()-1); - - dplib_prop.out << "BVXOR("; - convert_dplib_expr(tmp); - dplib_prop.out << ", "; - convert_dplib_expr(expr.operands().back()); - dplib_prop.out << ")"; - } - } - else if(expr.id()==ID_bitnand) - { - assert(expr.operands().size()==2); - - dplib_prop.out << "BVNAND("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else if(expr.id()==ID_bitnot) - { - assert(expr.operands().size()==1); - dplib_prop.out << "~("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ")"; - } - else if(expr.id()==ID_unary_minus) - { - assert(expr.operands().size()==1); - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - dplib_prop.out << "BVUMINUS("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ")"; - } - else - throw "unsupported type for unary-: "+expr.type().id_string(); - } - else if(expr.id()==ID_if) - { - assert(expr.operands().size()==3); - dplib_prop.out << "IF "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << " THEN "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << " ELSE "; - convert_dplib_expr(expr.op2()); - dplib_prop.out << " ENDIF"; - } - else if(expr.id()==ID_and || - expr.id()==ID_or || - expr.id()==ID_xor) - { - assert(expr.type().id()==ID_bool); - - if(expr.operands().size()>=2) - { - forall_operands(it, expr) - { - if(it!=expr.operands().begin()) - { - if(expr.id()==ID_and) - dplib_prop.out << " AND "; - else if(expr.id()==ID_or) - dplib_prop.out << " OR "; - else if(expr.id()==ID_xor) - dplib_prop.out << " XOR "; - } - - dplib_prop.out << "("; - convert_dplib_expr(*it); - dplib_prop.out << ")"; - } - } - else if(expr.operands().size()==1) - { - convert_dplib_expr(expr.op0()); - } - else - assert(false); - } - else if(expr.id()==ID_not) - { - assert(expr.operands().size()==1); - dplib_prop.out << "NOT ("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ")"; - } - else if(expr.id()==ID_equal || - expr.id()==ID_notequal) - { - assert(expr.operands().size()==2); - assert(expr.op0().type()==expr.op1().type()); - - if(expr.op0().type().id()==ID_bool) - { - if(expr.id()==ID_notequal) - dplib_prop.out << "NOT ("; - dplib_prop.out << "("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ") <=> ("; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - if(expr.id()==ID_notequal) - dplib_prop.out << ")"; - } - else - { - dplib_prop.out << "("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ")"; - dplib_prop.out << (expr.id()==ID_equal?"=":"/="); - dplib_prop.out << "("; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - } - else if(expr.id()==ID_le || - expr.id()==ID_lt || - expr.id()==ID_ge || - expr.id()==ID_gt) - { - assert(expr.operands().size()==2); - - const typet &op_type=expr.op0().type(); - - if(op_type.id()==ID_unsignedbv) - { - if(expr.id()==ID_le) - dplib_prop.out << "BVLE"; - else if(expr.id()==ID_lt) - dplib_prop.out << "BVLT"; - else if(expr.id()==ID_ge) - dplib_prop.out << "BVGE"; - else if(expr.id()==ID_gt) - dplib_prop.out << "BVGT"; - - dplib_prop.out << "("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else if(op_type.id()==ID_signedbv) - { - if(expr.id()==ID_le) - dplib_prop.out << "SBVLE"; - else if(expr.id()==ID_lt) - dplib_prop.out << "SBVLT"; - else if(expr.id()==ID_ge) - dplib_prop.out << "SBVGE"; - else if(expr.id()==ID_gt) - dplib_prop.out << "SBVGT"; - - dplib_prop.out << "("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - throw - "unsupported type for "+expr.id_string()+": "+expr.type().id_string(); - } - else if(expr.id()==ID_plus) - { - if(expr.operands().size()>=2) - { - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - dplib_prop.out << "BVPLUS(" << expr.type().get(ID_width); - - forall_operands(it, expr) - { - dplib_prop.out << ", "; - convert_dplib_expr(*it); - } - - dplib_prop.out << ")"; - } - else if(expr.type().id()==ID_pointer) - { - if(expr.operands().size()!=2) - throw "pointer arithmetic with more than two operands"; - - const exprt *p, *i; - - if(expr.op0().type().id()==ID_pointer) - { - p=&expr.op0(); - i=&expr.op1(); - } - else if(expr.op1().type().id()==ID_pointer) - { - p=&expr.op1(); - i=&expr.op0(); - } - else - throw "unexpected mixture in pointer arithmetic"; - - dplib_prop.out << "(LET P: " << dplib_pointer_type() << " = "; - convert_dplib_expr(*p); - dplib_prop.out << " IN P WITH .offset:=BVPLUS(" - << config.ansi_c.pointer_width - << ", P.offset, "; - convert_dplib_expr(*i); - dplib_prop.out << "))"; - } - else - throw "unsupported type for +: "+expr.type().id_string(); - } - else if(expr.operands().size()==1) - { - convert_dplib_expr(expr.op0()); - } - else - assert(false); - } - else if(expr.id()==ID_minus) - { - if(expr.operands().size()==2) - { - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - dplib_prop.out << "BVSUB(" << expr.type().get(ID_width) << ", "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - throw "unsupported type for -: "+expr.type().id_string(); - } - else if(expr.operands().size()==1) - { - convert_dplib_expr(expr.op0()); - } - else - assert(false); - } - else if(expr.id()==ID_div) - { - assert(expr.operands().size()==2); - - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - if(expr.type().id()==ID_unsignedbv) - dplib_prop.out << "BVDIV"; - else - dplib_prop.out << "SBVDIV"; - - dplib_prop.out << "(" << expr.type().get(ID_width) << ", "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - throw "unsupported type for /: "+expr.type().id_string(); - } - else if(expr.id()==ID_mod) - { - assert(expr.operands().size()==2); - - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - if(expr.type().id()==ID_unsignedbv) - dplib_prop.out << "BVMOD"; - else - dplib_prop.out << "SBVMOD"; - - dplib_prop.out << "(" << expr.type().get(ID_width) << ", "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - throw "unsupported type for mod: "+expr.type().id_string(); - } - else if(expr.id()==ID_mult) - { - if(expr.operands().size()==2) - { - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - dplib_prop.out << "BVMULT(" << expr.type().get(ID_width) << ", "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - throw "unsupported type for *: "+expr.type().id_string(); - } - else if(expr.operands().size()==1) - { - convert_dplib_expr(expr.op0()); - } - else - assert(false); - } - else if(expr.id()==ID_address_of || - expr.id()=="reference_to") - { - assert(expr.operands().size()==1); - assert(expr.type().id()==ID_pointer); - convert_address_of_rec(expr.op0()); - } - else if(expr.id()==ID_array_of) - { - assert(expr.type().id()==ID_array); - assert(expr.operands().size()==1); - dplib_prop.out << "(ARRAY (i: " << array_index_type() << "): "; - convert_array_value(expr.op0()); - dplib_prop.out << ")"; - } - else if(expr.id()==ID_index) - { - assert(expr.operands().size()==2); - dplib_prop.out << "("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ")["; - convert_array_index(expr.op1()); - dplib_prop.out << "]"; - } - else if(expr.id()==ID_ashr || - expr.id()==ID_lshr || - expr.id()==ID_shl) - { - assert(expr.operands().size()==2); - - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - if(expr.id()==ID_ashr) - dplib_prop.out << "BVASHR"; - else if(expr.id()==ID_lshr) - dplib_prop.out << "BVLSHR"; - else if(expr.id()==ID_shl) - dplib_prop.out << "BVSHL"; - else - assert(false); - - dplib_prop.out << "(" << expr.type().get(ID_width) << ", "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - throw - "unsupported type for "+expr.id_string()+": "+expr.type().id_string(); - } - else if(expr.id()==ID_with) - { - assert(expr.operands().size()>=1); - dplib_prop.out << "("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ")"; - - for(unsigned i=1; i s_set; - - ::find_symbols(expr.op1(), s_set); - - if(s_set.find(identifier)==s_set.end()) - { - id.type=expr.op0().type(); - - find_symbols(expr.op1()); - - convert_identifier(id2string(identifier)); - dplib_prop.out << ": "; - convert_dplib_type(expr.op0().type()); - dplib_prop.out << " = "; - convert_dplib_expr(expr.op1()); - - dplib_prop.out << ";\n\n"; - return; - } - } - } - } - - find_symbols(expr); - - dplib_prop.out << "AXIOM "; - - if(!value) - dplib_prop.out << "! ("; - - convert_dplib_expr(expr); - - if(!value) - dplib_prop.out << ")"; - - dplib_prop.out << ";\n\n"; -} - -void dplib_convt::find_symbols(const exprt &expr) -{ - find_symbols(expr.type()); - - forall_operands(it, expr) - find_symbols(*it); - - if(expr.id()==ID_symbol) - { - if(expr.type().id()==ID_code) - return; - - const irep_idt &identifier=expr.get(ID_identifier); - - identifiert &id=identifier_map[identifier]; - - if(id.type.is_nil()) - { - id.type=expr.type(); - - convert_identifier(id2string(identifier)); - dplib_prop.out << ": "; - convert_dplib_type(expr.type()); - dplib_prop.out << ";\n"; - } - } - else if(expr.id()==ID_nondet_symbol) - { - if(expr.type().id()==ID_code) - return; - - const irep_idt identifier="nondet$"+expr.get_string(ID_identifier); - - identifiert &id=identifier_map[identifier]; - - if(id.type.is_nil()) - { - id.type=expr.type(); - - convert_identifier(id2string(identifier)); - dplib_prop.out << ": "; - convert_dplib_type(expr.type()); - dplib_prop.out << ";\n"; - } - } -} - -void dplib_convt::convert_dplib_type(const typet &type) -{ - if(type.id()==ID_array) - { - const array_typet &array_type=to_array_type(type); - - dplib_prop.out << "ARRAY " << array_index_type() - << " OF "; - - if(array_type.subtype().id()==ID_bool) - dplib_prop.out << "BITVECTOR(1)"; - else - convert_dplib_type(array_type.subtype()); - } - else if(type.id()==ID_bool) - { - dplib_prop.out << "boolean"; - } - else if(type.id()==ID_struct || - type.id()==ID_union) - { - const struct_typet &struct_type=to_struct_type(type); - - dplib_prop.out << "[#"; - - const struct_typet::componentst &components= - struct_type.components(); - - for(struct_typet::componentst::const_iterator - it=components.begin(); - it!=components.end(); - it++) - { - if(it!=components.begin()) - dplib_prop.out << ","; - dplib_prop.out << " "; - dplib_prop.out << it->get(ID_name); - dplib_prop.out << ": "; - convert_dplib_type(it->type()); - } - - dplib_prop.out << " #]"; - } - else if(type.id()==ID_pointer || - type.id()==ID_reference) - { - dplib_prop.out << dplib_pointer_type(); - } - else if(type.id()==ID_integer) - { - dplib_prop.out << "int"; - } - else if(type.id()==ID_signedbv) - { - unsigned width=to_signedbv_type(type).get_width(); - - if(width==0) - throw "zero-width vector type: "+type.id_string(); - - dplib_prop.out << "signed[" << width << "]"; - } - else if(type.id()==ID_unsignedbv) - { - unsigned width=to_unsignedbv_type(type).get_width(); - - if(width==0) - throw "zero-width vector type: "+type.id_string(); - - dplib_prop.out << "unsigned[" << width << "]"; - } - else if(type.id()==ID_bv) - { - unsigned width=to_bv_type(type).get_width(); - - if(width==0) - throw "zero-width vector type: "+type.id_string(); - - dplib_prop.out << "bv[" << width << "]"; - } - else - throw "unsupported type: "+type.id_string(); -} - -void dplib_convt::find_symbols(const typet &type) -{ - if(type.id()==ID_array) - { - const array_typet &array_type=to_array_type(type); - find_symbols(array_type.size()); - } - else if(type.id()==ID_struct || - type.id()==ID_union) - { - } -} diff --git a/src/solvers/dplib/dplib_conv.h b/src/solvers/dplib/dplib_conv.h deleted file mode 100644 index 74034d6c1e2..00000000000 --- a/src/solvers/dplib/dplib_conv.h +++ /dev/null @@ -1,73 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - - -#ifndef CPROVER_SOLVERS_DPLIB_DPLIB_CONV_H -#define CPROVER_SOLVERS_DPLIB_DPLIB_CONV_H - - -#include -#include - -#include "dplib_prop.h" - -class dplib_convt:public prop_convt -{ -public: - dplib_convt( - const namespacet &_ns, - std::ostream &_out): - prop_convt(_ns), - out(_out), - pointer_logic(_ns) { } - - virtual ~dplib_convt() { } - -protected: - std::ostream &out; - - virtual literalt convert_rest(const exprt &expr); - virtual void convert_dplib_expr(const exprt &expr); - virtual void convert_dplib_type(const typet &type); - virtual void set_to(const exprt &expr, bool value); - virtual void convert_address_of_rec(const exprt &expr); - - pointer_logict pointer_logic; - -private: - void convert_identifier(const std::string &identifier); - void find_symbols(const exprt &expr); - void find_symbols(const typet &type); - void convert_array_value(const exprt &expr); - void convert_as_bv(const exprt &expr); - void convert_array_index(const exprt &expr); - static typet gen_array_index_type(); - static std::string bin_zero(unsigned bits); - static std::string array_index_type(); - static std::string array_index(unsigned i); - static std::string dplib_pointer_type(); - - struct identifiert - { - typet type; - exprt value; - - identifiert() - { - type.make_nil(); - value.make_nil(); - } - }; - - typedef std::unordered_map - identifier_mapt; - - identifier_mapt identifier_map; -}; - -#endif // CPROVER_SOLVERS_DPLIB_DPLIB_CONV_H diff --git a/src/solvers/dplib/dplib_dec.cpp b/src/solvers/dplib/dplib_dec.cpp deleted file mode 100644 index 111805276ba..00000000000 --- a/src/solvers/dplib/dplib_dec.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -#include "dplib_dec.h" - -#include -#include - -#if defined(__linux__) || \ - defined(__FreeBSD_kernel__) || \ - defined(__GNU__) || \ - defined(__unix__) || \ - defined(__CYGWIN__) || \ - defined(__MACH__) -#include -#endif - -#ifdef _WIN32 -#include -#define getpid _getpid -#endif - -#include -#include - -dplib_temp_filet::dplib_temp_filet() -{ - temp_out_filename="dplib_dec_out_"+std::to_string(getpid())+".tmp"; - - temp_out.open( - temp_out_filename.c_str(), - std::ios_base::out | std::ios_base::trunc); -} - -dplib_temp_filet::~dplib_temp_filet() -{ - temp_out.close(); - - if(temp_out_filename!="") - unlink(temp_out_filename.c_str()); - - if(temp_result_filename!="") - unlink(temp_result_filename.c_str()); -} - -decision_proceduret::resultt dplib_dect::dec_solve() -{ - dplib_prop.out << "QUERY FALSE;\n"; - dplib_prop.out << "COUNTERMODEL;\n"; - - post_process(); - - temp_out.close(); - - temp_result_filename= - "dplib_dec_result_"+std::to_string(getpid())+".tmp"; - - std::string command= - "dplibl "+temp_out_filename+" > "+temp_result_filename+" 2>&1"; - - int res=system(command.c_str()); - assert(0 == res); - - status("Reading result from CVCL"); - - return read_dplib_result(); -} - -void dplib_dect::read_assert(std::istream &in, std::string &line) -{ - // strip ASSERT - line=std::string(line, strlen("ASSERT "), std::string::npos); - if(line=="") - return; - - // bit-vector - if(line[0]=='(') - { - // get identifier - std::string::size_type pos= - line.find(' '); - - std::string identifier=std::string(line, 1, pos-1); - - // get value - if(!std::getline(in, line)) - return; - - // skip spaces - pos=0; - while(pos" << identifier << "< = >" << value << "<\n"; - #endif - } - else - { - // boolean - tvt value=tvt(true); - - if(has_prefix(line, "NOT ")) - { - line=std::string(line, strlen("NOT "), std::string::npos); - value=tvt(false); - } - - if(line=="") - return; - - if(line[0]=='l') - { - unsigned number=unsafe_str2unsigned(line.c_str()+1); - assert(number - -#include "dplib_conv.h" - -class dplib_temp_filet -{ -public: - dplib_temp_filet(); - ~dplib_temp_filet(); - -protected: - std::ofstream temp_out; - std::string temp_out_filename, temp_result_filename; -}; - -class dplib_dect:protected dplib_temp_filet, public dplib_convt -{ -public: - explicit dplib_dect(const namespacet &_ns): - dplib_convt(_ns, temp_out) - { - } - - virtual resultt dec_solve(); - -protected: - resultt read_dplib_result(); - void read_assert(std::istream &in, std::string &line); -}; - -#endif // CPROVER_SOLVERS_DPLIB_DPLIB_DEC_H diff --git a/src/solvers/dplib/dplib_prop.cpp b/src/solvers/dplib/dplib_prop.cpp deleted file mode 100644 index a0111b3b8fc..00000000000 --- a/src/solvers/dplib/dplib_prop.cpp +++ /dev/null @@ -1,305 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -#include "dplib_prop.h" - -#include - -#include - -dplib_propt::dplib_propt(std::ostream &_out):out(_out) -{ - // we skip index 0 - _no_variables=1; -} - -void dplib_propt::land(literalt a, literalt b, literalt o) -{ - out << "// land\n"; - out << "AXIOM (" << dplib_literal(a) << " & " - << dplib_literal(b) << ") <=> " << dplib_literal(o) - << ";\n\n"; -} - -void dplib_propt::lor(literalt a, literalt b, literalt o) -{ - out << "// lor\n"; - out << "AXIOM (" << dplib_literal(a) << " | " - << dplib_literal(b) << ") <=> " << dplib_literal(o) - << ";\n\n"; -} - -void dplib_propt::lxor(literalt a, literalt b, literalt o) -{ - out << "// lxor\n"; - out << "AXIOM (" << dplib_literal(a) << " <=> " - << dplib_literal(b) << ") <=> !" << dplib_literal(o) - << ";\n\n"; -} - -void dplib_propt::lnand(literalt a, literalt b, literalt o) -{ - out << "// lnand\n"; - out << "AXIOM (" << dplib_literal(a) << " & " - << dplib_literal(b) << ") <=> !" << dplib_literal(o) - << ";\n\n"; -} - -void dplib_propt::lnor(literalt a, literalt b, literalt o) -{ - out << "// lnor\n"; - out << "AXIOM (" << dplib_literal(a) << " | " - << dplib_literal(b) << ") <=> !" << dplib_literal(o) - << ";\n\n"; -} - -void dplib_propt::lequal(literalt a, literalt b, literalt o) -{ - out << "// lequal\n"; - out << "AXIOM (" << dplib_literal(a) << " <=> " - << dplib_literal(b) << ") <=> " << dplib_literal(o) - << ";\n\n"; -} - -void dplib_propt::limplies(literalt a, literalt b, literalt o) -{ - out << "// limplies\n"; - out << "AXIOM (" << dplib_literal(a) << " => " - << dplib_literal(b) << ") <=> " << dplib_literal(o) - << ";\n\n"; -} - -literalt dplib_propt::land(const bvt &bv) -{ - out << "// land\n"; - - literalt literal=def_dplib_literal(); - - forall_literals(it, bv) - { - if(it!=bv.begin()) - out << " & "; - out << dplib_literal(*it); - } - - out << "\n\n"; - - return literal; -} - -literalt dplib_propt::lor(const bvt &bv) -{ - out << "// lor\n"; - - literalt literal=def_dplib_literal(); - - forall_literals(it, bv) - { - if(it!=bv.begin()) - out << " | "; - out << dplib_literal(*it); - } - - out << "\n\n"; - - return literal; -} - -literalt dplib_propt::lxor(const bvt &bv) -{ - if(bv.empty()) - return const_literal(false); - if(bv.size()==1) - return bv[0]; - if(bv.size()==2) - return lxor(bv[0], bv[1]); - - literalt literal=const_literal(false); - - forall_literals(it, bv) - literal=lxor(*it, literal); - - return literal; -} - -literalt dplib_propt::land(literalt a, literalt b) -{ - if(a==const_literal(true)) - return b; - if(b==const_literal(true)) - return a; - if(a==const_literal(false)) - return const_literal(false); - if(b==const_literal(false)) - return const_literal(false); - if(a==b) - return a; - - literalt o=def_dplib_literal(); - out << dplib_literal(a) << " & " << dplib_literal(b) - << ";\n\n"; - - return o; -} - -literalt dplib_propt::lor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return const_literal(true); - if(b==const_literal(true)) - return const_literal(true); - if(a==b) - return a; - - literalt o=def_dplib_literal(); - out << dplib_literal(a) << " | " << dplib_literal(b) - << ";\n\n"; - - return o; -} - -literalt dplib_propt::lxor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return !b; - if(b==const_literal(true)) - return !a; - - literalt o=def_dplib_literal(); - out << "!(" << dplib_literal(a) << " <-> " << dplib_literal(b) - << ");\n\n"; - - return o; -} - -literalt dplib_propt::lnand(literalt a, literalt b) -{ - return !land(a, b); -} - -literalt dplib_propt::lnor(literalt a, literalt b) -{ - return !lor(a, b); -} - -literalt dplib_propt::lequal(literalt a, literalt b) -{ - return !lxor(a, b); -} - -literalt dplib_propt::limplies(literalt a, literalt b) -{ - return lor(!a, b); -} - -literalt dplib_propt::lselect(literalt a, literalt b, literalt c) -{ - if(a==const_literal(true)) - return b; - if(a==const_literal(false)) - return c; - if(b==c) - return b; - - out << "// lselect\n"; - - literalt o=def_dplib_literal(); - - out << "IF " << dplib_literal(a) << " THEN " - << dplib_literal(b) << " ELSE " - << dplib_literal(c) << " ENDIF;\n\n"; - - return o; -} - -literalt dplib_propt::new_variable() -{ - _no_variables++; - out << "l" << _no_variables << ": boolean;\n"; - literalt l; - l.set(_no_variables, false); - return l; -} - -literalt dplib_propt::def_dplib_literal() -{ - _no_variables++; - out << "l" << _no_variables << ": boolean = "; - literalt l; - l.set(_no_variables, false); - return l; -} - -void dplib_propt::lcnf(const bvt &bv) -{ - if(bv.empty()) - return; - bvt new_bv; - - std::set s; - - new_bv.reserve(bv.size()); - - for(bvt::const_iterator it=bv.begin(); it!=bv.end(); it++) - { - if(s.insert(*it).second) - new_bv.push_back(*it); - - if(s.find(!*it)!=s.end()) - return; // clause satisfied - - assert(it->var_no()<=_no_variables); - } - - assert(!new_bv.empty()); - - out << "// lcnf\n"; - out << "AXIOM "; - - for(bvt::const_iterator it=new_bv.begin(); it!=new_bv.end(); it++) - { - if(it!=new_bv.begin()) - out << " | "; - out << dplib_literal(*it); - } - - out << ";\n\n"; -} - -std::string dplib_propt::dplib_literal(literalt l) -{ - if(l==const_literal(false)) - return "FALSE"; - else if(l==const_literal(true)) - return "TRUE"; - - if(l.sign()) - return "(NOT l"+std::to_string(l.var_no())+")"; - - return "l"+std::to_string(l.var_no()); -} - -void dplib_propt::finish() -{ - // we want satisfiability - out << "THEOREM false;\n"; -} - -propt::resultt dplib_propt::prop_solve() -{ - finish(); - return P_ERROR; -} diff --git a/src/solvers/dplib/dplib_prop.h b/src/solvers/dplib/dplib_prop.h deleted file mode 100644 index 89441646093..00000000000 --- a/src/solvers/dplib/dplib_prop.h +++ /dev/null @@ -1,91 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - - -#ifndef CPROVER_SOLVERS_DPLIB_DPLIB_PROP_H -#define CPROVER_SOLVERS_DPLIB_DPLIB_PROP_H - -#include - -#include - -#include - -class dplib_propt:virtual public propt -{ -public: - explicit dplib_propt(std::ostream &_out); - virtual ~dplib_propt() { } - - virtual void land(literalt a, literalt b, literalt o); - virtual void lor(literalt a, literalt b, literalt o); - virtual void lxor(literalt a, literalt b, literalt o); - virtual void lnand(literalt a, literalt b, literalt o); - virtual void lnor(literalt a, literalt b, literalt o); - virtual void lequal(literalt a, literalt b, literalt o); - virtual void limplies(literalt a, literalt b, literalt o); - - virtual literalt land(literalt a, literalt b); - virtual literalt lor(literalt a, literalt b); - virtual literalt land(const bvt &bv); - virtual literalt lor(const bvt &bv); - virtual literalt lxor(const bvt &bv); - virtual literalt lxor(literalt a, literalt b); - virtual literalt lnand(literalt a, literalt b); - virtual literalt lnor(literalt a, literalt b); - virtual literalt lequal(literalt a, literalt b); - virtual literalt limplies(literalt a, literalt b); - virtual literalt lselect(literalt a, literalt b, literalt c); // a?b:c - virtual literalt new_variable(); - virtual size_t no_variables() const { return _no_variables; } - virtual void set_no_variables(size_t no) { assert(false); } - // virtual unsigned no_clauses()=0; - - virtual void lcnf(const bvt &bv); - - virtual const std::string solver_text() - { return "DPLIB"; } - - virtual tvt l_get(literalt literal) const - { - unsigned v=literal.var_no(); - if(v>=assignment.size()) - return tvt::unknown(); - tvt r=assignment[v]; - return literal.sign()?!r:r; - } - - virtual propt::resultt prop_solve(); - - friend class dplib_convt; - friend class dplib_dect; - - virtual void clear() - { - assignment.clear(); - } - - void reset_assignment() - { - assignment.clear(); - assignment.resize(no_variables(), tvt::unknown()); - } - -protected: - unsigned _no_variables; - std::ostream &out; - - std::string dplib_literal(literalt l); - literalt def_dplib_literal(); - - std::vector assignment; - - void finish(); -}; - -#endif // CPROVER_SOLVERS_DPLIB_DPLIB_PROP_H diff --git a/src/solvers/floatbv/float_approximation.cpp b/src/solvers/floatbv/float_approximation.cpp index 6a70b5f5091..2c73e517999 100644 --- a/src/solvers/floatbv/float_approximation.cpp +++ b/src/solvers/floatbv/float_approximation.cpp @@ -42,7 +42,7 @@ void float_approximationt::normalization_shift(bvt &fraction, bvt &exponent) if(over_approximate) shifted_fraction=overapproximating_left_shift(fraction, i); else - shifted_fraction=bv_utils.shift(fraction, bv_utilst::LEFT, i); + shifted_fraction=bv_utils.shift(fraction, bv_utilst::shiftt::LEFT, i); bv_utils.cond_implies_equal(shift, shifted_fraction, new_fraction); diff --git a/src/solvers/floatbv/float_approximation.h b/src/solvers/floatbv/float_approximation.h index daaaac8c7f3..a3193126465 100644 --- a/src/solvers/floatbv/float_approximation.h +++ b/src/solvers/floatbv/float_approximation.h @@ -12,7 +12,7 @@ Module: Floating Point with under/over-approximation #ifndef CPROVER_SOLVERS_FLOATBV_FLOAT_APPROXIMATION_H #define CPROVER_SOLVERS_FLOATBV_FLOAT_APPROXIMATION_H -#include +#include "float_utils.h" class float_approximationt:public float_utilst { diff --git a/src/solvers/smt1/smt1_prop.cpp b/src/solvers/smt1/smt1_prop.cpp deleted file mode 100644 index 481d0d289c5..00000000000 --- a/src/solvers/smt1/smt1_prop.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -Revisions: Roberto Bruttomesso, roberto.bruttomesso@unisi.ch - -\*******************************************************************/ - -#include "smt1_prop.h" - -#include - -smt1_propt::smt1_propt( - const std::string &benchmark, - const std::string &source, - const std::string &logic, - std::ostream &_out):out(_out) -{ - out << "(benchmark " << benchmark << "\n"; - out << ":source { " << source << " }" << "\n"; - out << ":status unknown" << "\n"; - out << ":logic " << logic << " ; SMT1" << "\n"; - _no_variables=0; -} - -smt1_propt::~smt1_propt() -{ -} - -void smt1_propt::finalize() -{ - out << "\n"; - out << ":formula true" << "\n"; - out << ") ; benchmark" << "\n"; -} - -literalt smt1_propt::land(const bvt &bv) -{ - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; land" << "\n"; - out << " (iff " << smt1_literal(l) << " (and"; - - forall_literals(it, bv) - out << " " << smt1_literal(*it); - - out << "))" << "\n"; - - return l; -} - -literalt smt1_propt::lor(const bvt &bv) -{ - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; lor" << "\n"; - out << " (iff " << smt1_literal(l) << " (or"; - - forall_literals(it, bv) - out << " " << smt1_literal(*it); - - out << "))" << "\n"; - - return l; -} - -literalt smt1_propt::lxor(const bvt &bv) -{ - if(bv.empty()) - return const_literal(false); - if(bv.size()==1) - return bv[0]; - - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; lxor" << "\n"; - out << " (iff " << smt1_literal(l) << " (xor"; - - forall_literals(it, bv) - out << " " << smt1_literal(*it); - - out << "))" << "\n"; - - return l; -} - -literalt smt1_propt::land(literalt a, literalt b) -{ - if(a==const_literal(true)) - return b; - if(b==const_literal(true)) - return a; - if(a==const_literal(false)) - return const_literal(false); - if(b==const_literal(false)) - return const_literal(false); - if(a==b) - return a; - - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; land" << "\n"; - out << " (iff " << smt1_literal(l) << " (and"; - out << " " << smt1_literal(a); - out << " " << smt1_literal(b); - out << "))" << "\n"; - - return l; -} - -literalt smt1_propt::lor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return const_literal(true); - if(b==const_literal(true)) - return const_literal(true); - if(a==b) - return a; - - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; lor" << "\n"; - out << " (iff " << smt1_literal(l) << " (or"; - out << " " << smt1_literal(a); - out << " " << smt1_literal(b); - out << "))" << "\n"; - - return l; -} - -literalt smt1_propt::lxor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return !b; - if(b==const_literal(true)) - return !a; - - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; lxor" << "\n"; - out << " (iff " << smt1_literal(l) << " (xor"; - out << " " << smt1_literal(a); - out << " " << smt1_literal(b); - out << "))" << "\n"; - - return l; -} - -literalt smt1_propt::lnand(literalt a, literalt b) -{ - return !land(a, b); -} - -literalt smt1_propt::lnor(literalt a, literalt b) -{ - return !lor(a, b); -} - -literalt smt1_propt::lequal(literalt a, literalt b) -{ - return !lxor(a, b); -} - -literalt smt1_propt::limplies(literalt a, literalt b) -{ - return lor(!a, b); -} - -literalt smt1_propt::lselect(literalt a, literalt b, literalt c) -{ - if(a==const_literal(true)) - return b; - if(a==const_literal(false)) - return c; - if(b==c) - return b; - - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return !b; - if(b==const_literal(true)) - return !a; - - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; lselect" << "\n"; - out << " (iff " << smt1_literal(l) << "(if_then_else " - << smt1_literal(a) << " " << smt1_literal(b) << " " - << smt1_literal(c) << ")" << "\n"; - - return l; -} - -literalt smt1_propt::new_variable() -{ - literalt l; - l.set(_no_variables, false); - _no_variables++; - - out << ":extrapreds((" << smt1_literal(l) << "))" << "\n"; - - return l; -} - -void smt1_propt::lcnf(const bvt &bv) -{ - out << "\n"; - out << ":assumption ; lcnf" << "\n"; - out << " "; - - if(bv.empty()) - out << "false ; the empty clause"; - else if(bv.size()==1) - out << smt1_literal(bv.front()); - else - { - out << "(or"; - - for(bvt::const_iterator it=bv.begin(); it!=bv.end(); it++) - out << " " << smt1_literal(*it); - - out << ")"; - } - - out << "\n"; -} - -std::string smt1_propt::smt1_literal(literalt l) -{ - if(l==const_literal(false)) - return "false"; - else if(l==const_literal(true)) - return "true"; - - std::string v="B"+std::to_string(l.var_no()); - - if(l.sign()) - return "(not "+v+")"; - - return v; -} - -tvt smt1_propt::l_get(literalt literal) const -{ - if(literal.is_true()) - return tvt(true); - if(literal.is_false()) - return tvt(false); - - unsigned v=literal.var_no(); - if(v>=assignment.size()) - return tvt(tvt::tv_enumt::TV_UNKNOWN); - tvt r=assignment[v]; - return literal.sign()?!r:r; -} - -void smt1_propt::set_assignment(literalt literal, bool value) -{ - if(literal.is_true() || literal.is_false()) - return; - - unsigned v=literal.var_no(); - assert(v - -#include - -#include - -class smt1_propt:public propt -{ -public: - smt1_propt( - const std::string &_benchmark, - const std::string &_source, - const std::string &_logic, - std::ostream &_out); - virtual ~smt1_propt(); - - virtual literalt land(literalt a, literalt b); - virtual literalt lor(literalt a, literalt b); - virtual literalt land(const bvt &bv); - virtual literalt lor(const bvt &bv); - virtual literalt lxor(const bvt &bv); - virtual literalt lxor(literalt a, literalt b); - virtual literalt lnand(literalt a, literalt b); - virtual literalt lnor(literalt a, literalt b); - virtual literalt lequal(literalt a, literalt b); - virtual literalt limplies(literalt a, literalt b); - virtual literalt lselect(literalt a, literalt b, literalt c); // a?b:c - - virtual literalt new_variable(); - virtual size_t no_variables() const { return _no_variables; } - virtual void set_no_variables(size_t no) { assert(false); } - - virtual void lcnf(const bvt &bv); - - virtual const std::string solver_text() - { return "SMT"; } - - virtual tvt l_get(literalt literal) const; - virtual void set_assignment(literalt a, bool value); - - virtual propt::resultt prop_solve(); - - virtual void clear() - { - assignment.clear(); - } - - virtual void reset_assignment() - { - assignment.clear(); - assignment.resize(no_variables(), tvt(tvt::tv_enumt::TV_UNKNOWN)); - } - - friend class smt1_convt; - friend class smt1_dect; - - void finalize(); - -protected: - size_t _no_variables; - std::ostream &out; - - std::string smt1_literal(literalt l); - literalt def_smt1_literal(); - - std::vector assignment; -}; - -#endif // CPROVER_SOLVERS_SMT1_SMT1_PROP_H diff --git a/src/solvers/smt2/smt2_prop.cpp b/src/solvers/smt2/smt2_prop.cpp deleted file mode 100644 index d6810e5d0c0..00000000000 --- a/src/solvers/smt2/smt2_prop.cpp +++ /dev/null @@ -1,334 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -#include "smt2_prop.h" - -#include - -smt2_propt::smt2_propt( - const std::string &benchmark, - const std::string &source, - const std::string &logic, - bool _core_enabled, - std::ostream &_out): - out(_out), - core_enabled(_core_enabled) -{ - out << "; SMT 2" << "\n"; - - out << "(set-info :source \"" << source << "\")" << "\n"; - out << "(set-option :produce-models true)" << "\n"; - - if(core_enabled) - { - out << "(set-option :produce-unsat-cores true)" << "\n"; - } - - out << "(set-logic " << logic << ")" << "\n"; - - _no_variables=0; -} - -smt2_propt::~smt2_propt() -{ -} - -void smt2_propt::finalize() -{ - out << "\n"; - out << "(check-sat)" << "\n"; - out << "\n"; - - for(smt2_identifierst::const_iterator - it=smt2_identifiers.begin(); - it!=smt2_identifiers.end(); - it++) - out << "(get-value (" << *it << "))" << "\n"; - - out << "\n"; - - if(core_enabled) - out << "(get-unsat-core)" << "\n"; - - out << "; end of SMT2 file" << "\n"; -} - -literalt smt2_propt::land(const bvt &bv) -{ - out << "\n"; - - literalt l=define_new_variable(); - - out << "; land" << "\n"; - out << " (and"; - - forall_literals(it, bv) - out << " " << smt2_literal(*it); - - out << "))" << "\n"; - - return l; -} - -literalt smt2_propt::lor(const bvt &bv) -{ - out << "\n"; - - literalt l=define_new_variable(); - - out << "; lor" << "\n"; - out << " (or"; - - forall_literals(it, bv) - out << " " << smt2_literal(*it); - - out << "))" << "\n"; - - return l; -} - -literalt smt2_propt::lxor(const bvt &bv) -{ - if(bv.empty()) - return const_literal(false); - if(bv.size()==1) - return bv[0]; - - out << "\n"; - - literalt l=define_new_variable(); - - out << "; lxor" << "\n"; - out << " (xor"; - - forall_literals(it, bv) - out << " " << smt2_literal(*it); - - out << "))" << "\n"; - - return l; -} - -literalt smt2_propt::land(literalt a, literalt b) -{ - if(a==const_literal(true)) - return b; - if(b==const_literal(true)) - return a; - if(a==const_literal(false)) - return const_literal(false); - if(b==const_literal(false)) - return const_literal(false); - if(a==b) - return a; - - out << "\n"; - - literalt l=define_new_variable(); - - out << "; land" << "\n"; - out << " (and"; - out << " " << smt2_literal(a); - out << " " << smt2_literal(b); - out << "))" << "\n"; - - return l; -} - -literalt smt2_propt::lor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return const_literal(true); - if(b==const_literal(true)) - return const_literal(true); - if(a==b) - return a; - - out << "\n"; - - literalt l=define_new_variable(); - - out << "; lor" << "\n"; - out << " (or"; - out << " " << smt2_literal(a); - out << " " << smt2_literal(b); - out << "))" << "\n"; - - return l; -} - -literalt smt2_propt::lxor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return !b; - if(b==const_literal(true)) - return !a; - - out << "\n"; - - literalt l=new_variable(); - - out << "; lxor" << "\n"; - out << " (xor"; - out << " " << smt2_literal(a); - out << " " << smt2_literal(b); - out << "))" << "\n"; - - return l; -} - -literalt smt2_propt::lnand(literalt a, literalt b) -{ - return !land(a, b); -} - -literalt smt2_propt::lnor(literalt a, literalt b) -{ - return !lor(a, b); -} - -literalt smt2_propt::lequal(literalt a, literalt b) -{ - return !lxor(a, b); -} - -literalt smt2_propt::limplies(literalt a, literalt b) -{ - return lor(!a, b); -} - -literalt smt2_propt::lselect(literalt a, literalt b, literalt c) -{ - if(a==const_literal(true)) - return b; - if(a==const_literal(false)) - return c; - if(b==c) - return b; - - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return !b; - if(b==const_literal(true)) - return !a; - - out << "\n"; - - literalt l=define_new_variable(); - - out << "; lselect" << "\n"; - out << " (if_then_else " - << smt2_literal(a) << " " << smt2_literal(b) << " " - << smt2_literal(c) << "))" << "\n"; - - return l; -} - -literalt smt2_propt::new_variable() -{ - literalt l; - l.set(_no_variables, false); - _no_variables++; - - out << "(declare-fun " << smt2_literal(l) << " () Bool)" << "\n"; - - return l; -} - -literalt smt2_propt::define_new_variable() -{ - literalt l; - l.set(_no_variables, false); - _no_variables++; - - out << "(define-fun " << smt2_literal(l) << " () Bool "; - // The command is continued elsewhere, and the - // closing parenthesis is missing! - - return l; -} - -void smt2_propt::lcnf(const bvt &bv) -{ - out << "\n"; - out << "(assert ; lcnf" << "\n"; - out << " "; - - if(bv.empty()) - out << "false"; - else if(bv.size()==1) - out << smt2_literal(bv.front()); - else - { - out << "(or"; - - for(bvt::const_iterator it=bv.begin(); it!=bv.end(); it++) - out << " " << smt2_literal(*it); - - out << ")"; - } - - out << ")" << "\n"; -} - -std::string smt2_propt::smt2_literal(literalt l) -{ - if(l==const_literal(false)) - return "false"; - else if(l==const_literal(true)) - return "true"; - - std::string v="B"+std::to_string(l.var_no()); - - smt2_identifiers.insert(v); - - if(l.sign()) - return "(not "+v+")"; - - return v; -} - -tvt smt2_propt::l_get(literalt literal) const -{ - if(literal.is_true()) - return tvt(true); - if(literal.is_false()) - return tvt(false); - - unsigned v=literal.var_no(); - if(v>=assignment.size()) - return tvt(tvt::tv_enumt::TV_UNKNOWN); - tvt r=assignment[v]; - return literal.sign()?!r:r; -} - -void smt2_propt::set_assignment(literalt literal, bool value) -{ - if(literal.is_true() || literal.is_false()) - return; - - unsigned v=literal.var_no(); - assert(v -#include - -#include - -#include - -class smt2_propt:public propt -{ -public: - smt2_propt( - const std::string &_benchmark, - const std::string &_source, - const std::string &_logic, - bool _core_enabled, - std::ostream &_out); - virtual ~smt2_propt(); - - virtual literalt land(literalt a, literalt b); - virtual literalt lor(literalt a, literalt b); - virtual literalt land(const bvt &bv); - virtual literalt lor(const bvt &bv); - virtual literalt lxor(const bvt &bv); - virtual literalt lxor(literalt a, literalt b); - virtual literalt lnand(literalt a, literalt b); - virtual literalt lnor(literalt a, literalt b); - virtual literalt lequal(literalt a, literalt b); - virtual literalt limplies(literalt a, literalt b); - virtual literalt lselect(literalt a, literalt b, literalt c); // a?b:c - - virtual literalt new_variable(); - virtual size_t no_variables() const { return _no_variables; } - virtual void set_no_variables(size_t no) { assert(false); } - - virtual void lcnf(const bvt &bv); - - virtual const std::string solver_text() - { return "SMT"; } - - virtual tvt l_get(literalt literal) const; - virtual void set_assignment(literalt a, bool value); - - virtual propt::resultt prop_solve(); - - virtual void clear() - { - assignment.clear(); - } - - virtual void reset_assignment() - { - assignment.clear(); - assignment.resize(no_variables(), tvt(tvt::tv_enumt::TV_UNKNOWN)); - } - - friend class smt2_convt; - friend class smt2_dect; - - void finalize(); - -protected: - size_t _no_variables; - std::ostream &out; - - std::string smt2_literal(literalt l); - literalt def_smt2_literal(); - - std::vector assignment; - - literalt define_new_variable(); - - typedef std::set smt2_identifierst; - smt2_identifierst smt2_identifiers; - - bool core_enabled; -}; - -#endif // CPROVER_SOLVERS_SMT2_SMT2_PROP_H From 4928f6986744fe3762399145991f139464b308f1 Mon Sep 17 00:00:00 2001 From: Michael Tautschnig Date: Sat, 29 Jul 2017 16:25:06 +0000 Subject: [PATCH 18/80] Diagnostic output if run/execve fails --- regression/goto-gcc/run_diagnostic/main.i | 4 ++++ regression/goto-gcc/run_diagnostic/test.desc | 9 +++++++++ src/util/run.cpp | 3 +++ 3 files changed, 16 insertions(+) create mode 100644 regression/goto-gcc/run_diagnostic/main.i create mode 100644 regression/goto-gcc/run_diagnostic/test.desc diff --git a/regression/goto-gcc/run_diagnostic/main.i b/regression/goto-gcc/run_diagnostic/main.i new file mode 100644 index 00000000000..f8b643afbf2 --- /dev/null +++ b/regression/goto-gcc/run_diagnostic/main.i @@ -0,0 +1,4 @@ +int main() +{ + return 0; +} diff --git a/regression/goto-gcc/run_diagnostic/test.desc b/regression/goto-gcc/run_diagnostic/test.desc new file mode 100644 index 00000000000..a7e89e4b7be --- /dev/null +++ b/regression/goto-gcc/run_diagnostic/test.desc @@ -0,0 +1,9 @@ +CORE +main.i +--native-compiler /no/such/tool +^EXIT=1$ +^SIGNAL=0$ +^execvp /no/such/tool failed: No such file or directory$ +-- +^warning: ignoring +^CONVERSION ERROR$ diff --git a/src/util/run.cpp b/src/util/run.cpp index f106309002e..217d7f8d226 100644 --- a/src/util/run.cpp +++ b/src/util/run.cpp @@ -127,9 +127,12 @@ int run( dup2(stdin_fd, STDIN_FILENO); if(stdout_fd!=STDOUT_FILENO) dup2(stdout_fd, STDOUT_FILENO); + + errno=0; execvp(what.c_str(), _argv.data()); /* usually no return */ + perror(std::string("execvp "+what+" failed").c_str()); return 1; } else /* fork() returns new pid to the parent process */ From 08a4077c100aca8c226e8ad9fc1c3e14b5eb4a37 Mon Sep 17 00:00:00 2001 From: Michael Tautschnig Date: Fri, 8 Sep 2017 09:39:11 +0100 Subject: [PATCH 19/80] Make the child process that failed to execvp exit Previously the zombie child would continue on the same code path as the forking parent. Hence one would see spurious "Remove failed" message as the zombie child would try to perform the same file removal as the parent. --- regression/goto-gcc/run_diagnostic/test.desc | 1 + src/util/run.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/regression/goto-gcc/run_diagnostic/test.desc b/regression/goto-gcc/run_diagnostic/test.desc index a7e89e4b7be..e3a632f65f2 100644 --- a/regression/goto-gcc/run_diagnostic/test.desc +++ b/regression/goto-gcc/run_diagnostic/test.desc @@ -5,5 +5,6 @@ main.i ^SIGNAL=0$ ^execvp /no/such/tool failed: No such file or directory$ -- +^Remove failed ^warning: ignoring ^CONVERSION ERROR$ diff --git a/src/util/run.cpp b/src/util/run.cpp index 217d7f8d226..d0fddab27fd 100644 --- a/src/util/run.cpp +++ b/src/util/run.cpp @@ -133,7 +133,7 @@ int run( /* usually no return */ perror(std::string("execvp "+what+" failed").c_str()); - return 1; + exit(1); } else /* fork() returns new pid to the parent process */ { From 40fe0f8691f5ac4820db1abdef89736ada952ebc Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Tue, 22 Aug 2017 16:11:37 +0100 Subject: [PATCH 20/80] simplify API of goto_convert --- src/goto-programs/goto_convert_functions.cpp | 9 --------- src/goto-programs/goto_convert_functions.h | 6 ------ 2 files changed, 15 deletions(-) diff --git a/src/goto-programs/goto_convert_functions.cpp b/src/goto-programs/goto_convert_functions.cpp index 5a35d5e2ef7..58d03a16cef 100644 --- a/src/goto-programs/goto_convert_functions.cpp +++ b/src/goto-programs/goto_convert_functions.cpp @@ -221,15 +221,6 @@ void goto_convert_functionst::convert_function(const irep_idt &identifier) f.make_hidden(); } -void goto_convert( - symbol_tablet &symbol_table, - goto_modelt &goto_model, - message_handlert &message_handler) -{ - goto_convert(symbol_table, goto_model.goto_functions, message_handler); - goto_model.symbol_table.swap(symbol_table); -} - void goto_convert( goto_modelt &goto_model, message_handlert &message_handler) diff --git a/src/goto-programs/goto_convert_functions.h b/src/goto-programs/goto_convert_functions.h index 85de9a67b97..3162b453d0f 100644 --- a/src/goto-programs/goto_convert_functions.h +++ b/src/goto-programs/goto_convert_functions.h @@ -23,12 +23,6 @@ void goto_convert( goto_functionst &functions, message_handlert &); -// confusing, will go away -void goto_convert( - symbol_tablet &symbol_table, - goto_modelt &dest, - message_handlert &); - // convert it all! void goto_convert( goto_modelt &, From 9469552599fd00d715b1b8b05b8c54e4d449f043 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Fri, 25 Aug 2017 15:31:21 +0100 Subject: [PATCH 21/80] use initialize_goto_model in CBMC/goto-analyse/etc --- src/analyses/call_graph.cpp | 4 +- src/analyses/call_graph.h | 4 +- src/analyses/constant_propagator.h | 8 +- src/analyses/custom_bitvector_analysis.cpp | 7 +- src/analyses/custom_bitvector_analysis.h | 3 +- src/analyses/escape_analysis.cpp | 7 +- src/analyses/escape_analysis.h | 4 +- src/analyses/goto_rw.h | 8 +- src/analyses/interval_analysis.cpp | 9 +- src/analyses/interval_analysis.h | 7 +- src/analyses/is_threaded.h | 8 +- src/analyses/natural_loops.cpp | 4 +- src/analyses/natural_loops.h | 5 +- src/cbmc/bmc.h | 3 +- src/cbmc/cbmc_parse_options.cpp | 310 ++++++--------- src/cbmc/cbmc_parse_options.h | 34 +- src/clobber/clobber_parse_options.cpp | 156 +------- src/clobber/clobber_parse_options.h | 10 +- .../goto_analyzer_parse_options.cpp | 2 +- .../goto_analyzer_parse_options.h | 9 +- src/goto-cc/compile.h | 3 +- src/goto-diff/goto_diff_parse_options.cpp | 4 +- src/goto-instrument/accelerate/accelerate.cpp | 7 +- src/goto-instrument/accelerate/accelerate.h | 14 +- src/goto-instrument/branch.cpp | 9 +- src/goto-instrument/branch.h | 7 +- src/goto-instrument/call_sequences.cpp | 22 +- src/goto-instrument/call_sequences.h | 11 +- src/goto-instrument/code_contracts.cpp | 6 +- src/goto-instrument/code_contracts.h | 7 +- src/goto-instrument/concurrency.cpp | 7 +- src/goto-instrument/concurrency.h | 7 +- src/goto-instrument/count_eloc.cpp | 24 +- src/goto-instrument/count_eloc.h | 10 +- src/goto-instrument/document_properties.cpp | 10 +- src/goto-instrument/document_properties.h | 6 +- src/goto-instrument/dot.cpp | 22 +- src/goto-instrument/dot.h | 7 +- src/goto-instrument/function.cpp | 16 +- src/goto-instrument/function.h | 10 +- .../goto_instrument_parse_options.cpp | 369 ++++++++---------- .../goto_instrument_parse_options.h | 7 +- src/goto-instrument/havoc_loops.cpp | 6 +- src/goto-instrument/havoc_loops.h | 4 +- src/goto-instrument/horn_encoding.cpp | 3 +- src/goto-instrument/horn_encoding.h | 5 +- src/goto-instrument/interrupt.cpp | 15 +- src/goto-instrument/interrupt.h | 8 +- src/goto-instrument/k_induction.cpp | 4 +- src/goto-instrument/k_induction.h | 4 +- src/goto-instrument/mmio.cpp | 13 +- src/goto-instrument/mmio.h | 8 +- src/goto-instrument/model_argc_argv.cpp | 39 +- src/goto-instrument/model_argc_argv.h | 8 +- src/goto-instrument/nondet_static.h | 6 - src/goto-instrument/nondet_volatile.cpp | 10 +- src/goto-instrument/nondet_volatile.h | 10 +- src/goto-instrument/points_to.h | 6 +- src/goto-instrument/race_check.cpp | 16 +- src/goto-instrument/race_check.h | 13 +- src/goto-instrument/reachability_slicer.cpp | 8 +- src/goto-instrument/reachability_slicer.h | 9 +- src/goto-instrument/remove_function.cpp | 20 +- src/goto-instrument/remove_function.h | 13 +- src/goto-instrument/rw_set.h | 11 +- src/goto-instrument/show_locations.cpp | 11 +- src/goto-instrument/show_locations.h | 4 +- src/goto-instrument/skip_loops.cpp | 8 +- src/goto-instrument/skip_loops.h | 6 +- src/goto-instrument/stack_depth.cpp | 20 +- src/goto-instrument/stack_depth.h | 6 +- .../thread_instrumentation.cpp | 24 +- src/goto-instrument/thread_instrumentation.h | 7 +- src/goto-instrument/undefined_functions.cpp | 21 +- src/goto-instrument/undefined_functions.h | 10 +- src/goto-instrument/uninitialized.cpp | 15 +- src/goto-instrument/uninitialized.h | 9 +- src/goto-instrument/unwind.h | 25 +- src/goto-instrument/wmm/goto2graph.h | 12 +- .../wmm/instrumenter_pensieve.h | 8 +- src/goto-instrument/wmm/weak_memory.cpp | 29 +- src/goto-instrument/wmm/weak_memory.h | 19 +- src/goto-programs/goto_inline.cpp | 15 +- src/goto-programs/goto_inline.h | 3 +- src/goto-programs/goto_trace.h | 7 +- src/goto-programs/initialize_goto_model.cpp | 4 + src/goto-programs/interpreter.cpp | 24 +- src/goto-programs/interpreter.h | 7 +- src/goto-programs/read_goto_binary.h | 4 +- src/goto-programs/remove_exceptions.cpp | 6 +- src/goto-programs/remove_returns.cpp | 8 +- src/goto-programs/remove_returns.h | 2 + .../remove_static_init_loops.cpp | 8 +- src/goto-programs/remove_static_init_loops.h | 9 +- src/goto-programs/show_goto_functions.h | 6 - src/goto-programs/show_properties.h | 6 - src/goto-programs/slice_global_inits.cpp | 7 +- src/goto-programs/slice_global_inits.h | 7 +- src/goto-programs/write_goto_binary.cpp | 39 +- src/goto-programs/write_goto_binary.h | 17 +- src/goto-symex/precondition.cpp | 3 +- src/musketeer/fence_shared.cpp | 42 +- src/musketeer/fence_shared.h | 24 +- src/musketeer/fencer.cpp | 14 +- src/musketeer/fencer.h | 10 +- src/musketeer/musketeer_parse_options.cpp | 66 ++-- src/musketeer/musketeer_parse_options.h | 8 +- src/musketeer/pensieve.cpp | 15 +- src/musketeer/pensieve.h | 6 +- .../propagate_const_function_pointers.cpp | 21 +- .../propagate_const_function_pointers.h | 8 +- src/musketeer/replace_async.h | 13 +- .../goto_program_dereference.cpp | 10 +- .../goto_program_dereference.h | 33 +- src/pointer-analysis/show_value_sets.cpp | 11 +- src/pointer-analysis/show_value_sets.h | 14 +- src/solvers/refinement/bv_refinement.h | 2 +- src/solvers/refinement/string_refinement.h | 2 +- src/symex/symex_parse_options.cpp | 35 +- src/symex/symex_parse_options.h | 7 +- 120 files changed, 929 insertions(+), 1254 deletions(-) diff --git a/src/analyses/call_graph.cpp b/src/analyses/call_graph.cpp index bed00fd7f06..dd2d5b275fd 100644 --- a/src/analyses/call_graph.cpp +++ b/src/analyses/call_graph.cpp @@ -18,9 +18,9 @@ call_grapht::call_grapht() { } -call_grapht::call_grapht(const goto_functionst &goto_functions) +call_grapht::call_grapht(const goto_modelt &goto_model) { - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) { const goto_programt &body=f_it->second.body; add(f_it->first, body); diff --git a/src/analyses/call_graph.h b/src/analyses/call_graph.h index 79e1c03b1aa..ea4539147fd 100644 --- a/src/analyses/call_graph.h +++ b/src/analyses/call_graph.h @@ -15,13 +15,13 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include +#include class call_grapht { public: call_grapht(); - explicit call_grapht(const goto_functionst &); + explicit call_grapht(const goto_modelt &); void output_dot(std::ostream &out) const; void output(std::ostream &out) const; diff --git a/src/analyses/constant_propagator.h b/src/analyses/constant_propagator.h index 0b54c79bdb8..0e2e65383a3 100644 --- a/src/analyses/constant_propagator.h +++ b/src/analyses/constant_propagator.h @@ -110,11 +110,11 @@ class constant_propagator_ait:public ait { public: constant_propagator_ait( - goto_functionst &goto_functions, - const namespacet &ns) + goto_modelt &goto_model) { - operator()(goto_functions, ns); - replace(goto_functions, ns); + const namespacet ns(goto_model.symbol_table); + operator()(goto_model.goto_functions, ns); + replace(goto_model.goto_functions, ns); } constant_propagator_ait( diff --git a/src/analyses/custom_bitvector_analysis.cpp b/src/analyses/custom_bitvector_analysis.cpp index a81a08e6e67..b241150d7ba 100644 --- a/src/analyses/custom_bitvector_analysis.cpp +++ b/src/analyses/custom_bitvector_analysis.cpp @@ -682,14 +682,13 @@ void custom_bitvector_analysist::instrument(goto_functionst &) } void custom_bitvector_analysist::check( - const namespacet &ns, - const goto_functionst &goto_functions, + const goto_modelt &goto_model, bool use_xml, std::ostream &out) { unsigned pass=0, fail=0, unknown=0; - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) { if(!f_it->second.body.has_assertion()) continue; @@ -715,6 +714,7 @@ void custom_bitvector_analysist::check( continue; exprt tmp=eval(i_it->guard, i_it); + const namespacet ns(goto_model.symbol_table); result=simplify_expr(tmp, ns); description=i_it->source_location.get_comment(); @@ -744,6 +744,7 @@ void custom_bitvector_analysist::check( if(!description.empty()) out << ", " << description; out << ": "; + const namespacet ns(goto_model.symbol_table); out << from_expr(ns, f_it->first, result); out << '\n'; } diff --git a/src/analyses/custom_bitvector_analysis.h b/src/analyses/custom_bitvector_analysis.h index 5ef03adbaf2..f0c298f84d6 100644 --- a/src/analyses/custom_bitvector_analysis.h +++ b/src/analyses/custom_bitvector_analysis.h @@ -128,8 +128,7 @@ class custom_bitvector_analysist:public ait public: void instrument(goto_functionst &); void check( - const namespacet &, - const goto_functionst &, + const goto_modelt &, bool xml, std::ostream &); exprt eval(const exprt &src, locationt loc) diff --git a/src/analyses/escape_analysis.cpp b/src/analyses/escape_analysis.cpp index a9b7c71db08..b0129dfd0a6 100644 --- a/src/analyses/escape_analysis.cpp +++ b/src/analyses/escape_analysis.cpp @@ -436,10 +436,11 @@ void escape_analysist::insert_cleanup( } void escape_analysist::instrument( - goto_functionst &goto_functions, - const namespacet &ns) + goto_modelt &goto_model) { - Forall_goto_functions(f_it, goto_functions) + const namespacet ns(goto_model.symbol_table); + + Forall_goto_functions(f_it, goto_model.goto_functions) { Forall_goto_program_instructions(i_it, f_it->second.body) { diff --git a/src/analyses/escape_analysis.h b/src/analyses/escape_analysis.h index 00f865b45e4..7a4c606e1d4 100644 --- a/src/analyses/escape_analysis.h +++ b/src/analyses/escape_analysis.h @@ -95,9 +95,7 @@ class escape_domaint:public ai_domain_baset class escape_analysist:public ait { public: - void instrument( - goto_functionst &, - const namespacet &); + void instrument(goto_modelt &); protected: virtual void initialize(const goto_functionst &_goto_functions) diff --git a/src/analyses/goto_rw.h b/src/analyses/goto_rw.h index 38bc4d2e61a..02f17a7af16 100644 --- a/src/analyses/goto_rw.h +++ b/src/analyses/goto_rw.h @@ -19,7 +19,7 @@ Date: April 2010 #include -#include +#include #define forall_rw_range_set_r_objects(it, rw_set) \ for(rw_range_sett::objectst::const_iterator it=(rw_set).get_r_set().begin(); \ @@ -30,15 +30,15 @@ Date: April 2010 it!=(rw_set).get_w_set().end(); ++it) class rw_range_sett; -class goto_functionst; +class goto_modelt; void goto_rw(goto_programt::const_targett target, rw_range_sett &rw_set); -void goto_rw(const goto_programt &goto_program, +void goto_rw(const goto_programt &, rw_range_sett &rw_set); -void goto_rw(const goto_functionst &goto_functions, +void goto_rw(const goto_functionst &, const irep_idt &function, rw_range_sett &rw_set); diff --git a/src/analyses/interval_analysis.cpp b/src/analyses/interval_analysis.cpp index c6d739c8bfd..f3c0247a9bb 100644 --- a/src/analyses/interval_analysis.cpp +++ b/src/analyses/interval_analysis.cpp @@ -76,14 +76,13 @@ void instrument_intervals( } } -void interval_analysis( - const namespacet &ns, - goto_functionst &goto_functions) +void interval_analysis(goto_modelt &goto_model) { ait interval_analysis; - interval_analysis(goto_functions, ns); + const namespacet ns(goto_model.symbol_table); + interval_analysis(goto_model.goto_functions, ns); - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) instrument_intervals(interval_analysis, f_it->second); } diff --git a/src/analyses/interval_analysis.h b/src/analyses/interval_analysis.h index 1c85fc9a193..1b1b7c07e79 100644 --- a/src/analyses/interval_analysis.h +++ b/src/analyses/interval_analysis.h @@ -12,11 +12,8 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_ANALYSES_INTERVAL_ANALYSIS_H #define CPROVER_ANALYSES_INTERVAL_ANALYSIS_H -#include -#include +class goto_modelt; -void interval_analysis( - const namespacet &ns, - goto_functionst &goto_functions); +void interval_analysis(goto_modelt &); #endif // CPROVER_ANALYSES_INTERVAL_ANALYSIS_H diff --git a/src/analyses/is_threaded.h b/src/analyses/is_threaded.h index 5a3823b867e..c5cf48a559c 100644 --- a/src/analyses/is_threaded.h +++ b/src/analyses/is_threaded.h @@ -16,7 +16,7 @@ Date: October 2012 #include -#include +#include class is_threadedt { @@ -27,6 +27,12 @@ class is_threadedt compute(goto_functions); } + explicit is_threadedt( + const goto_modelt &goto_model) + { + compute(goto_model.goto_functions); + } + bool operator()(const goto_programt::const_targett t) const { return is_threaded_set.find(t)!=is_threaded_set.end(); diff --git a/src/analyses/natural_loops.cpp b/src/analyses/natural_loops.cpp index 7101613e417..00ece2cf213 100644 --- a/src/analyses/natural_loops.cpp +++ b/src/analyses/natural_loops.cpp @@ -13,9 +13,9 @@ Author: Georg Weissenbacher, georg@weissenbacher.name #include -void show_natural_loops(const goto_functionst &goto_functions) +void show_natural_loops(const goto_modelt &goto_model) { - forall_goto_functions(it, goto_functions) + forall_goto_functions(it, goto_model.goto_functions) { std::cout << "*** " << it->first << '\n'; diff --git a/src/analyses/natural_loops.h b/src/analyses/natural_loops.h index 9eb24ccc0ed..8fb41d7e1d2 100644 --- a/src/analyses/natural_loops.h +++ b/src/analyses/natural_loops.h @@ -16,8 +16,7 @@ Author: Georg Weissenbacher, georg@weissenbacher.name #include #include -#include -#include +#include #include "cfg_dominators.h" @@ -70,7 +69,7 @@ class natural_loopst: typedef natural_loops_templatet natural_loops_mutablet; -void show_natural_loops(const goto_functionst &goto_functions); +void show_natural_loops(const goto_modelt &); /// Finds all back-edges and computes the natural loops #ifdef DEBUG diff --git a/src/cbmc/bmc.h b/src/cbmc/bmc.h index 4c69fab527c..6c9a5c6bd31 100644 --- a/src/cbmc/bmc.h +++ b/src/cbmc/bmc.h @@ -16,6 +16,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include +#include #include #include @@ -23,7 +24,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include -#include + #include #include diff --git a/src/cbmc/cbmc_parse_options.cpp b/src/cbmc/cbmc_parse_options.cpp index ed6f3f081a2..a3fbd8c99dc 100644 --- a/src/cbmc/cbmc_parse_options.cpp +++ b/src/cbmc/cbmc_parse_options.cpp @@ -25,7 +25,14 @@ Author: Daniel Kroening, kroening@kroening.com #include +#include +#include #include +#include +#include +#include +#include +#include #include #include #include @@ -35,20 +42,15 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include +#include #include -#include -#include -#include +#include #include -#include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include #include #include @@ -71,7 +73,7 @@ Author: Daniel Kroening, kroening@kroening.com cbmc_parse_optionst::cbmc_parse_optionst(int argc, const char **argv): parse_options_baset(CBMC_OPTIONS, argc, argv), xml_interfacet(cmdline), - language_uit(cmdline, ui_message_handler), + messaget(ui_message_handler), ui_message_handler(cmdline, "CBMC " CBMC_VERSION) { } @@ -82,7 +84,7 @@ ::cbmc_parse_optionst::cbmc_parse_optionst( const std::string &extra_options): parse_options_baset(CBMC_OPTIONS+extra_options, argc, argv), xml_interfacet(cmdline), - language_uit(cmdline, ui_message_handler), + messaget(ui_message_handler), ui_message_handler(cmdline, "CBMC " CBMC_VERSION) { } @@ -470,7 +472,7 @@ int cbmc_parse_optionst::doit() register_languages(); if(cmdline.isset("test-preprocessor")) - return test_c_preprocessor(ui_message_handler)?8:0; + return test_c_preprocessor(get_message_handler())?8:0; if(cmdline.isset("preprocess")) { @@ -478,12 +480,56 @@ int cbmc_parse_optionst::doit() return 0; // should contemplate EX_OK from sysexits.h } - goto_functionst goto_functions; + if(cmdline.isset("show-parse-tree")) + { + if(cmdline.args.size()!=1 || + is_goto_binary(cmdline.args[0])) + { + error() << "Please give exactly one source file" << eom; + return 6; + } + + std::string filename=cmdline.args[0]; + + #ifdef _MSC_VER + std::ifstream infile(widen(filename)); + #else + std::ifstream infile(filename); + #endif + + if(!infile) + { + error() << "failed to open input file `" + << filename << "'" << eom; + return 6; + } + + std::unique_ptr language= + get_language_from_filename(filename); + + if(language==nullptr) + { + error() << "failed to figure out type of file `" + << filename << "'" << eom; + return 6; + } + + language->get_language_options(cmdline); + language->set_message_handler(get_message_handler()); + + status() << "Parsing " << filename << eom; + + if(language->parse(infile, filename)) + { + error() << "PARSING ERROR" << eom; + return 6; + } - expr_listt bmc_constraints; + language->show_parse(std::cout); + return 0; + } - int get_goto_program_ret= - get_goto_program(options, bmc_constraints, goto_functions); + int get_goto_program_ret=get_goto_program(options); if(get_goto_program_ret!=-1) return get_goto_program_ret; @@ -491,26 +537,24 @@ int cbmc_parse_optionst::doit() if(cmdline.isset("show-claims") || // will go away cmdline.isset("show-properties")) // use this one { - const namespacet ns(symbol_table); - show_properties(ns, get_ui(), goto_functions); + show_properties(goto_model, ui_message_handler.get_ui()); return 0; // should contemplate EX_OK from sysexits.h } - if(set_properties(goto_functions)) + if(set_properties()) return 7; // should contemplate EX_USAGE from sysexits.h // unwinds loops to number of enum elements // side effect: add this as explicit unwind to unwind set if(options.get_bool_option("java-unwind-enum-static")) - remove_static_init_loops( - symbol_table, - goto_functions, - options, - ui_message_handler); + remove_static_init_loops(goto_model, options, get_message_handler()); // get solver - cbmc_solverst cbmc_solvers(options, symbol_table, ui_message_handler); - cbmc_solvers.set_ui(get_ui()); + cbmc_solverst cbmc_solvers( + options, + goto_model.symbol_table, + get_message_handler()); + cbmc_solvers.set_ui(ui_message_handler.get_ui()); std::unique_ptr cbmc_solver; @@ -527,21 +571,25 @@ int cbmc_parse_optionst::doit() prop_convt &prop_conv=cbmc_solver->prop_conv(); - bmct bmc(options, symbol_table, ui_message_handler, prop_conv); + bmct bmc( + options, + goto_model.symbol_table, + get_message_handler(), + prop_conv); // do actual BMC - return do_bmc(bmc, goto_functions); + return do_bmc(bmc); } -bool cbmc_parse_optionst::set_properties(goto_functionst &goto_functions) +bool cbmc_parse_optionst::set_properties() { try { if(cmdline.isset("claim")) // will go away - ::set_properties(goto_functions, cmdline.get_values("claim")); + ::set_properties(goto_model, cmdline.get_values("claim")); if(cmdline.isset("property")) // use this one - ::set_properties(goto_functions, cmdline.get_values("property")); + ::set_properties(goto_model, cmdline.get_values("property")); } catch(const char *e) @@ -565,9 +613,7 @@ bool cbmc_parse_optionst::set_properties(goto_functionst &goto_functions) } int cbmc_parse_optionst::get_goto_program( - const optionst &options, - expr_listt &bmc_constraints, // for get_modules - goto_functionst &goto_functions) + const optionst &options) { if(cmdline.args.empty()) { @@ -577,127 +623,29 @@ int cbmc_parse_optionst::get_goto_program( try { - if(cmdline.isset("show-parse-tree")) - { - if(cmdline.args.size()!=1 || - is_goto_binary(cmdline.args[0])) - { - error() << "Please give exactly one source file" << eom; - return 6; - } - - std::string filename=cmdline.args[0]; - - #ifdef _MSC_VER - std::ifstream infile(widen(filename)); - #else - std::ifstream infile(filename); - #endif - - if(!infile) - { - error() << "failed to open input file `" - << filename << "'" << eom; - return 6; - } - - std::unique_ptr language=get_language_from_filename(filename); - language->get_language_options(cmdline); - - if(language==nullptr) - { - error() << "failed to figure out type of file `" - << filename << "'" << eom; - return 6; - } - - language->set_message_handler(get_message_handler()); - - status() << "Parsing " << filename << eom; - - if(language->parse(infile, filename)) - { - error() << "PARSING ERROR" << eom; - return 6; - } - - language->show_parse(std::cout); - return 0; - } - - cmdlinet::argst binaries; - binaries.reserve(cmdline.args.size()); - - for(cmdlinet::argst::iterator - it=cmdline.args.begin(); - it!=cmdline.args.end(); - ) // no ++it - { - if(is_goto_binary(*it)) - { - binaries.push_back(*it); - it=cmdline.args.erase(it); - continue; - } - - ++it; - } - - if(!cmdline.args.empty()) - { - if(parse()) - return 6; - if(typecheck()) - return 6; - int get_modules_ret=get_modules(bmc_constraints); - if(get_modules_ret!=-1) - return get_modules_ret; - if(binaries.empty() && final()) - return 6; - - // we no longer need any parse trees or language files - clear_parse(); - } - - for(const auto &bin : binaries) - { - status() << "Reading GOTO program from file " << eom; - - if(read_object_and_link( - bin, - symbol_table, - goto_functions, - get_message_handler())) - { - return 6; - } - } + if(initialize_goto_model(goto_model, cmdline, get_message_handler())) + return 6; if(cmdline.isset("show-symbol-table")) { - show_symbol_table(); + show_symbol_table(goto_model, ui_message_handler.get_ui()); return 0; } - status() << "Generating GOTO Program" << eom; - - goto_convert(symbol_table, goto_functions, ui_message_handler); - - if(process_goto_program(options, goto_functions)) + if(process_goto_program(options)) return 6; // show it? if(cmdline.isset("show-loops")) { - show_loop_ids(get_ui(), goto_functions); + show_loop_ids(ui_message_handler.get_ui(), goto_model); return 0; } // show it? if(cmdline.isset("show-goto-functions")) { - namespacet ns(symbol_table); - show_goto_functions(ns, get_ui(), goto_functions); + show_goto_functions(goto_model, ui_message_handler.get_ui()); return 0; } @@ -786,49 +734,44 @@ void cbmc_parse_optionst::preprocessing() } bool cbmc_parse_optionst::process_goto_program( - const optionst &options, - goto_functionst &goto_functions) + const optionst &options) { try { - namespacet ns(symbol_table); - // Remove inline assembler; this needs to happen before // adding the library. - remove_asm(symbol_table, goto_functions); + remove_asm(goto_model); // add the library - link_to_library(symbol_table, goto_functions, ui_message_handler); + link_to_library(goto_model, get_message_handler()); if(cmdline.isset("string-abstraction")) - string_instrumentation( - symbol_table, get_message_handler(), goto_functions); + string_instrumentation(goto_model, get_message_handler()); // remove function pointers status() << "Removal of function pointers and virtual functions" << eom; remove_function_pointers( get_message_handler(), - symbol_table, - goto_functions, + goto_model, cmdline.isset("pointer-check")); // Java virtual functions -> explicit dispatch tables: - remove_virtual_functions(symbol_table, goto_functions); + remove_virtual_functions(goto_model); // remove catch and throw (introduces instanceof) - remove_exceptions(symbol_table, goto_functions); + remove_exceptions(goto_model); // Similar removal of RTTI inspection: - remove_instanceof(symbol_table, goto_functions); + remove_instanceof(goto_model); - mm_io(symbol_table, goto_functions); + mm_io(goto_model); // do partial inlining status() << "Partial Inlining" << eom; - goto_partial_inline(goto_functions, ns, ui_message_handler); + goto_partial_inline(goto_model, get_message_handler()); // remove returns, gcc vectors, complex - remove_returns(symbol_table, goto_functions); - remove_vector(symbol_table, goto_functions); - remove_complex(symbol_table, goto_functions); - rewrite_union(goto_functions, ns); + remove_returns(goto_model); + remove_vector(goto_model); + remove_complex(goto_model); + rewrite_union(goto_model); // Similar removal of java nondet statements: // TODO Should really get this from java_bytecode_language somehow, but we @@ -841,20 +784,21 @@ bool cbmc_parse_optionst::process_goto_program( cmdline.isset("java-max-input-tree-depth") ? std::stoul(cmdline.get_value("java-max-input-tree-depth")) : MAX_NONDET_TREE_DEPTH; - replace_java_nondet(goto_functions); + + replace_java_nondet(goto_model); + convert_nondet( - goto_functions, - symbol_table, - ui_message_handler, + goto_model, + get_message_handler(), max_nondet_array_length, max_nondet_tree_depth); // add generic checks status() << "Generic Property Instrumentation" << eom; - goto_check(ns, options, goto_functions); + goto_check(options, goto_model); // checks don't know about adjusted float expressions - adjust_float_expressions(goto_functions, ns); + adjust_float_expressions(goto_model); // ignore default/user-specified initialization // of variables with static lifetime @@ -862,46 +806,44 @@ bool cbmc_parse_optionst::process_goto_program( { status() << "Adding nondeterministic initialization " "of static/global variables" << eom; - nondet_static(ns, goto_functions); + nondet_static(goto_model); } if(cmdline.isset("string-abstraction")) { status() << "String Abstraction" << eom; string_abstraction( - symbol_table, - get_message_handler(), - goto_functions); + goto_model, + get_message_handler()); } // add failed symbols // needs to be done before pointer analysis - add_failed_symbols(symbol_table); + add_failed_symbols(goto_model.symbol_table); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); // add loop ids - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.compute_loop_numbers(); if(cmdline.isset("drop-unused-functions")) { // Entry point will have been set before and function pointers removed status() << "Removing unused functions" << eom; - remove_unused_functions(goto_functions, ui_message_handler); + remove_unused_functions(goto_model, get_message_handler()); } // remove skips such that trivial GOTOs are deleted and not considered // for coverage annotation: - remove_skip(goto_functions); + remove_skip(goto_model); // instrument cover goals if(cmdline.isset("cover")) { if(instrument_cover_goals( cmdline, - symbol_table, - goto_functions, + goto_model, get_message_handler())) return true; } @@ -911,21 +853,21 @@ bool cbmc_parse_optionst::process_goto_program( // before using the argument of the "property" option. // Do not re-label after using the property slicer because // this would cause the property identifiers to change. - label_properties(goto_functions); + label_properties(goto_model); // full slice? if(cmdline.isset("full-slice")) { status() << "Performing a full slice" << eom; if(cmdline.isset("property")) - property_slicer(goto_functions, ns, cmdline.get_values("property")); + property_slicer(goto_model, cmdline.get_values("property")); else - full_slicer(goto_functions, ns); + full_slicer(goto_model); } // remove any skips introduced since coverage instrumentation - remove_skip(goto_functions); - goto_functions.update(); + remove_skip(goto_model); + goto_model.goto_functions.update(); } catch(const char *e) @@ -955,16 +897,14 @@ bool cbmc_parse_optionst::process_goto_program( } /// invoke main modules -int cbmc_parse_optionst::do_bmc( - bmct &bmc, - const goto_functionst &goto_functions) +int cbmc_parse_optionst::do_bmc(bmct &bmc) { - bmc.set_ui(get_ui()); + bmc.set_ui(ui_message_handler.get_ui()); int result=6; // do actual BMC - switch(bmc.run(goto_functions)) + switch(bmc.run(goto_model.goto_functions)) { case safety_checkert::resultt::SAFE: result=0; diff --git a/src/cbmc/cbmc_parse_options.h b/src/cbmc/cbmc_parse_options.h index ef91683ee0e..33c5dca4602 100644 --- a/src/cbmc/cbmc_parse_options.h +++ b/src/cbmc/cbmc_parse_options.h @@ -74,7 +74,7 @@ class optionst; class cbmc_parse_optionst: public parse_options_baset, public xml_interfacet, - public language_uit + public messaget { public: virtual int doit() override; @@ -87,35 +87,17 @@ class cbmc_parse_optionst: const std::string &extra_options); protected: + goto_modelt goto_model; ui_message_handlert ui_message_handler; - virtual void register_languages(); - - virtual void get_command_line_options(optionst &options); - - virtual int do_bmc( - bmct &bmc, - const goto_functionst &goto_functions); - - virtual int get_goto_program( - const optionst &options, - expr_listt &bmc_constraints, - goto_functionst &goto_functions); - - virtual bool process_goto_program( - const optionst &options, - goto_functionst &goto_functions); - - bool set_properties(goto_functionst &goto_functions); void eval_verbosity(); - - // get any additional stuff before finalizing the goto program - virtual int get_modules(expr_listt &bmc_constraints) - { - return -1; // continue - } - + void register_languages(); + void get_command_line_options(optionst &); void preprocessing(); + int get_goto_program(const optionst &); + bool process_goto_program(const optionst &); + bool set_properties(); + int do_bmc(bmct &); }; #endif // CPROVER_CBMC_CBMC_PARSE_OPTIONS_H diff --git a/src/clobber/clobber_parse_options.cpp b/src/clobber/clobber_parse_options.cpp index b0859362be9..5a926a71eee 100644 --- a/src/clobber/clobber_parse_options.cpp +++ b/src/clobber/clobber_parse_options.cpp @@ -24,7 +24,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include +#include #include #include #include @@ -120,34 +120,33 @@ int clobber_parse_optionst::doit() eval_verbosity(); - goto_functionst goto_functions; + goto_modelt goto_model; try { - if(get_goto_program(options, goto_functions)) + if(initialize_goto_model(goto_model, cmdline, get_message_handler())) return 6; - label_properties(goto_functions); + label_properties(goto_model); if(cmdline.isset("show-properties")) { - const namespacet ns(symbol_table); - show_properties(ns, get_ui(), goto_functions); + show_properties(goto_model, get_ui()); return 0; } - set_properties(goto_functions); + set_properties(goto_model.goto_functions); // do instrumentation - const namespacet ns(symbol_table); + const namespacet ns(goto_model.symbol_table); std::ofstream out("simulator.c"); if(!out) throw std::string("failed to create file simulator.c"); - dump_c(goto_functions, true, false, false, ns, out); + dump_c(goto_model.goto_functions, true, false, false, ns, out); status() << "instrumentation complete; compile and execute simulator.c" << eom; @@ -189,165 +188,42 @@ bool clobber_parse_optionst::set_properties(goto_functionst &goto_functions) return false; } -bool clobber_parse_optionst::get_goto_program( - const optionst &options, - goto_functionst &goto_functions) -{ - if(cmdline.args.empty()) - { - error() << "Please provide a program to verify" << eom; - return true; - } - - { - if(cmdline.args.size()==1 && - is_goto_binary(cmdline.args[0])) - { - status() << "Reading GOTO program from file" << eom; - - if(read_goto_binary(cmdline.args[0], - symbol_table, goto_functions, get_message_handler())) - return true; - - if(cmdline.isset("show-symbol-table")) - { - show_symbol_table(); - return true; - } - - irep_idt entry_point=goto_functions.entry_point(); - - if(symbol_table.symbols.find(entry_point)==symbol_table.symbols.end()) - { - error() << "The goto binary has no entry point; please complete linking" - << eom; - return true; - } - } - else if(cmdline.isset("show-parse-tree")) - { - if(cmdline.args.size()!=1) - { - error() << "Please give one source file only" << eom; - return true; - } - - std::string filename=cmdline.args[0]; - - #ifdef _MSC_VER - std::ifstream infile(widen(filename)); - #else - std::ifstream infile(filename); - #endif - - if(!infile) - { - error() << "failed to open input file `" << filename << "'" << eom; - return true; - } - - std::unique_ptr language=get_language_from_filename(filename); - language->get_language_options(cmdline); - - if(language==nullptr) - { - error() << "failed to figure out type of file `" << filename << "'" - << eom; - return true; - } - - language->set_message_handler(get_message_handler()); - - status() << "Parsing " << filename << eom; - - if(language->parse(infile, filename)) - { - error() << "PARSING ERROR" << eom; - return true; - } - - language->show_parse(std::cout); - return true; - } - else - { - if(parse() || - typecheck() || - final()) - return true; - - // we no longer need any parse trees or language files - clear_parse(); - - if(cmdline.isset("show-symbol-table")) - { - show_symbol_table(); - return true; - } - - irep_idt entry_point=goto_functions.entry_point(); - - if(symbol_table.symbols.find(entry_point)==symbol_table.symbols.end()) - { - error() << "No entry point; please provide a main function" << eom; - return true; - } - - status() << "Generating GOTO Program" << eom; - - goto_convert(symbol_table, goto_functions, ui_message_handler); - } - - // finally add the library - #if 0 - link_to_library(symbol_table, goto_functions, ui_message_handler); - #endif - - if(process_goto_program(options, goto_functions)) - return true; - } - - return false; -} - bool clobber_parse_optionst::process_goto_program( const optionst &options, - goto_functionst &goto_functions) + goto_modelt &goto_model) { { - namespacet ns(symbol_table); - // do partial inlining status() << "Partial Inlining" << eom; - goto_partial_inline(goto_functions, ns, ui_message_handler); + goto_partial_inline(goto_model, get_message_handler()); // add generic checks status() << "Generic Property Instrumentation" << eom; - goto_check(ns, options, goto_functions); + goto_check(options, goto_model); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); // add loop ids - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.compute_loop_numbers(); // if we aim to cover, replace // all assertions by false to prevent simplification if(cmdline.isset("cover-assertions")) - make_assertions_false(goto_functions); + make_assertions_false(goto_model); // show it? if(cmdline.isset("show-loops")) { - show_loop_ids(get_ui(), goto_functions); + show_loop_ids(get_ui(), goto_model); return true; } // show it? if(cmdline.isset("show-goto-functions")) { - show_goto_functions(ns, get_ui(), goto_functions); + show_goto_functions(goto_model, get_ui()); return true; } } diff --git a/src/clobber/clobber_parse_options.h b/src/clobber/clobber_parse_options.h index 5148bc759af..eb543f60138 100644 --- a/src/clobber/clobber_parse_options.h +++ b/src/clobber/clobber_parse_options.h @@ -54,17 +54,13 @@ class clobber_parse_optionst: protected: ui_message_handlert ui_message_handler; - void get_command_line_options(optionst &options); - - bool get_goto_program( - const optionst &options, - goto_functionst &goto_functions); + void get_command_line_options(optionst &); bool process_goto_program( const optionst &options, - goto_functionst &goto_functions); + goto_modelt &); - bool set_properties(goto_functionst &goto_functions); + bool set_properties(goto_functionst &); void report_success(); void report_failure(); diff --git a/src/goto-analyzer/goto_analyzer_parse_options.cpp b/src/goto-analyzer/goto_analyzer_parse_options.cpp index 66d31053220..b7f0b60a1d0 100644 --- a/src/goto-analyzer/goto_analyzer_parse_options.cpp +++ b/src/goto-analyzer/goto_analyzer_parse_options.cpp @@ -58,7 +58,7 @@ goto_analyzer_parse_optionst::goto_analyzer_parse_optionst( int argc, const char **argv): parse_options_baset(GOTO_ANALYSER_OPTIONS, argc, argv), - language_uit(cmdline, ui_message_handler), + messaget(ui_message_handler), ui_message_handler(cmdline, "GOTO-ANALYZER " CBMC_VERSION) { } diff --git a/src/goto-analyzer/goto_analyzer_parse_options.h b/src/goto-analyzer/goto_analyzer_parse_options.h index 5d61256b1f2..3fbaab18b1b 100644 --- a/src/goto-analyzer/goto_analyzer_parse_options.h +++ b/src/goto-analyzer/goto_analyzer_parse_options.h @@ -15,8 +15,6 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include - #include #include @@ -52,7 +50,7 @@ class optionst; class goto_analyzer_parse_optionst: public parse_options_baset, - public language_uit + public messaget { public: virtual int doit() override; @@ -72,6 +70,11 @@ class goto_analyzer_parse_optionst: bool set_properties(); void eval_verbosity(); + + ui_message_handlert::uit get_ui() + { + return ui_message_handler.get_ui(); + } }; #endif // CPROVER_GOTO_ANALYZER_GOTO_ANALYZER_PARSE_OPTIONS_H diff --git a/src/goto-cc/compile.h b/src/goto-cc/compile.h index b0c61d137a3..4ae2a2eb0e0 100644 --- a/src/goto-cc/compile.h +++ b/src/goto-cc/compile.h @@ -18,7 +18,7 @@ Date: June 2006 #include #include -#include +#include class compilet:public language_uit { @@ -67,6 +67,7 @@ class compilet:public language_uit const std::string &, const symbol_tablet &, goto_functionst &); + bool write_bin_object_file( const std::string &, const symbol_tablet &, diff --git a/src/goto-diff/goto_diff_parse_options.cpp b/src/goto-diff/goto_diff_parse_options.cpp index c0be3f06694..28a2b017ed1 100644 --- a/src/goto-diff/goto_diff_parse_options.cpp +++ b/src/goto-diff/goto_diff_parse_options.cpp @@ -431,14 +431,14 @@ bool goto_diff_parse_optionst::process_goto_program( // show it? if(cmdline.isset("show-loops")) { - show_loop_ids(get_ui(), goto_functions); + show_loop_ids(get_ui(), goto_model); return true; } // show it? if(cmdline.isset("show-goto-functions")) { - show_goto_functions(ns, get_ui(), goto_functions); + show_goto_functions(goto_model, get_ui()); return true; } } diff --git a/src/goto-instrument/accelerate/accelerate.cpp b/src/goto-instrument/accelerate/accelerate.cpp index cd74e16a9d1..199ea59de21 100644 --- a/src/goto-instrument/accelerate/accelerate.cpp +++ b/src/goto-instrument/accelerate/accelerate.cpp @@ -650,14 +650,13 @@ int acceleratet::accelerate_loops() void accelerate_functions( - goto_functionst &functions, - symbol_tablet &symbol_table, + goto_modelt &goto_model, bool use_z3) { - Forall_goto_functions(it, functions) + Forall_goto_functions(it, goto_model.goto_functions) { std::cout << "Accelerating function " << it->first << '\n'; - acceleratet accelerate(it->second.body, functions, symbol_table, use_z3); + acceleratet accelerate(it->second.body, goto_model, use_z3); int num_accelerated=accelerate.accelerate_loops(); diff --git a/src/goto-instrument/accelerate/accelerate.h b/src/goto-instrument/accelerate/accelerate.h index d3aac4ac124..000fec39dbb 100644 --- a/src/goto-instrument/accelerate/accelerate.h +++ b/src/goto-instrument/accelerate/accelerate.h @@ -30,13 +30,12 @@ class acceleratet { public: acceleratet(goto_programt &_program, - goto_functionst &_goto_functions, - symbol_tablet &_symbol_table, - bool _use_z3) : + goto_modelt &_goto_model, + bool _use_z3): program(_program), - goto_functions(_goto_functions), - symbol_table(_symbol_table), - ns(symbol_table), + goto_functions(_goto_model.goto_functions), + symbol_table(_goto_model.symbol_table), + ns(_goto_model.symbol_table), utils(symbol_table, goto_functions), use_z3(_use_z3) { @@ -117,8 +116,7 @@ class acceleratet }; void accelerate_functions( - goto_functionst &functions, - symbol_tablet &ns, + goto_modelt &, bool use_z3); #endif // CPROVER_GOTO_INSTRUMENT_ACCELERATE_ACCELERATE_H diff --git a/src/goto-instrument/branch.cpp b/src/goto-instrument/branch.cpp index e224a59265e..54abd3ed07e 100644 --- a/src/goto-instrument/branch.cpp +++ b/src/goto-instrument/branch.cpp @@ -17,11 +17,10 @@ Author: Daniel Kroening, kroening@kroening.com #include "function.h" void branch( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const irep_idt &id) { - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) { // don't instrument our internal functions if(has_prefix(id2string(f_it->first), CPROVER_PREFIX)) @@ -53,7 +52,7 @@ void branch( goto_programt::targett t1=body.insert_after(i_it); t1->make_function_call( - function_to_call(symbol_table, id, "taken")); + function_to_call(goto_model.symbol_table, id, "taken")); t1->function=f_it->first; goto_programt::targett t2=body.insert_after(t1); @@ -62,7 +61,7 @@ void branch( goto_programt::targett t3=body.insert_after(t2); t3->make_function_call( - function_to_call(symbol_table, id, "not-taken")); + function_to_call(goto_model.symbol_table, id, "not-taken")); t3->function=f_it->first; i_it->targets.clear(); i_it->targets.push_back(t3); diff --git a/src/goto-instrument/branch.h b/src/goto-instrument/branch.h index 842f3092b7a..dd6f1d2d85d 100644 --- a/src/goto-instrument/branch.h +++ b/src/goto-instrument/branch.h @@ -12,11 +12,12 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_BRANCH_H #define CPROVER_GOTO_INSTRUMENT_BRANCH_H -#include +#include + +class goto_modelt; void branch( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, const irep_idt &id); #endif // CPROVER_GOTO_INSTRUMENT_BRANCH_H diff --git a/src/goto-instrument/call_sequences.cpp b/src/goto-instrument/call_sequences.cpp index 7c8ed65a918..29236975364 100644 --- a/src/goto-instrument/call_sequences.cpp +++ b/src/goto-instrument/call_sequences.cpp @@ -20,6 +20,8 @@ Date: April 2013 #include #include +#include + void show_call_sequences( const irep_idt &function, const goto_programt &goto_program, @@ -97,11 +99,11 @@ void show_call_sequences( std::cout << '\n'; } -void show_call_sequences(const goto_functionst &goto_functions) +void show_call_sequences(const goto_modelt &goto_model) { // do per function - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) show_call_sequences(f_it->first, f_it->second.body); } @@ -109,9 +111,9 @@ class check_call_sequencet { public: explicit check_call_sequencet( - const goto_functionst &_goto_functions, + const goto_modelt &_goto_model, const std::vector &_sequence): - goto_functions(_goto_functions), + goto_functions(_goto_model.goto_functions), sequence(_sequence) { } @@ -281,7 +283,7 @@ void check_call_sequencet::operator()() std::cout << "sequence not feasible\n"; } -void check_call_sequence(const goto_functionst &goto_functions) +void check_call_sequence(const goto_modelt &goto_model) { // read the sequence from stdin @@ -297,7 +299,7 @@ void check_call_sequence(const goto_functionst &goto_functions) sequence.push_back(line); } - check_call_sequencet(goto_functions, sequence)(); + check_call_sequencet(goto_model, sequence)(); } static void list_calls_and_arguments( @@ -346,12 +348,12 @@ static void list_calls_and_arguments( } } -void list_calls_and_arguments( - const namespacet &ns, - const goto_functionst &goto_functions) +void list_calls_and_arguments(const goto_modelt &goto_model) { // do per function - forall_goto_functions(f_it, goto_functions) + const namespacet ns(goto_model.symbol_table); + + forall_goto_functions(f_it, goto_model.goto_functions) list_calls_and_arguments(ns, f_it->first, f_it->second.body); } diff --git a/src/goto-instrument/call_sequences.h b/src/goto-instrument/call_sequences.h index 7d432ddbb4b..55cd164b252 100644 --- a/src/goto-instrument/call_sequences.h +++ b/src/goto-instrument/call_sequences.h @@ -14,13 +14,10 @@ Date: September 2011 #ifndef CPROVER_GOTO_INSTRUMENT_CALL_SEQUENCES_H #define CPROVER_GOTO_INSTRUMENT_CALL_SEQUENCES_H -#include +class goto_modelt; -void show_call_sequences(const goto_functionst &goto_functions); -void check_call_sequence(const goto_functionst &goto_functions); - -void list_calls_and_arguments( - const namespacet &ns, - const goto_functionst &goto_functions); +void show_call_sequences(const goto_modelt &); +void check_call_sequence(const goto_modelt &); +void list_calls_and_arguments(const goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_CALL_SEQUENCES_H diff --git a/src/goto-instrument/code_contracts.cpp b/src/goto-instrument/code_contracts.cpp index 5b118d36455..a33b0934349 100644 --- a/src/goto-instrument/code_contracts.cpp +++ b/src/goto-instrument/code_contracts.cpp @@ -400,9 +400,7 @@ void code_contractst::operator()() goto_functions.update(); } -void code_contracts( - symbol_tablet &symbol_table, - goto_functionst &goto_functions) +void code_contracts(goto_modelt &goto_model) { - code_contractst(symbol_table, goto_functions)(); + code_contractst(goto_model.symbol_table, goto_model.goto_functions)(); } diff --git a/src/goto-instrument/code_contracts.h b/src/goto-instrument/code_contracts.h index 006f4702480..dc02902c142 100644 --- a/src/goto-instrument/code_contracts.h +++ b/src/goto-instrument/code_contracts.h @@ -14,11 +14,8 @@ Date: February 2016 #ifndef CPROVER_GOTO_INSTRUMENT_CODE_CONTRACTS_H #define CPROVER_GOTO_INSTRUMENT_CODE_CONTRACTS_H -class goto_functionst; -class symbol_tablet; +class goto_modelt; -void code_contracts( - symbol_tablet &symbol_table, - goto_functionst &goto_functions); +void code_contracts(goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_CODE_CONTRACTS_H diff --git a/src/goto-instrument/concurrency.cpp b/src/goto-instrument/concurrency.cpp index 579edc36ed8..12f491884a7 100644 --- a/src/goto-instrument/concurrency.cpp +++ b/src/goto-instrument/concurrency.cpp @@ -222,10 +222,9 @@ void concurrency_instrumentationt::instrument( void concurrency( value_setst &value_sets, - class symbol_tablet &symbol_table, - goto_functionst &goto_functions) + goto_modelt &goto_model) { concurrency_instrumentationt concurrency_instrumentation( - value_sets, symbol_table); - concurrency_instrumentation(goto_functions); + value_sets, goto_model.symbol_table); + concurrency_instrumentation(goto_model.goto_functions); } diff --git a/src/goto-instrument/concurrency.h b/src/goto-instrument/concurrency.h index cf09d4da68b..fafe98dcac7 100644 --- a/src/goto-instrument/concurrency.h +++ b/src/goto-instrument/concurrency.h @@ -15,11 +15,8 @@ Date: February 2006 #define CPROVER_GOTO_INSTRUMENT_CONCURRENCY_H #include -#include +#include -void concurrency( - value_setst &value_sets, - class symbol_tablet &symbol_table, - goto_functionst &goto_functions); +void concurrency(value_setst &, goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_CONCURRENCY_H diff --git a/src/goto-instrument/count_eloc.cpp b/src/goto-instrument/count_eloc.cpp index fa8cb858da6..ecd9c15ffbb 100644 --- a/src/goto-instrument/count_eloc.cpp +++ b/src/goto-instrument/count_eloc.cpp @@ -26,10 +26,10 @@ typedef std::unordered_map filest; typedef std::unordered_map working_dirst; static void collect_eloc( - const goto_functionst &goto_functions, + const goto_modelt &goto_model, working_dirst &dest) { - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) { forall_goto_program_instructions(it, f_it->second.body) { @@ -43,12 +43,12 @@ static void collect_eloc( } } -void count_eloc(const goto_functionst &goto_functions) +void count_eloc(const goto_modelt &goto_model) { std::size_t eloc=0; working_dirst eloc_map; - collect_eloc(goto_functions, eloc_map); + collect_eloc(goto_model, eloc_map); for(const std::pair &files : eloc_map) for(const std::pair &lines : files.second) @@ -57,10 +57,10 @@ void count_eloc(const goto_functionst &goto_functions) std::cout << "Effective lines of code: " << eloc << '\n'; } -void list_eloc(const goto_functionst &goto_functions) +void list_eloc(const goto_modelt &goto_model) { working_dirst eloc_map; - collect_eloc(goto_functions, eloc_map); + collect_eloc(goto_model, eloc_map); for(const std::pair &files : eloc_map) for(const std::pair &lines : files.second) @@ -74,13 +74,13 @@ void list_eloc(const goto_functionst &goto_functions) } } -void print_path_lengths(const goto_functionst &goto_functions) +void print_path_lengths(const goto_modelt &goto_model) { - const irep_idt &entry_point=goto_functions.entry_point(); + const irep_idt &entry_point=goto_model.goto_functions.entry_point(); goto_functionst::function_mapt::const_iterator start= - goto_functions.function_map.find(entry_point); + goto_model.goto_functions.function_map.find(entry_point); - if(start==goto_functions.function_map.end() || + if(start==goto_model.goto_functions.function_map.end() || !start->second.body_available()) { std::cout << "No entry point found, path length undefined\n"; @@ -98,7 +98,7 @@ void print_path_lengths(const goto_functionst &goto_functions) typedef cfg_baset cfgt; cfgt cfg; - cfg(goto_functions); + cfg(goto_model.goto_functions); const goto_programt &start_program=start->second.body; @@ -113,7 +113,7 @@ void print_path_lengths(const goto_functionst &goto_functions) << " instructions\n"; std::size_t n_loops=0, loop_ins=0; - forall_goto_functions(gf_it, goto_functions) + forall_goto_functions(gf_it, goto_model.goto_functions) forall_goto_program_instructions(i_it, gf_it->second.body) // loops or recursion if(i_it->is_backwards_goto() || diff --git a/src/goto-instrument/count_eloc.h b/src/goto-instrument/count_eloc.h index 38760038836..9a140eec52b 100644 --- a/src/goto-instrument/count_eloc.h +++ b/src/goto-instrument/count_eloc.h @@ -14,12 +14,10 @@ Date: December 2012 #ifndef CPROVER_GOTO_INSTRUMENT_COUNT_ELOC_H #define CPROVER_GOTO_INSTRUMENT_COUNT_ELOC_H -#include +#include -void count_eloc(const goto_functionst &goto_functions); - -void list_eloc(const goto_functionst &goto_functions); - -void print_path_lengths(const goto_functionst &goto_functions); +void count_eloc(const goto_modelt &); +void list_eloc(const goto_modelt &); +void print_path_lengths(const goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_COUNT_ELOC_H diff --git a/src/goto-instrument/document_properties.cpp b/src/goto-instrument/document_properties.cpp index 0a7e656bff0..5140459c025 100644 --- a/src/goto-instrument/document_properties.cpp +++ b/src/goto-instrument/document_properties.cpp @@ -17,6 +17,8 @@ Author: Daniel Kroening, kroening@kroening.com #include +#include + #define MAXWIDTH 62 class document_propertiest @@ -361,15 +363,15 @@ void document_propertiest::doit() } void document_properties_html( - const goto_functionst &goto_functions, + const goto_modelt &goto_model, std::ostream &out) { - document_propertiest(goto_functions, out).html(); + document_propertiest(goto_model.goto_functions, out).html(); } void document_properties_latex( - const goto_functionst &goto_functions, + const goto_modelt &goto_model, std::ostream &out) { - document_propertiest(goto_functions, out).latex(); + document_propertiest(goto_model.goto_functions, out).latex(); } diff --git a/src/goto-instrument/document_properties.h b/src/goto-instrument/document_properties.h index 35406ae2f30..45f1b147ca7 100644 --- a/src/goto-instrument/document_properties.h +++ b/src/goto-instrument/document_properties.h @@ -14,14 +14,14 @@ Author: Daniel Kroening, kroening@kroening.com #include -#include +class goto_modelt; void document_properties_latex( - const goto_functionst &goto_functions, + const goto_modelt &, std::ostream &out); void document_properties_html( - const goto_functionst &goto_functions, + const goto_modelt &, std::ostream &out); #endif // CPROVER_GOTO_INSTRUMENT_DOCUMENT_PROPERTIES_H diff --git a/src/goto-instrument/dot.cpp b/src/goto-instrument/dot.cpp index bf58fe12cd3..d011c10914a 100644 --- a/src/goto-instrument/dot.cpp +++ b/src/goto-instrument/dot.cpp @@ -25,11 +25,9 @@ Author: Daniel Kroening, kroening@kroening.com class dott { public: - dott( - const goto_functionst &_goto_functions, - const namespacet &_ns): - ns(_ns), - goto_functions(_goto_functions), + explicit dott( + const goto_modelt &_goto_model): + goto_model(_goto_model), subgraphscount(0) { } @@ -37,8 +35,7 @@ class dott void output(std::ostream &out); protected: - const namespacet &ns; - const goto_functionst &goto_functions; + const goto_modelt &goto_model; unsigned subgraphscount; @@ -91,6 +88,8 @@ void dott::write_dot_subgraph( } else { + const namespacet ns(goto_model.symbol_table); + std::set seen; goto_programt::const_targetst worklist; worklist.push_back(instructions.begin()); @@ -265,7 +264,7 @@ void dott::output(std::ostream &out) std::list clusters; - forall_goto_functions(it, goto_functions) + forall_goto_functions(it, goto_model.goto_functions) if(it->second.body_available()) write_dot_subgraph(out, id2string(it->first), it->second.body); @@ -350,11 +349,8 @@ void dott::write_edge( out << ";\n"; } -void dot( - const goto_functionst &src, - const namespacet &ns, - std::ostream &out) +void dot(const goto_modelt &src, std::ostream &out) { - dott dot(src, ns); + dott dot(src); dot.output(out); } diff --git a/src/goto-instrument/dot.h b/src/goto-instrument/dot.h index 1a5f84e319b..12d5f0edfbb 100644 --- a/src/goto-instrument/dot.h +++ b/src/goto-instrument/dot.h @@ -12,11 +12,12 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_DOT_H #define CPROVER_GOTO_INSTRUMENT_DOT_H -#include +#include + +#include void dot( - const goto_functionst &src, - const namespacet &ns, + const goto_modelt &, std::ostream &out); #endif // CPROVER_GOTO_INSTRUMENT_DOT_H diff --git a/src/goto-instrument/function.cpp b/src/goto-instrument/function.cpp index 6c62a07f4f7..5cf1883fb8f 100644 --- a/src/goto-instrument/function.cpp +++ b/src/goto-instrument/function.cpp @@ -79,11 +79,10 @@ code_function_callt function_to_call( } void function_enter( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const irep_idt &id) { - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) { // don't instrument our internal functions if(has_prefix(id2string(f_it->first), CPROVER_PREFIX)) @@ -100,17 +99,16 @@ void function_enter( goto_programt::targett t= body.insert_before(body.instructions.begin()); t->make_function_call( - function_to_call(symbol_table, id, f_it->first)); + function_to_call(goto_model.symbol_table, id, f_it->first)); t->function=f_it->first; } } void function_exit( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const irep_idt &id) { - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) { // don't instrument our internal functions if(has_prefix(id2string(f_it->first), CPROVER_PREFIX)) @@ -136,7 +134,7 @@ void function_exit( goto_programt::instructiont call; call.function=f_it->first; call.make_function_call( - function_to_call(symbol_table, id, f_it->first)); + function_to_call(goto_model.symbol_table, id, f_it->first)); body.insert_before_swap(i_it, call); // move on @@ -164,7 +162,7 @@ void function_exit( { goto_programt::instructiont call; call.make_function_call( - function_to_call(symbol_table, id, f_it->first)); + function_to_call(goto_model.symbol_table, id, f_it->first)); call.function=f_it->first; body.insert_before_swap(last, call); } diff --git a/src/goto-instrument/function.h b/src/goto-instrument/function.h index 88b486df6b0..101a0643e40 100644 --- a/src/goto-instrument/function.h +++ b/src/goto-instrument/function.h @@ -12,21 +12,19 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_FUNCTION_H #define CPROVER_GOTO_INSTRUMENT_FUNCTION_H -#include +#include class code_function_callt function_to_call( - symbol_tablet &symbol_table, + symbol_tablet &, const irep_idt &id, const irep_idt &argument); void function_enter( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, const irep_idt &id); void function_exit( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, const irep_idt &id); #endif // CPROVER_GOTO_INSTRUMENT_FUNCTION_H diff --git a/src/goto-instrument/goto_instrument_parse_options.cpp b/src/goto-instrument/goto_instrument_parse_options.cpp index be77888ad47..dacfa6c8077 100644 --- a/src/goto-instrument/goto_instrument_parse_options.cpp +++ b/src/goto-instrument/goto_instrument_parse_options.cpp @@ -199,10 +199,10 @@ int goto_instrument_parse_optionst::doit() } goto_unwindt goto_unwind; - goto_unwind(goto_functions, unwind_set, k, unwind_strategy); + goto_unwind(goto_model, unwind_set, k, unwind_strategy); - goto_functions.update(); - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.update(); + goto_model.goto_functions.compute_loop_numbers(); if(cmdline.isset("log")) { @@ -234,11 +234,11 @@ int goto_instrument_parse_optionst::doit() if(cmdline.isset("show-threaded")) { - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); - is_threadedt is_threaded(goto_functions); + is_threadedt is_threaded(goto_model); - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) { std::cout << "////\n"; std::cout << "//// Function: " << f_it->first << '\n'; @@ -261,14 +261,13 @@ int goto_instrument_parse_optionst::doit() do_partial_inlining(); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); status() << "Pointer Analysis" << eom; - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); value_set_analysist value_set_analysis(ns); - value_set_analysis(goto_functions); - - show_value_sets(get_ui(), goto_functions, value_set_analysis); + value_set_analysis(goto_model.goto_functions); + show_value_sets(get_ui(), goto_model, value_set_analysis); return 0; } @@ -277,15 +276,14 @@ int goto_instrument_parse_optionst::doit() do_indirect_call_and_rtti_removal(); do_partial_inlining(); do_remove_returns(); - parameter_assignments(symbol_table, goto_functions); + parameter_assignments(goto_model); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); - namespacet ns(symbol_table); global_may_alias_analysist global_may_alias_analysis; - global_may_alias_analysis(goto_functions, ns); - global_may_alias_analysis.output(ns, goto_functions, std::cout); + global_may_alias_analysis(goto_model); + global_may_alias_analysis.output(goto_model, std::cout); return 0; } @@ -294,14 +292,14 @@ int goto_instrument_parse_optionst::doit() { do_indirect_call_and_rtti_removal(); do_partial_inlining(); - parameter_assignments(symbol_table, goto_functions); + parameter_assignments(goto_model); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); - forall_goto_functions(it, goto_functions) + forall_goto_functions(it, goto_model.goto_functions) { local_bitvector_analysist local_bitvector_analysis(it->second); std::cout << ">>>>\n"; @@ -319,23 +317,22 @@ int goto_instrument_parse_optionst::doit() do_indirect_call_and_rtti_removal(); do_partial_inlining(); do_remove_returns(); - parameter_assignments(symbol_table, goto_functions); + parameter_assignments(goto_model); - remove_unused_functions(goto_functions, get_message_handler()); + remove_unused_functions(goto_model, get_message_handler()); if(!cmdline.isset("inline")) { - thread_exit_instrumentation(goto_functions); - mutex_init_instrumentation(symbol_table, goto_functions); + thread_exit_instrumentation(goto_model); + mutex_init_instrumentation(goto_model); } // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); - namespacet ns(symbol_table); custom_bitvector_analysist custom_bitvector_analysis; - custom_bitvector_analysis(goto_functions, ns); - custom_bitvector_analysis.output(ns, goto_functions, std::cout); + custom_bitvector_analysis(goto_model); + custom_bitvector_analysis.output(goto_model, std::cout); return 0; } @@ -345,17 +342,14 @@ int goto_instrument_parse_optionst::doit() do_indirect_call_and_rtti_removal(); do_partial_inlining(); do_remove_returns(); - parameter_assignments(symbol_table, goto_functions); + parameter_assignments(goto_model); // recalculate numbers, etc. - goto_functions.update(); - - namespacet ns(symbol_table); + goto_model.goto_functions.update(); escape_analysist escape_analysis; - escape_analysis(goto_functions, ns); - - escape_analysis.output(ns, goto_functions, std::cout); + escape_analysis(goto_model); + escape_analysis.output(goto_model, std::cout); return 0; } @@ -365,26 +359,25 @@ int goto_instrument_parse_optionst::doit() do_indirect_call_and_rtti_removal(); do_partial_inlining(); do_remove_returns(); - parameter_assignments(symbol_table, goto_functions); + parameter_assignments(goto_model); - remove_unused_functions(goto_functions, get_message_handler()); + remove_unused_functions(goto_model, get_message_handler()); if(!cmdline.isset("inline")) { - thread_exit_instrumentation(goto_functions); - mutex_init_instrumentation(symbol_table, goto_functions); + thread_exit_instrumentation(goto_model); + mutex_init_instrumentation(goto_model); } // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); custom_bitvector_analysist custom_bitvector_analysis; - custom_bitvector_analysis(goto_functions, ns); + custom_bitvector_analysis(goto_model); custom_bitvector_analysis.check( - ns, - goto_functions, + goto_model, cmdline.isset("xml-ui"), std::cout); @@ -397,13 +390,13 @@ int goto_instrument_parse_optionst::doit() do_partial_inlining(); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); status() << "Pointer Analysis" << eom; points_tot points_to; - points_to(goto_functions); + points_to(goto_model); points_to.output(std::cout); return 0; } @@ -414,27 +407,26 @@ int goto_instrument_parse_optionst::doit() do_partial_inlining(); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); status() << "Interval Analysis" << eom; - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); ait interval_analysis; - interval_analysis(goto_functions, ns); - - interval_analysis.output(ns, goto_functions, std::cout); + interval_analysis(goto_model); + interval_analysis.output(goto_model, std::cout); return 0; } if(cmdline.isset("show-call-sequences")) { - show_call_sequences(goto_functions); + show_call_sequences(goto_model); return 0; } if(cmdline.isset("check-call-sequence")) { do_remove_returns(); - check_call_sequence(goto_functions); + check_call_sequence(goto_model); return 0; } @@ -443,15 +435,14 @@ int goto_instrument_parse_optionst::doit() do_indirect_call_and_rtti_removal(); do_partial_inlining(); - namespacet ns(symbol_table); - list_calls_and_arguments(ns, goto_functions); + list_calls_and_arguments(goto_model); return 0; } if(cmdline.isset("show-rw-set")) { - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); if(!cmdline.isset("inline")) { @@ -459,24 +450,24 @@ int goto_instrument_parse_optionst::doit() do_partial_inlining(); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); } status() << "Pointer Analysis" << eom; value_set_analysist value_set_analysis(ns); - value_set_analysis(goto_functions); + value_set_analysis(goto_model.goto_functions); const symbolt &symbol=ns.lookup(ID_main); symbol_exprt main(symbol.name, symbol.type); std::cout << - rw_set_functiont(value_set_analysis, ns, goto_functions, main); + rw_set_functiont(value_set_analysis, goto_model, main); return 0; } if(cmdline.isset("show-symbol-table")) { - show_symbol_table(); + show_symbol_table(goto_model, get_ui()); return 0; } @@ -484,11 +475,10 @@ int goto_instrument_parse_optionst::doit() { do_indirect_call_and_rtti_removal(); - const namespacet ns(symbol_table); + const namespacet ns(goto_model.symbol_table); reaching_definitions_analysist rd_analysis(ns); - rd_analysis(goto_functions, ns); - - rd_analysis.output(ns, goto_functions, std::cout); + rd_analysis(goto_model); + rd_analysis.output(goto_model, std::cout); return 0; } @@ -497,11 +487,10 @@ int goto_instrument_parse_optionst::doit() { do_indirect_call_and_rtti_removal(); - const namespacet ns(symbol_table); + const namespacet ns(goto_model.symbol_table); dependence_grapht dependence_graph(ns); - dependence_graph(goto_functions, ns); - - dependence_graph.output(ns, goto_functions, std::cout); + dependence_graph(goto_model); + dependence_graph.output(goto_model, std::cout); dependence_graph.output_dot(std::cout); return 0; @@ -509,79 +498,78 @@ int goto_instrument_parse_optionst::doit() if(cmdline.isset("count-eloc")) { - count_eloc(goto_functions); + count_eloc(goto_model); return 0; } if(cmdline.isset("list-eloc")) { - list_eloc(goto_functions); + list_eloc(goto_model); return 0; } if(cmdline.isset("print-path-lengths")) { - print_path_lengths(goto_functions); + print_path_lengths(goto_model); return 0; } if(cmdline.isset("list-symbols")) { - show_symbol_table(true); + show_symbol_table_brief(goto_model, get_ui()); return 0; } if(cmdline.isset("show-uninitialized")) { - show_uninitialized(symbol_table, goto_functions, std::cout); + show_uninitialized(goto_model, std::cout); return 0; } if(cmdline.isset("interpreter")) { status() << "Starting interpreter" << eom; - interpreter(symbol_table, goto_functions, get_message_handler()); + interpreter(goto_model, get_message_handler()); return 0; } if(cmdline.isset("show-claims") || cmdline.isset("show-properties")) { - const namespacet ns(symbol_table); - show_properties(ns, get_ui(), goto_functions); + const namespacet ns(goto_model.symbol_table); + show_properties(goto_model, get_ui()); return 0; } if(cmdline.isset("document-claims-html") || cmdline.isset("document-properties-html")) { - document_properties_html(goto_functions, std::cout); + document_properties_html(goto_model, std::cout); return 0; } if(cmdline.isset("document-claims-latex") || cmdline.isset("document-properties-latex")) { - document_properties_latex(goto_functions, std::cout); + document_properties_latex(goto_model, std::cout); return 0; } if(cmdline.isset("show-loops")) { - show_loop_ids(get_ui(), goto_functions); + show_loop_ids(get_ui(), goto_model); return 0; } if(cmdline.isset("show-natural-loops")) { - const namespacet ns(symbol_table); - show_natural_loops(goto_functions); + show_natural_loops(goto_model); return 0; } if(cmdline.isset("print-internal-representation")) { - for(auto const &pair : goto_functions.function_map) + for(auto const &pair : goto_model.goto_functions.function_map) for(auto const &ins : pair.second.body.instructions) { if(ins.code.is_not_nil()) @@ -594,28 +582,27 @@ int goto_instrument_parse_optionst::doit() if(cmdline.isset("show-goto-functions")) { - namespacet ns(symbol_table); - show_goto_functions(ns, get_ui(), goto_functions); + namespacet ns(goto_model.symbol_table); + show_goto_functions(goto_model, get_ui()); return 0; } if(cmdline.isset("list-undefined-functions")) { - const namespacet ns(symbol_table); - list_undefined_functions(goto_functions, ns, std::cout); + list_undefined_functions(goto_model, std::cout); return 0; } // experimental: print structs if(cmdline.isset("show-struct-alignment")) { - print_struct_alignment_problems(symbol_table, std::cout); + print_struct_alignment_problems(goto_model.symbol_table, std::cout); return 0; } if(cmdline.isset("show-locations")) { - show_locations(get_ui(), goto_functions); + show_locations(get_ui(), goto_model); return 0; } @@ -625,11 +612,11 @@ int goto_instrument_parse_optionst::doit() const bool h_libc=!cmdline.isset("no-system-headers"); const bool h_all=cmdline.isset("use-all-headers"); const bool harness=cmdline.isset("harness"); - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); // restore RETURN instructions in case remove_returns had been // applied - restore_returns(symbol_table, goto_functions); + restore_returns(goto_model); if(cmdline.args.size()==2) { @@ -644,7 +631,7 @@ int goto_instrument_parse_optionst::doit() return 10; } (is_cpp ? dump_cpp : dump_c)( - goto_functions, + goto_model.goto_functions, h_libc, h_all, harness, @@ -653,7 +640,7 @@ int goto_instrument_parse_optionst::doit() } else (is_cpp ? dump_cpp : dump_c)( - goto_functions, + goto_model.goto_functions, h_libc, h_all, harness, @@ -665,7 +652,7 @@ int goto_instrument_parse_optionst::doit() if(cmdline.isset("call-graph")) { - call_grapht call_graph(goto_functions); + call_grapht call_graph(goto_model); if(cmdline.isset("xml")) call_graph.output_xml(std::cout); @@ -679,7 +666,7 @@ int goto_instrument_parse_optionst::doit() if(cmdline.isset("dot")) { - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); if(cmdline.args.size()==2) { @@ -694,10 +681,10 @@ int goto_instrument_parse_optionst::doit() return 10; } - dot(goto_functions, ns, out); + dot(goto_model, out); } else - dot(goto_functions, ns, std::cout); + dot(goto_model, std::cout); return 0; } @@ -706,21 +693,21 @@ int goto_instrument_parse_optionst::doit() { do_indirect_call_and_rtti_removal(); - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); status() << "Performing full inlining" << eom; - goto_inline(goto_functions, ns, ui_message_handler); + goto_inline(goto_model, get_message_handler()); status() << "Accelerating" << eom; - accelerate_functions(goto_functions, symbol_table, cmdline.isset("z3")); - remove_skip(goto_functions); - goto_functions.update(); + accelerate_functions(goto_model, cmdline.isset("z3")); + remove_skip(goto_model); + goto_model.goto_functions.update(); } if(cmdline.isset("horn-encoding")) { status() << "Horn-clause encoding" << eom; - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); if(cmdline.args.size()==2) { @@ -737,10 +724,10 @@ int goto_instrument_parse_optionst::doit() return 1; } - horn_encoding(goto_functions, ns, out); + horn_encoding(goto_model, out); } else - horn_encoding(goto_functions, ns, std::cout); + horn_encoding(goto_model, std::cout); return 0; } @@ -750,14 +737,13 @@ int goto_instrument_parse_optionst::doit() do_indirect_call_and_rtti_removal(); status() << "Removing unused functions" << eom; - remove_unused_functions(goto_functions, get_message_handler()); + remove_unused_functions(goto_model.goto_functions, get_message_handler()); } if(cmdline.isset("undefined-function-is-assume-false")) { do_indirect_call_and_rtti_removal(); - - undefined_function_abort_path(goto_functions); + undefined_function_abort_path(goto_model); } // write new binary? @@ -766,7 +752,7 @@ int goto_instrument_parse_optionst::doit() status() << "Writing GOTO program to `" << cmdline.args[1] << "'" << eom; if(write_goto_binary( - cmdline.args[1], symbol_table, goto_functions, get_message_handler())) + cmdline.args[1], goto_model, get_message_handler())) return 1; else return 0; @@ -812,16 +798,15 @@ void goto_instrument_parse_optionst::do_indirect_call_and_rtti_removal( status() << "Function Pointer Removal" << eom; remove_function_pointers( get_message_handler(), - symbol_table, - goto_functions, + goto_model, cmdline.isset("pointer-check")); status() << "Virtual function removal" << eom; - remove_virtual_functions(symbol_table, goto_functions); + remove_virtual_functions(goto_model); status() << "Catch and throw removal" << eom; // This introduces instanceof, so order is important: - remove_exceptions(symbol_table, goto_functions); + remove_exceptions(goto_model); status() << "Java instanceof removal" << eom; - remove_instanceof(symbol_table, goto_functions); + remove_instanceof(goto_model); } /// Remove function pointers that can be resolved by analysing const variables @@ -839,8 +824,7 @@ void goto_instrument_parse_optionst::do_remove_const_function_pointers_only() status() << "Removing const function pointers only" << eom; remove_function_pointers( get_message_handler(), - symbol_table, - goto_functions, + goto_model, cmdline.isset("pointer-check"), true); // abort if we can't resolve via const pointers } @@ -855,8 +839,7 @@ void goto_instrument_parse_optionst::do_partial_inlining() if(!cmdline.isset("inline")) { status() << "Partial Inlining" << eom; - const namespacet ns(symbol_table); - goto_partial_inline(goto_functions, ns, ui_message_handler); + goto_partial_inline(goto_model, ui_message_handler); } } @@ -868,7 +851,7 @@ void goto_instrument_parse_optionst::do_remove_returns() remove_returns_done=true; status() << "Removing returns" << eom; - remove_returns(symbol_table, goto_functions); + remove_returns(goto_model); } void goto_instrument_parse_optionst::get_goto_program() @@ -876,7 +859,7 @@ void goto_instrument_parse_optionst::get_goto_program() status() << "Reading GOTO program from `" << cmdline.args[0] << "'" << eom; if(read_goto_binary(cmdline.args[0], - symbol_table, goto_functions, get_message_handler())) + goto_model, get_message_handler())) throw 0; config.set(cmdline); @@ -929,13 +912,13 @@ void goto_instrument_parse_optionst::instrument_goto_program() { status() << "Adding gotos to skip loops" << eom; if(skip_loops( - goto_functions, + goto_model, cmdline.get_value("skip-loops"), get_message_handler())) throw 0; } - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); // initialize argv with valid pointers if(cmdline.isset("model-argc-argv")) @@ -946,8 +929,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Adding up to " << max_argc << " command line arguments" << eom; if(model_argc_argv( - symbol_table, - goto_functions, + goto_model, max_argc, get_message_handler())) throw 0; @@ -956,8 +938,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() if(cmdline.isset("remove-function-body")) { remove_functions( - symbol_table, - goto_functions, + goto_model, cmdline.get_values("remove-function-body"), get_message_handler()); } @@ -972,7 +953,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() config.ansi_c.defines.push_back("__CPROVER_CUSTOM_BITVECTOR_ANALYSIS"); // add the library - link_to_library(symbol_table, goto_functions, ui_message_handler); + link_to_library(goto_model, get_message_handler()); } // now do full inlining, if requested @@ -984,12 +965,12 @@ void goto_instrument_parse_optionst::instrument_goto_program() cmdline.isset("custom-bitvector-analysis")) { do_remove_returns(); - thread_exit_instrumentation(goto_functions); - mutex_init_instrumentation(symbol_table, goto_functions); + thread_exit_instrumentation(goto_model); + mutex_init_instrumentation(goto_model); } status() << "Performing full inlining" << eom; - goto_inline(goto_functions, ns, ui_message_handler); + goto_inline(goto_model, get_message_handler()); } if(cmdline.isset("show-custom-bitvector-analysis") || @@ -998,8 +979,8 @@ void goto_instrument_parse_optionst::instrument_goto_program() do_partial_inlining(); status() << "Propagating Constants" << eom; - constant_propagator_ait constant_propagator_ai(goto_functions, ns); - remove_skip(goto_functions); + constant_propagator_ait constant_propagator_ai(goto_model); + remove_skip(goto_model); } if(cmdline.isset("escape-analysis")) @@ -1007,28 +988,28 @@ void goto_instrument_parse_optionst::instrument_goto_program() do_indirect_call_and_rtti_removal(); do_partial_inlining(); do_remove_returns(); - parameter_assignments(symbol_table, goto_functions); + parameter_assignments(goto_model); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); status() << "Escape Analysis" << eom; escape_analysist escape_analysis; - escape_analysis(goto_functions, ns); - escape_analysis.instrument(goto_functions, ns); + escape_analysis(goto_model); + escape_analysis.instrument(goto_model); // inline added functions, they are often small - goto_partial_inline(goto_functions, ns, ui_message_handler); + goto_partial_inline(goto_model, get_message_handler()); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); } // verify and set invariants and pre/post-condition pairs if(cmdline.isset("apply-code-contracts")) { status() << "Applying Code Contracts" << eom; - code_contracts(symbol_table, goto_functions); + code_contracts(goto_model); } // replace function pointers, if explicitly requested @@ -1055,9 +1036,8 @@ void goto_instrument_parse_optionst::instrument_goto_program() if(!cmdline.isset("log")) { goto_function_inline( - goto_functions, + goto_model, function, - ns, ui_message_handler, true, caching); @@ -1069,9 +1049,8 @@ void goto_instrument_parse_optionst::instrument_goto_program() jsont result= goto_function_inline_and_log( - goto_functions, + goto_model, function, - ns, ui_message_handler, true, caching); @@ -1095,8 +1074,8 @@ void goto_instrument_parse_optionst::instrument_goto_program() } } - goto_functions.update(); - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.update(); + goto_model.goto_functions.compute_loop_numbers(); } if(cmdline.isset("partial-inline")) @@ -1104,10 +1083,10 @@ void goto_instrument_parse_optionst::instrument_goto_program() do_indirect_call_and_rtti_removal(); status() << "Partial inlining" << eom; - goto_partial_inline(goto_functions, ns, ui_message_handler, true); + goto_partial_inline(goto_model, get_message_handler(), true); - goto_functions.update(); - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.update(); + goto_model.goto_functions.compute_loop_numbers(); } // now do full inlining, if requested @@ -1119,12 +1098,12 @@ void goto_instrument_parse_optionst::instrument_goto_program() cmdline.isset("custom-bitvector-analysis")) { do_remove_returns(); - thread_exit_instrumentation(goto_functions); - mutex_init_instrumentation(symbol_table, goto_functions); + thread_exit_instrumentation(goto_model); + mutex_init_instrumentation(goto_model); } status() << "Performing full inlining" << eom; - goto_inline(goto_functions, ns, ui_message_handler, true); + goto_inline(goto_model, get_message_handler(), true); } if(cmdline.isset("constant-propagator")) @@ -1133,19 +1112,18 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Propagating Constants" << eom; - constant_propagator_ait constant_propagator_ai(goto_functions, ns); - - remove_skip(goto_functions); + constant_propagator_ait constant_propagator_ai(goto_model); + remove_skip(goto_model); } // add generic checks, if needed - goto_check(ns, options, goto_functions); + goto_check(options, goto_model); // check for uninitalized local variables if(cmdline.isset("uninitialized-check")) { status() << "Adding checks for uninitialized local variables" << eom; - add_uninitialized_locals_assertions(symbol_table, goto_functions); + add_uninitialized_locals_assertions(goto_model); } // check for maximum call stack size @@ -1153,8 +1131,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() { status() << "Adding check for maximum call stack size" << eom; stack_depth( - symbol_table, - goto_functions, + goto_model, unsafe_string2unsigned(cmdline.get_value("stack-depth"))); } @@ -1164,14 +1141,14 @@ void goto_instrument_parse_optionst::instrument_goto_program() { status() << "Adding nondeterministic initialization of static/global " "variables" << eom; - nondet_static(ns, goto_functions); + nondet_static(goto_model); } if(cmdline.isset("slice-global-inits")) { status() << "Slicing away initializations of unused global variables" << eom; - slice_global_inits(ns, goto_functions); + slice_global_inits(goto_model); } if(cmdline.isset("string-abstraction")) @@ -1181,9 +1158,8 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "String Abstraction" << eom; string_abstraction( - symbol_table, - get_message_handler(), - goto_functions); + goto_model, + get_message_handler()); } // some analyses require function pointer removal and partial inlining @@ -1199,25 +1175,19 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Pointer Analysis" << eom; value_set_analysist value_set_analysis(ns); - value_set_analysis(goto_functions); + value_set_analysis(goto_model.goto_functions); if(cmdline.isset("remove-pointers")) { // removing pointers status() << "Removing Pointers" << eom; - remove_pointers( - goto_functions, - symbol_table, - value_set_analysis); + remove_pointers(goto_model, value_set_analysis); } if(cmdline.isset("race-check")) { status() << "Adding Race Checks" << eom; - race_check( - value_set_analysis, - symbol_table, - goto_functions); + race_check(value_set_analysis, goto_model); } if(cmdline.isset("mm")) @@ -1225,8 +1195,8 @@ void goto_instrument_parse_optionst::instrument_goto_program() // TODO: move to wmm/weak_mem, and copy goto_functions AFTER some of the // modifications. Do the analysis on the copy, after remove_asm, and // instrument the original (without remove_asm) - remove_asm(symbol_table, goto_functions); - goto_functions.update(); + remove_asm(goto_model); + goto_model.goto_functions.update(); std::string mm=cmdline.get_value("mm"); memory_modelt model; @@ -1294,8 +1264,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() weak_memory( model, value_set_analysis, - symbol_table, - goto_functions, + goto_model, cmdline.isset("scc"), inst_strategy, unwind_loops, @@ -1319,8 +1288,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Instrumenting interrupt handler" << eom; interrupt( value_set_analysis, - symbol_table, - goto_functions, + goto_model, cmdline.get_value("isr")); } @@ -1328,32 +1296,26 @@ void goto_instrument_parse_optionst::instrument_goto_program() if(cmdline.isset("mmio")) { status() << "Instrumenting memory-mapped I/O" << eom; - mmio( - value_set_analysis, - symbol_table, - goto_functions); + mmio(value_set_analysis, goto_model); } if(cmdline.isset("concurrency")) { status() << "Sequentializing concurrency" << eom; - concurrency( - value_set_analysis, - symbol_table, - goto_functions); + concurrency(value_set_analysis, goto_model); } } if(cmdline.isset("interval-analysis")) { status() << "Interval analysis" << eom; - interval_analysis(ns, goto_functions); + interval_analysis(goto_model); } if(cmdline.isset("havoc-loops")) { status() << "Havocking loops" << eom; - havoc_loops(goto_functions); + havoc_loops(goto_model); } if(cmdline.isset("k-induction")) @@ -1374,15 +1336,14 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Instrumenting k-induction for k=" << k << ", " << (base_case?"base case":"step case") << eom; - k_induction(goto_functions, base_case, step_case, k); + k_induction(goto_model, base_case, step_case, k); } if(cmdline.isset("function-enter")) { status() << "Function enter instrumentation" << eom; function_enter( - symbol_table, - goto_functions, + goto_model, cmdline.get_value("function-enter")); } @@ -1390,8 +1351,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() { status() << "Function exit instrumentation" << eom; function_exit( - symbol_table, - goto_functions, + goto_model, cmdline.get_value("function-exit")); } @@ -1399,28 +1359,27 @@ void goto_instrument_parse_optionst::instrument_goto_program() { status() << "Branch instrumentation" << eom; branch( - symbol_table, - goto_functions, + goto_model, cmdline.get_value("branch")); } // add failed symbols - add_failed_symbols(symbol_table); + add_failed_symbols(goto_model.symbol_table); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); // add loop ids - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.compute_loop_numbers(); // label the assertions - label_properties(goto_functions); + label_properties(goto_model); // nondet volatile? if(cmdline.isset("nondet-volatile")) { status() << "Making volatile variables non-deterministic" << eom; - nondet_volatile(symbol_table, goto_functions); + nondet_volatile(goto_model); } // reachability slice? @@ -1430,9 +1389,9 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Performing a reachability slice" << eom; if(cmdline.isset("property")) - reachability_slicer(goto_functions, cmdline.get_values("property")); + reachability_slicer(goto_model, cmdline.get_values("property")); else - reachability_slicer(goto_functions); + reachability_slicer(goto_model); } // full slice? @@ -1443,13 +1402,13 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Performing a full slice" << eom; if(cmdline.isset("property")) - property_slicer(goto_functions, ns, cmdline.get_values("property")); + property_slicer(goto_model, cmdline.get_values("property")); else - full_slicer(goto_functions, ns); + full_slicer(goto_model); } // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); } /// display command line help diff --git a/src/goto-instrument/goto_instrument_parse_options.h b/src/goto-instrument/goto_instrument_parse_options.h index 25ed2ce4cee..5dc2c017d41 100644 --- a/src/goto-instrument/goto_instrument_parse_options.h +++ b/src/goto-instrument/goto_instrument_parse_options.h @@ -116,7 +116,12 @@ class goto_instrument_parse_optionst: bool partial_inlining_done; bool remove_returns_done; - goto_functionst goto_functions; + goto_modelt goto_model; + + ui_message_handlert::uit get_ui() + { + return ui_message_handler.get_ui(); + } }; #endif // CPROVER_GOTO_INSTRUMENT_GOTO_INSTRUMENT_PARSE_OPTIONS_H diff --git a/src/goto-instrument/havoc_loops.cpp b/src/goto-instrument/havoc_loops.cpp index d612a31fc03..01bc2701dd8 100644 --- a/src/goto-instrument/havoc_loops.cpp +++ b/src/goto-instrument/havoc_loops.cpp @@ -184,10 +184,10 @@ void havoc_loopst::havoc_loops() havoc_loop(loop.first, loop.second); } -void havoc_loops(goto_functionst &goto_functions) +void havoc_loops(goto_modelt &goto_model) { - function_modifiest function_modifies(goto_functions); + function_modifiest function_modifies(goto_model.goto_functions); - Forall_goto_functions(it, goto_functions) + Forall_goto_functions(it, goto_model.goto_functions) havoc_loopst(function_modifies, it->second); } diff --git a/src/goto-instrument/havoc_loops.h b/src/goto-instrument/havoc_loops.h index dc3245a1162..42edd24d4b9 100644 --- a/src/goto-instrument/havoc_loops.h +++ b/src/goto-instrument/havoc_loops.h @@ -12,8 +12,8 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_HAVOC_LOOPS_H #define CPROVER_GOTO_INSTRUMENT_HAVOC_LOOPS_H -#include +class goto_modelt; -void havoc_loops(goto_functionst &goto_functions); +void havoc_loops(goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_HAVOC_LOOPS_H diff --git a/src/goto-instrument/horn_encoding.cpp b/src/goto-instrument/horn_encoding.cpp index 31fcb187848..bccce9a0580 100644 --- a/src/goto-instrument/horn_encoding.cpp +++ b/src/goto-instrument/horn_encoding.cpp @@ -16,8 +16,7 @@ Date: June 2015 #include void horn_encoding( - const goto_functionst &, - const namespacet &, + const goto_modelt &, std::ostream &out) { } diff --git a/src/goto-instrument/horn_encoding.h b/src/goto-instrument/horn_encoding.h index 44160c35ceb..c1f8fb5fc60 100644 --- a/src/goto-instrument/horn_encoding.h +++ b/src/goto-instrument/horn_encoding.h @@ -14,11 +14,10 @@ Module: Horn-clause Encoding #include -#include +#include void horn_encoding( - const goto_functionst &, - const namespacet &, + const goto_modelt &, std::ostream &out); #endif // CPROVER_GOTO_INSTRUMENT_HORN_ENCODING_H diff --git a/src/goto-instrument/interrupt.cpp b/src/goto-instrument/interrupt.cpp index 38a5a258ff6..23bf63eb1a4 100644 --- a/src/goto-instrument/interrupt.cpp +++ b/src/goto-instrument/interrupt.cpp @@ -189,30 +189,29 @@ symbol_exprt get_isr( void interrupt( value_setst &value_sets, - const symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const irep_idt &interrupt_handler) { // look up the ISR - symbol_exprt isr=get_isr(symbol_table, interrupt_handler); + symbol_exprt isr= + get_isr(goto_model.symbol_table, interrupt_handler); // we first figure out which objects are read/written by the ISR - const namespacet ns(symbol_table); rw_set_functiont isr_rw_set( - value_sets, ns, goto_functions, isr); + value_sets, goto_model, isr); // now instrument - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) if(f_it->first!=CPROVER_PREFIX "initialize" && f_it->first!=goto_functionst::entry_point() && f_it->first!=isr.get_identifier()) interrupt( - value_sets, symbol_table, + value_sets, goto_model.symbol_table, #ifdef LOCAL_MAY f_it->second, #endif f_it->second.body, isr, isr_rw_set); - goto_functions.update(); + goto_model.goto_functions.update(); } diff --git a/src/goto-instrument/interrupt.h b/src/goto-instrument/interrupt.h index 711c4fa32df..775357c2a84 100644 --- a/src/goto-instrument/interrupt.h +++ b/src/goto-instrument/interrupt.h @@ -14,15 +14,13 @@ Date: September 2011 #ifndef CPROVER_GOTO_INSTRUMENT_INTERRUPT_H #define CPROVER_GOTO_INSTRUMENT_INTERRUPT_H -class symbol_tablet; -class goto_functionst; +class goto_modelt; #include "rw_set.h" void interrupt( - value_setst &value_sets, - const class symbol_tablet &symbol_table, - goto_functionst &goto_functions, + value_setst &, + goto_modelt &, const irep_idt &interrupt_handler); #endif // CPROVER_GOTO_INSTRUMENT_INTERRUPT_H diff --git a/src/goto-instrument/k_induction.cpp b/src/goto-instrument/k_induction.cpp index 9a018e1c331..900057f9f8b 100644 --- a/src/goto-instrument/k_induction.cpp +++ b/src/goto-instrument/k_induction.cpp @@ -150,10 +150,10 @@ void k_inductiont::k_induction() } void k_induction( - goto_functionst &goto_functions, + goto_modelt &goto_model, bool base_case, bool step_case, unsigned k) { - Forall_goto_functions(it, goto_functions) + Forall_goto_functions(it, goto_model.goto_functions) k_inductiont(it->second, base_case, step_case, k); } diff --git a/src/goto-instrument/k_induction.h b/src/goto-instrument/k_induction.h index e5af8b0c43f..f8d8ac4d351 100644 --- a/src/goto-instrument/k_induction.h +++ b/src/goto-instrument/k_induction.h @@ -12,10 +12,10 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_K_INDUCTION_H #define CPROVER_GOTO_INSTRUMENT_K_INDUCTION_H -#include +class goto_modelt; void k_induction( - goto_functionst &goto_functions, + goto_modelt &, bool base_case, bool step_case, unsigned k); diff --git a/src/goto-instrument/mmio.cpp b/src/goto-instrument/mmio.cpp index a7a21a2f1a9..a865077d0f0 100644 --- a/src/goto-instrument/mmio.cpp +++ b/src/goto-instrument/mmio.cpp @@ -164,23 +164,18 @@ void mmio( void mmio( value_setst &value_sets, - class symbol_tablet &symbol_table, - goto_functionst &goto_functions) + goto_modelt &goto_model) { - // we first figure out which objects are read/written by the ISR - - - // now instrument - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) if(f_it->first!=CPROVER_PREFIX "initialize" && f_it->first!=goto_functionst::entry_point()) - mmio(value_sets, symbol_table, + mmio(value_sets, goto_model.symbol_table, #ifdef LOCAL_MAY f_it->second, #endif f_it->second.body); - goto_functions.update(); + goto_model.goto_functions.update(); } diff --git a/src/goto-instrument/mmio.h b/src/goto-instrument/mmio.h index eab567f9873..f2fbec84fa1 100644 --- a/src/goto-instrument/mmio.h +++ b/src/goto-instrument/mmio.h @@ -15,12 +15,10 @@ Date: September 2011 #define CPROVER_GOTO_INSTRUMENT_MMIO_H class value_setst; -class symbol_tablet; -class goto_functionst; +class goto_modelt; void mmio( - value_setst &value_sets, - class symbol_tablet &symbol_table, - goto_functionst &goto_functions); + value_setst &, + goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_MMIO_H diff --git a/src/goto-instrument/model_argc_argv.cpp b/src/goto-instrument/model_argc_argv.cpp index 13d8de6c0b3..779bf1bfcc1 100644 --- a/src/goto-instrument/model_argc_argv.cpp +++ b/src/goto-instrument/model_argc_argv.cpp @@ -27,7 +27,7 @@ Date: April 2016 #include #include -#include +#include #include /// Set up argv with up to max_argc pointers into an array of 4096 bytes. @@ -37,18 +37,19 @@ Date: April 2016 /// \param message_handler: message logging /// \return True, if and only if modelling succeeded bool model_argc_argv( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, unsigned max_argc, message_handlert &message_handler) { messaget message(message_handler); - const namespacet ns(symbol_table); + const namespacet ns(goto_model.symbol_table); - if(!symbol_table.has_symbol(goto_functions.entry_point())) + if(!goto_model.symbol_table.has_symbol( + goto_model.goto_functions.entry_point())) { message.error() << "Linking not done, missing " - << goto_functions.entry_point() << messaget::eom; + << goto_model.goto_functions.entry_point() + << messaget::eom; return true; } @@ -79,7 +80,7 @@ bool model_argc_argv( std::ostringstream oss; oss << "int ARGC;\n" << "char *ARGV[1];\n" - << "void " << goto_functions.entry_point() << "()\n" + << "void " << goto_model.goto_functions.entry_point() << "()\n" << "{\n" << " unsigned next=0u;\n" << " " CPROVER_PREFIX "assume(ARGC>=1);\n" @@ -118,8 +119,8 @@ bool model_argc_argv( // add __CPROVER_assume if necessary (it might exist already) if(it->first==CPROVER_PREFIX "assume" || it->first==CPROVER_PREFIX "input") - symbol_table.add(it->second); - else if(it->first==goto_functions.entry_point()) + goto_model.symbol_table.add(it->second); + else if(it->first==goto_model.goto_functions.entry_point()) { value=it->second.value; @@ -128,28 +129,32 @@ bool model_argc_argv( replace.insert("ARGV", ns.lookup("argv'").symbol_expr()); replace(value); } - else if(has_prefix(id2string(it->first), - id2string(goto_functions.entry_point())+"::") && - symbol_table.add(it->second)) + else if(has_prefix( + id2string(it->first), + id2string(goto_model.goto_functions.entry_point())+"::") && + goto_model.symbol_table.add(it->second)) UNREACHABLE; } POSTCONDITION(value.is_not_nil()); goto_convert( to_code(value), - symbol_table, + goto_model.symbol_table, init_instructions, message_handler); + Forall_goto_program_instructions(it, init_instructions) { it->source_location.set_file(""); - it->function=goto_functions.entry_point(); + it->function=goto_model.goto_functions.entry_point(); } goto_functionst::function_mapt::iterator start_entry= - goto_functions.function_map.find(goto_functions.entry_point()); + goto_model.goto_functions.function_map.find( + goto_model.goto_functions.entry_point()); + DATA_INVARIANT( - start_entry!=goto_functions.function_map.end() && + start_entry!=goto_model.goto_functions.function_map.end() && start_entry->second.body_available(), "entry point expected to have a body"); @@ -175,7 +180,7 @@ bool model_argc_argv( // update counters etc. remove_skip(start); start.compute_loop_numbers(); - goto_functions.update(); + goto_model.goto_functions.update(); return false; } diff --git a/src/goto-instrument/model_argc_argv.h b/src/goto-instrument/model_argc_argv.h index 08a214f6fd6..9328f22b488 100644 --- a/src/goto-instrument/model_argc_argv.h +++ b/src/goto-instrument/model_argc_argv.h @@ -14,14 +14,12 @@ Date: April 2016 #ifndef CPROVER_GOTO_INSTRUMENT_MODEL_ARGC_ARGV_H #define CPROVER_GOTO_INSTRUMENT_MODEL_ARGC_ARGV_H -class goto_functionst; +class goto_modelt; class message_handlert; -class symbol_tablet; bool model_argc_argv( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, unsigned max_argc, - message_handlert &message_handler); + message_handlert &); #endif // CPROVER_GOTO_INSTRUMENT_MODEL_ARGC_ARGV_H diff --git a/src/goto-instrument/nondet_static.h b/src/goto-instrument/nondet_static.h index 16114584849..cddbb52c636 100644 --- a/src/goto-instrument/nondet_static.h +++ b/src/goto-instrument/nondet_static.h @@ -15,14 +15,8 @@ Date: November 2011 #ifndef CPROVER_GOTO_INSTRUMENT_NONDET_STATIC_H #define CPROVER_GOTO_INSTRUMENT_NONDET_STATIC_H -class goto_functionst; -class namespacet; class goto_modelt; -void nondet_static( - const namespacet &, - goto_functionst &); - void nondet_static(goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_NONDET_STATIC_H diff --git a/src/goto-instrument/nondet_volatile.cpp b/src/goto-instrument/nondet_volatile.cpp index 4da1ebf6731..1e9024e48d0 100644 --- a/src/goto-instrument/nondet_volatile.cpp +++ b/src/goto-instrument/nondet_volatile.cpp @@ -119,12 +119,10 @@ void nondet_volatile( } } -void nondet_volatile( - symbol_tablet &symbol_table, - goto_functionst &goto_functions) +void nondet_volatile(goto_modelt &goto_model) { - Forall_goto_functions(f_it, goto_functions) - nondet_volatile(symbol_table, f_it->second.body); + Forall_goto_functions(f_it, goto_model.goto_functions) + nondet_volatile(goto_model.symbol_table, f_it->second.body); - goto_functions.update(); + goto_model.goto_functions.update(); } diff --git a/src/goto-instrument/nondet_volatile.h b/src/goto-instrument/nondet_volatile.h index 8cb3930fd56..dd92f3b1833 100644 --- a/src/goto-instrument/nondet_volatile.h +++ b/src/goto-instrument/nondet_volatile.h @@ -12,14 +12,12 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_NONDET_VOLATILE_H #define CPROVER_GOTO_INSTRUMENT_NONDET_VOLATILE_H -#include +#include bool is_volatile( - const symbol_tablet &symbol_table, - const typet &type); + const symbol_tablet &, + const typet &); -void nondet_volatile( - symbol_tablet &symbol_table, - goto_functionst &goto_functions); +void nondet_volatile(goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_NONDET_VOLATILE_H diff --git a/src/goto-instrument/points_to.h b/src/goto-instrument/points_to.h index 8b4a47d980a..76775a6f636 100644 --- a/src/goto-instrument/points_to.h +++ b/src/goto-instrument/points_to.h @@ -14,7 +14,7 @@ Author: Daniel Kroening, kroening@kroening.com #include -#include +#include #include #include "object_id.h" @@ -26,10 +26,10 @@ class points_tot { } - void operator()(goto_functionst &goto_functions) + void operator()(goto_modelt &goto_model) { // build the CFG data structure - cfg(goto_functions); + cfg(goto_model.goto_functions); // iterate fixedpoint(); diff --git a/src/goto-instrument/race_check.cpp b/src/goto-instrument/race_check.cpp index aec5eedda53..b426c98815e 100644 --- a/src/goto-instrument/race_check.cpp +++ b/src/goto-instrument/race_check.cpp @@ -294,29 +294,29 @@ void race_check( void race_check( value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions) + goto_modelt &goto_model) { - w_guardst w_guards(symbol_table); + w_guardst w_guards(goto_model.symbol_table); - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) if(f_it->first!=goto_functionst::entry_point() && f_it->first!=CPROVER_PREFIX "initialize") race_check( value_sets, - symbol_table, + goto_model.symbol_table, L_M_ARG(f_it->second) f_it->second.body, w_guards); // get "main" goto_functionst::function_mapt::iterator - m_it=goto_functions.function_map.find(goto_functions.entry_point()); + m_it=goto_model.goto_functions.function_map.find( + goto_model.goto_functions.entry_point()); - if(m_it==goto_functions.function_map.end()) + if(m_it==goto_model.goto_functions.function_map.end()) throw "race check instrumentation needs an entry point"; goto_programt &main=m_it->second.body; w_guards.add_initialization(main); - goto_functions.update(); + goto_model.goto_functions.update(); } diff --git a/src/goto-instrument/race_check.h b/src/goto-instrument/race_check.h index 442d142ddc0..829ca529ea6 100644 --- a/src/goto-instrument/race_check.h +++ b/src/goto-instrument/race_check.h @@ -15,22 +15,17 @@ Date: February 2006 #define CPROVER_GOTO_INSTRUMENT_RACE_CHECK_H #include -#include - -class goto_programt; +#include void race_check( - value_setst &value_sets, - class symbol_tablet &symbol_table, + value_setst &, + class symbol_tablet &, #ifdef LOCAL_MAY const goto_functionst::goto_functiont &goto_function, #endif goto_programt &goto_program ); -void race_check( - value_setst &value_sets, - class symbol_tablet &symbol_table, - goto_functionst &goto_functions); +void race_check(value_setst &, goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_RACE_CHECK_H diff --git a/src/goto-instrument/reachability_slicer.cpp b/src/goto-instrument/reachability_slicer.cpp index c92333e31a3..7773aa7a760 100644 --- a/src/goto-instrument/reachability_slicer.cpp +++ b/src/goto-instrument/reachability_slicer.cpp @@ -80,18 +80,18 @@ void reachability_slicert::slice(goto_functionst &goto_functions) goto_functions.update(); } -void reachability_slicer(goto_functionst &goto_functions) +void reachability_slicer(goto_modelt &goto_model) { reachability_slicert s; assert_criteriont a; - s(goto_functions, a); + s(goto_model.goto_functions, a); } void reachability_slicer( - goto_functionst &goto_functions, + goto_modelt &goto_model, const std::list &properties) { reachability_slicert s; properties_criteriont p(properties); - s(goto_functions, p); + s(goto_model.goto_functions, p); } diff --git a/src/goto-instrument/reachability_slicer.h b/src/goto-instrument/reachability_slicer.h index 4d82e4b194e..25e6a19ba5b 100644 --- a/src/goto-instrument/reachability_slicer.h +++ b/src/goto-instrument/reachability_slicer.h @@ -12,12 +12,15 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_REACHABILITY_SLICER_H #define CPROVER_GOTO_INSTRUMENT_REACHABILITY_SLICER_H -#include +#include +#include -void reachability_slicer(goto_functionst &goto_functions); +class goto_modelt; + +void reachability_slicer(goto_modelt &); void reachability_slicer( - goto_functionst &goto_functions, + goto_modelt &, const std::list &properties); #endif // CPROVER_GOTO_INSTRUMENT_REACHABILITY_SLICER_H diff --git a/src/goto-instrument/remove_function.cpp b/src/goto-instrument/remove_function.cpp index 131438d1af6..2ec053ccac4 100644 --- a/src/goto-instrument/remove_function.cpp +++ b/src/goto-instrument/remove_function.cpp @@ -15,26 +15,25 @@ Date: April 2017 #include -#include +#include /// Remove the body of function "identifier" such that an analysis will treat it /// as a side-effect free function with non-deterministic return value. /// \par parameters: symbol_table Input symbol table to be modified -/// goto_functions Input functions to be modified +/// goto_model Input program to be modified /// identifier Function to be removed /// message_handler Error/status output void remove_function( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const irep_idt &identifier, message_handlert &message_handler) { messaget message(message_handler); goto_functionst::function_mapt::iterator entry= - goto_functions.function_map.find(identifier); + goto_model.goto_functions.function_map.find(identifier); - if(entry==goto_functions.function_map.end()) + if(entry==goto_model.goto_functions.function_map.end()) { message.error() << "No function " << identifier << " in goto program" << messaget::eom; @@ -52,7 +51,7 @@ void remove_function( message.status() << "Removing body of " << identifier << messaget::eom; entry->second.clear(); - symbol_table.lookup(identifier).value.make_nil(); + goto_model.symbol_table.lookup(identifier).value.make_nil(); } } @@ -60,15 +59,14 @@ void remove_function( /// will treat it as a side-effect free function with non-deterministic return /// value. /// \par parameters: symbol_table Input symbol table to be modified -/// goto_functions Input functions to be modified +/// goto_model Input program to be modified /// names List of functions to be removed /// message_handler Error/status output void remove_functions( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const std::list &names, message_handlert &message_handler) { for(const auto &f : names) - remove_function(symbol_table, goto_functions, f, message_handler); + remove_function(goto_model, f, message_handler); } diff --git a/src/goto-instrument/remove_function.h b/src/goto-instrument/remove_function.h index e11db1757ba..3c88b8ce803 100644 --- a/src/goto-instrument/remove_function.h +++ b/src/goto-instrument/remove_function.h @@ -19,20 +19,17 @@ Date: April 2017 #include -class goto_functionst; +class goto_modelt; class message_handlert; -class symbol_tablet; void remove_function( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, const irep_idt &identifier, - message_handlert &message_handler); + message_handlert &); void remove_functions( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, const std::list &names, - message_handlert &message_handler); + message_handlert &); #endif // CPROVER_GOTO_INSTRUMENT_REMOVE_FUNCTION_H diff --git a/src/goto-instrument/rw_set.h b/src/goto-instrument/rw_set.h index 15c3766f23c..6de564f0783 100644 --- a/src/goto-instrument/rw_set.h +++ b/src/goto-instrument/rw_set.h @@ -23,7 +23,7 @@ Date: February 2006 #include #include -#include +#include #include #ifdef LOCAL_MAY @@ -203,12 +203,12 @@ class rw_set_functiont:public rw_set_baset public: rw_set_functiont( value_setst &_value_sets, - const namespacet &_ns, - const goto_functionst &_goto_functions, + const goto_modelt &_goto_model, const exprt &function): - rw_set_baset(_ns), + rw_set_baset(ns), + ns(_goto_model.symbol_table), value_sets(_value_sets), - goto_functions(_goto_functions) + goto_functions(_goto_model.goto_functions) { compute_rec(function); } @@ -216,6 +216,7 @@ class rw_set_functiont:public rw_set_baset ~rw_set_functiont() {} protected: + const namespacet ns; value_setst &value_sets; const goto_functionst &goto_functions; diff --git a/src/goto-instrument/show_locations.cpp b/src/goto-instrument/show_locations.cpp index 2b9580add2f..530ad487d7a 100644 --- a/src/goto-instrument/show_locations.cpp +++ b/src/goto-instrument/show_locations.cpp @@ -18,6 +18,8 @@ Author: Daniel Kroening, kroening@kroening.com #include +#include + void show_locations( ui_message_handlert::uit ui, const irep_idt function_id, @@ -64,11 +66,8 @@ void show_locations( void show_locations( ui_message_handlert::uit ui, - const goto_functionst &goto_functions) + const goto_modelt &goto_model) { - for(goto_functionst::function_mapt::const_iterator - it=goto_functions.function_map.begin(); - it!=goto_functions.function_map.end(); - it++) - show_locations(ui, it->first, it->second.body); + for(const auto &f : goto_model.goto_functions.function_map) + show_locations(ui, f.first, f.second.body); } diff --git a/src/goto-instrument/show_locations.h b/src/goto-instrument/show_locations.h index 3f71b19ca48..af6bf185dcd 100644 --- a/src/goto-instrument/show_locations.h +++ b/src/goto-instrument/show_locations.h @@ -14,10 +14,10 @@ Author: Daniel Kroening, kroening@kroening.com #include -#include +class goto_modelt; void show_locations( ui_message_handlert::uit ui, - const goto_functionst &goto_functions); + const goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_SHOW_LOCATIONS_H diff --git a/src/goto-instrument/skip_loops.cpp b/src/goto-instrument/skip_loops.cpp index d8be5f1e7ef..c28f2f80fe9 100644 --- a/src/goto-instrument/skip_loops.cpp +++ b/src/goto-instrument/skip_loops.cpp @@ -16,7 +16,7 @@ Date: January 2016 #include #include -#include +#include typedef std::set loop_idst; typedef std::map loop_mapt; @@ -91,7 +91,7 @@ static bool parse_loop_ids( } bool skip_loops( - goto_functionst &goto_functions, + goto_modelt &goto_model, const std::string &loop_ids, message_handlert &message_handler) { @@ -105,7 +105,7 @@ bool skip_loops( } loop_mapt::const_iterator it=loop_map.begin(); - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) { if(it==loop_map.end() || it->firstfirst) break; // possible error handled below @@ -124,7 +124,7 @@ bool skip_loops( } // update counters etc. - goto_functions.update(); + goto_model.goto_functions.update(); return false; } diff --git a/src/goto-instrument/skip_loops.h b/src/goto-instrument/skip_loops.h index c5e84c6172c..d82104436b8 100644 --- a/src/goto-instrument/skip_loops.h +++ b/src/goto-instrument/skip_loops.h @@ -16,12 +16,12 @@ Date: January 2016 #include -class goto_functionst; +class goto_modelt; class message_handlert; bool skip_loops( - goto_functionst &goto_functions, + goto_modelt &, const std::string &loop_ids, - message_handlert &message_handler); + message_handlert &); #endif // CPROVER_GOTO_INSTRUMENT_SKIP_LOOPS_H diff --git a/src/goto-instrument/stack_depth.cpp b/src/goto-instrument/stack_depth.cpp index df319f3deb5..2dc96cdf8bd 100644 --- a/src/goto-instrument/stack_depth.cpp +++ b/src/goto-instrument/stack_depth.cpp @@ -20,7 +20,7 @@ Date: November 2011 #include #include -#include +#include symbol_exprt add_stack_depth_symbol(symbol_tablet &symbol_table) { @@ -84,14 +84,15 @@ void stack_depth( } void stack_depth( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const int depth) { - const symbol_exprt sym=add_stack_depth_symbol(symbol_table); + const symbol_exprt sym= + add_stack_depth_symbol(goto_model.symbol_table); + const exprt depth_expr(from_integer(depth, sym.type())); - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) if(f_it->second.body_available() && f_it->first!=CPROVER_PREFIX "initialize" && f_it->first!=goto_functionst::entry_point()) @@ -99,8 +100,11 @@ void stack_depth( // initialize depth to 0 goto_functionst::function_mapt::iterator - i_it=goto_functions.function_map.find(CPROVER_PREFIX "initialize"); - assert(i_it!=goto_functions.function_map.end()); + i_it=goto_model.goto_functions.function_map.find( + CPROVER_PREFIX "initialize"); + DATA_INVARIANT( + i_it!=goto_model.goto_functions.function_map.end(), + "__CPROVER_initialize must exist"); goto_programt &init=i_it->second.body; goto_programt::targett first=init.instructions.begin(); @@ -111,5 +115,5 @@ void stack_depth( it->function=first->function; // update counters etc. - goto_functions.update(); + goto_model.goto_functions.update(); } diff --git a/src/goto-instrument/stack_depth.h b/src/goto-instrument/stack_depth.h index 8d0414121d7..d63037116ac 100644 --- a/src/goto-instrument/stack_depth.h +++ b/src/goto-instrument/stack_depth.h @@ -14,12 +14,10 @@ Date: November 2011 #ifndef CPROVER_GOTO_INSTRUMENT_STACK_DEPTH_H #define CPROVER_GOTO_INSTRUMENT_STACK_DEPTH_H -class symbol_tablet; -class goto_functionst; +class goto_modelt; void stack_depth( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, const int depth); #endif // CPROVER_GOTO_INSTRUMENT_STACK_DEPTH_H diff --git a/src/goto-instrument/thread_instrumentation.cpp b/src/goto-instrument/thread_instrumentation.cpp index a2943424a33..c02d9360612 100644 --- a/src/goto-instrument/thread_instrumentation.cpp +++ b/src/goto-instrument/thread_instrumentation.cpp @@ -9,8 +9,11 @@ Author: Daniel Kroening, kroening@kroening.com #include "thread_instrumentation.h" #include + #include +#include + static bool has_start_thread(const goto_programt &goto_program) { for(const auto &instruction : goto_program.instructions) @@ -53,12 +56,12 @@ void thread_exit_instrumentation(goto_programt &goto_program) end->function=function; } -void thread_exit_instrumentation(goto_functionst &goto_functions) +void thread_exit_instrumentation(goto_modelt &goto_model) { // we'll look for START THREAD std::set thread_fkts; - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) { if(has_start_thread(f_it->second.body)) { @@ -77,9 +80,8 @@ void thread_exit_instrumentation(goto_functionst &goto_functions) // now instrument for(const auto &fkt : thread_fkts) - { - thread_exit_instrumentation(goto_functions.function_map[fkt].body); - } + thread_exit_instrumentation( + goto_model.goto_functions.function_map[fkt].body); } void mutex_init_instrumentation( @@ -118,16 +120,14 @@ void mutex_init_instrumentation( } } -void mutex_init_instrumentation( - const symbol_tablet &symbol_table, - goto_functionst &goto_functions) +void mutex_init_instrumentation(goto_modelt &goto_model) { // get pthread_mutex_lock symbol_tablet::symbolst::const_iterator f_it= - symbol_table.symbols.find("pthread_mutex_lock"); + goto_model.symbol_table.symbols.find("pthread_mutex_lock"); - if(f_it==symbol_table.symbols.end()) + if(f_it==goto_model.symbol_table.symbols.end()) return; // get type of lock argument @@ -140,7 +140,7 @@ void mutex_init_instrumentation( if(lock_type.id()!=ID_pointer) return; - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) mutex_init_instrumentation( - symbol_table, f_it->second.body, lock_type.subtype()); + goto_model.symbol_table, f_it->second.body, lock_type.subtype()); } diff --git a/src/goto-instrument/thread_instrumentation.h b/src/goto-instrument/thread_instrumentation.h index c4c92394d72..6bda06ee6d8 100644 --- a/src/goto-instrument/thread_instrumentation.h +++ b/src/goto-instrument/thread_instrumentation.h @@ -10,10 +10,9 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_THREAD_INSTRUMENTATION_H #define CPROVER_GOTO_INSTRUMENT_THREAD_INSTRUMENTATION_H -#include +class goto_modelt; -void thread_exit_instrumentation(goto_functionst &); - -void mutex_init_instrumentation(const symbol_tablet &, goto_functionst &); +void thread_exit_instrumentation(goto_modelt &); +void mutex_init_instrumentation(goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_THREAD_INSTRUMENTATION_H diff --git a/src/goto-instrument/undefined_functions.cpp b/src/goto-instrument/undefined_functions.cpp index f76815d3009..ea5556151bf 100644 --- a/src/goto-instrument/undefined_functions.cpp +++ b/src/goto-instrument/undefined_functions.cpp @@ -15,22 +15,25 @@ Date: July 2016 #include -#include +#include + +#include void list_undefined_functions( - const goto_functionst &goto_functions, - const namespacet &ns, + const goto_modelt &goto_model, std::ostream &os) { - forall_goto_functions(it, goto_functions) + const namespacet ns(goto_model.symbol_table); + + forall_goto_functions(it, goto_model.goto_functions) if(!ns.lookup(it->first).is_macro && !it->second.body_available()) os << it->first << '\n'; } -void undefined_function_abort_path(goto_functionst &goto_functions) +void undefined_function_abort_path(goto_modelt &goto_model) { - Forall_goto_functions(it, goto_functions) + Forall_goto_functions(it, goto_model.goto_functions) Forall_goto_program_instructions(iit, it->second.body) { goto_programt::instructiont &ins=*iit; @@ -47,8 +50,10 @@ void undefined_function_abort_path(goto_functionst &goto_functions) to_symbol_expr(call.function()).get_identifier(); goto_functionst::function_mapt::const_iterator entry= - goto_functions.function_map.find(function); - assert(entry!=goto_functions.function_map.end()); + goto_model.goto_functions.function_map.find(function); + DATA_INVARIANT( + entry!=goto_model.goto_functions.function_map.end(), + "called function must be in function_map"); if(entry->second.body_available()) continue; diff --git a/src/goto-instrument/undefined_functions.h b/src/goto-instrument/undefined_functions.h index e9bb9df6f95..39b6cfe45e1 100644 --- a/src/goto-instrument/undefined_functions.h +++ b/src/goto-instrument/undefined_functions.h @@ -17,14 +17,12 @@ Date: July 2016 #include class namespacet; - -class goto_functionst; +class goto_modelt; void list_undefined_functions( - const goto_functionst &goto_functions, - const namespacet &ns, - std::ostream &os); + const goto_modelt &, + std::ostream &); -void undefined_function_abort_path(goto_functionst &goto_functions); +void undefined_function_abort_path(goto_modelt &); #endif diff --git a/src/goto-instrument/uninitialized.cpp b/src/goto-instrument/uninitialized.cpp index ca33c6bfbbb..5c416946213 100644 --- a/src/goto-instrument/uninitialized.cpp +++ b/src/goto-instrument/uninitialized.cpp @@ -194,26 +194,23 @@ void uninitializedt::add_assertions(goto_programt &goto_program) } } -void add_uninitialized_locals_assertions( - symbol_tablet &symbol_table, - goto_functionst &goto_functions) +void add_uninitialized_locals_assertions(goto_modelt &goto_model) { - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) { - uninitializedt uninitialized(symbol_table); + uninitializedt uninitialized(goto_model.symbol_table); uninitialized.add_assertions(f_it->second.body); } } void show_uninitialized( - const class symbol_tablet &symbol_table, - const goto_functionst &goto_functions, + const goto_modelt &goto_model, std::ostream &out) { - const namespacet ns(symbol_table); + const namespacet ns(goto_model.symbol_table); - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) { if(f_it->second.body_available()) { diff --git a/src/goto-instrument/uninitialized.h b/src/goto-instrument/uninitialized.h index 11437eee972..281d61894d2 100644 --- a/src/goto-instrument/uninitialized.h +++ b/src/goto-instrument/uninitialized.h @@ -16,15 +16,12 @@ Date: January 2010 #include -#include +#include -void add_uninitialized_locals_assertions( - class symbol_tablet &symbol_table, - goto_functionst &goto_functions); +void add_uninitialized_locals_assertions(goto_modelt &); void show_uninitialized( - const class symbol_tablet &symbol_table, - const goto_functionst &goto_functions, + const goto_modelt &, std::ostream &out); #endif // CPROVER_GOTO_INSTRUMENT_UNINITIALIZED_H diff --git a/src/goto-instrument/unwind.h b/src/goto-instrument/unwind.h index 6e86a5d98e2..6360fbaeb74 100644 --- a/src/goto-instrument/unwind.h +++ b/src/goto-instrument/unwind.h @@ -15,9 +15,9 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include +#include -class goto_functionst; +class goto_modelt; // -1: do not unwind loop typedef std::map> unwind_sett; @@ -66,11 +66,30 @@ class goto_unwindt } void operator()( - goto_functionst &goto_functions, + goto_functionst &, const unwind_sett &unwind_set, const int k=-1, // -1: no global bound const unwind_strategyt unwind_strategy=unwind_strategyt::PARTIAL); + void operator()( + goto_modelt &goto_model, + const unsigned k, // global bound + const unwind_strategyt unwind_strategy=unwind_strategyt::PARTIAL) + { + const unwind_sett unwind_set; + operator()(goto_model.goto_functions, unwind_set, k, unwind_strategy); + } + + void operator()( + goto_modelt &goto_model, + const unwind_sett &unwind_set, + const int k=-1, // -1: no global bound + const unwind_strategyt unwind_strategy=unwind_strategyt::PARTIAL) + { + operator()( + goto_model.goto_functions, unwind_set, k, unwind_strategy); + } + // unwind log jsont output_log_json() const diff --git a/src/goto-instrument/wmm/goto2graph.h b/src/goto-instrument/wmm/goto2graph.h index ea2a79f8b99..c8b472e079b 100644 --- a/src/goto-instrument/wmm/goto2graph.h +++ b/src/goto-instrument/wmm/goto2graph.h @@ -20,13 +20,12 @@ Date: 2012 #include #include -#include +#include #include "event_graph.h" #include "wmm.h" -class symbol_tablet; -class goto_functionst; +class goto_modelt; class value_setst; class local_may_aliast; @@ -329,11 +328,10 @@ class instrumentert std::multimap id2cycloc; instrumentert( - symbol_tablet &_symbol_table, - goto_functionst &_goto_f, + goto_modelt &_goto_model, messaget &_message): - ns(_symbol_table), - goto_functions(_goto_f), + ns(_goto_model.symbol_table), + goto_functions(_goto_model.goto_functions), render_po_aligned(true), render_by_file(false), render_by_function(false), diff --git a/src/goto-instrument/wmm/instrumenter_pensieve.h b/src/goto-instrument/wmm/instrumenter_pensieve.h index 1e954344322..cb7afeb45dc 100644 --- a/src/goto-instrument/wmm/instrumenter_pensieve.h +++ b/src/goto-instrument/wmm/instrumenter_pensieve.h @@ -15,16 +15,14 @@ Module: Instrumenter #include "event_graph.h" #include "goto2graph.h" -class symbol_tablet; -class goto_functionst; +class goto_modelt; class namespacet; class instrumenter_pensievet:public instrumentert { public: - instrumenter_pensievet(symbol_tablet &_symbol_table, - goto_functionst &_goto_f, messaget &message) - : instrumentert(_symbol_table, _goto_f, message) + instrumenter_pensievet(goto_modelt &_goto_model, messaget &message) + : instrumentert(_goto_model, message) { } diff --git a/src/goto-instrument/wmm/weak_memory.cpp b/src/goto-instrument/wmm/weak_memory.cpp index 0e1b5cbbc90..468d944f14a 100644 --- a/src/goto-instrument/wmm/weak_memory.cpp +++ b/src/goto-instrument/wmm/weak_memory.cpp @@ -106,8 +106,7 @@ void introduce_temporaries( void weak_memory( memory_modelt model, value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, bool SCC, instrumentation_strategyt event_strategy, unsigned unwinding_bound, @@ -135,10 +134,10 @@ void weak_memory( message.status() << "--------" << messaget::eom; // all access to shared variables is pushed into assignments - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) if(f_it->first!=CPROVER_PREFIX "initialize" && f_it->first!=goto_functionst::entry_point()) - introduce_temporaries(value_sets, symbol_table, f_it->first, + introduce_temporaries(value_sets, goto_model.symbol_table, f_it->first, f_it->second.body, #ifdef LOCAL_MAY f_it->second, @@ -148,7 +147,7 @@ void weak_memory( message.status() << "Temp added" << messaget::eom; unsigned max_thds = 0; - instrumentert instrumenter(symbol_table, goto_functions, message); + instrumentert instrumenter(goto_model, message); max_thds=instrumenter.goto2graph_cfg(value_sets, model, no_dependencies, duplicate_body); message.status()<<"abstraction completed"<::iterator it= shared_buffers.affected_by_delay_set.begin(); @@ -245,19 +246,19 @@ void weak_memory( << ran_it->second << messaget::eom; } - shared_bufferst::cfg_visitort visitor(shared_buffers, symbol_table, - goto_functions); - visitor.weak_memory(value_sets, goto_functions.entry_point(), model); + shared_bufferst::cfg_visitort visitor( + shared_buffers, goto_model.symbol_table, goto_model.goto_functions); + visitor.weak_memory( + value_sets, goto_model.goto_functions.entry_point(), model); /* removes potential skips */ - Forall_goto_functions(f_it, goto_functions) - remove_skip(f_it->second.body); + remove_skip(goto_model); // initialization code for buffers - shared_buffers.add_initialization_code(goto_functions); + shared_buffers.add_initialization_code(goto_model.goto_functions); // update counters etc. - goto_functions.update(); + goto_model.goto_functions.update(); message.status()<< "Goto-program instrumented" << messaget::eom; } diff --git a/src/goto-instrument/wmm/weak_memory.h b/src/goto-instrument/wmm/weak_memory.h index 34b98e6a767..d4eb6078174 100644 --- a/src/goto-instrument/wmm/weak_memory.h +++ b/src/goto-instrument/wmm/weak_memory.h @@ -16,20 +16,19 @@ Date: September 2011 #include "wmm.h" -#include "util/irep.h" +#include -class value_setst; -class goto_functionst; class symbol_tablet; +class value_setst; +class goto_modelt; class message_handlert; class goto_programt; class messaget; void weak_memory( memory_modelt model, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + value_setst &, + goto_modelt &, bool SCC, instrumentation_strategyt event_stategy, unsigned unwinding_bound, @@ -43,14 +42,14 @@ void weak_memory( bool render_function, bool cav11_option, bool hide_internals, - message_handlert &message, + message_handlert &, bool ignore_arrays); void introduce_temporaries( - value_setst &value_sets, - symbol_tablet &symbol_table, + value_setst &, + symbol_tablet &, const irep_idt &function, - goto_programt &goto_program, + goto_programt &, #ifdef LOCAL_MAY const goto_functionst::goto_functiont &goto_function, #endif diff --git a/src/goto-programs/goto_inline.cpp b/src/goto-programs/goto_inline.cpp index 88ba69c26c0..62957297922 100644 --- a/src/goto-programs/goto_inline.cpp +++ b/src/goto-programs/goto_inline.cpp @@ -284,24 +284,25 @@ void goto_function_inline( } jsont goto_function_inline_and_log( - goto_functionst &goto_functions, + goto_modelt &goto_model, const irep_idt function, - const namespacet &ns, message_handlert &message_handler, bool adjust_function, bool caching) { + const namespacet ns(goto_model.symbol_table); + goto_inlinet goto_inline( - goto_functions, + goto_model.goto_functions, ns, message_handler, adjust_function, caching); goto_functionst::function_mapt::iterator f_it= - goto_functions.function_map.find(function); + goto_model.goto_functions.function_map.find(function); - if(f_it==goto_functions.function_map.end()) + if(f_it==goto_model.goto_functions.function_map.end()) return jsont(); goto_functionst::goto_functiont &goto_function=f_it->second; @@ -326,8 +327,8 @@ jsont goto_function_inline_and_log( } goto_inline.goto_inline(function, goto_function, inline_map, true); - goto_functions.update(); - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.update(); + goto_model.goto_functions.compute_loop_numbers(); return goto_inline.output_inline_log_json(); } diff --git a/src/goto-programs/goto_inline.h b/src/goto-programs/goto_inline.h index 3319aa36172..bbb4f0365e5 100644 --- a/src/goto-programs/goto_inline.h +++ b/src/goto-programs/goto_inline.h @@ -65,9 +65,8 @@ void goto_function_inline( bool caching=true); jsont goto_function_inline_and_log( - goto_functionst &goto_functions, + goto_modelt &, const irep_idt function, - const namespacet &ns, message_handlert &message_handler, bool adjust_function=false, bool caching=true); diff --git a/src/goto-programs/goto_trace.h b/src/goto-programs/goto_trace.h index 02f230e8943..2153cffb040 100644 --- a/src/goto-programs/goto_trace.h +++ b/src/goto-programs/goto_trace.h @@ -24,6 +24,7 @@ Date: July 2005 #include #include +#include #include #include @@ -195,12 +196,12 @@ class goto_tracet void show_goto_trace( std::ostream &out, - const namespacet &ns, - const goto_tracet &goto_trace); + const namespacet &, + const goto_tracet &); void trace_value( std::ostream &out, - const namespacet &ns, + const namespacet &, const ssa_exprt &lhs_object, const exprt &full_lhs, const exprt &value); diff --git a/src/goto-programs/initialize_goto_model.cpp b/src/goto-programs/initialize_goto_model.cpp index 34a2a46a895..1706643206f 100644 --- a/src/goto-programs/initialize_goto_model.cpp +++ b/src/goto-programs/initialize_goto_model.cpp @@ -137,6 +137,10 @@ bool initialize_goto_model( goto_model.symbol_table, goto_model.goto_functions, message_handler); + + // stupid hack + config.set_object_bits_from_symbol_table( + goto_model.symbol_table); } catch(const char *e) { diff --git a/src/goto-programs/interpreter.cpp b/src/goto-programs/interpreter.cpp index 25d2be08cb8..c65bc472a46 100644 --- a/src/goto-programs/interpreter.cpp +++ b/src/goto-programs/interpreter.cpp @@ -1049,18 +1049,6 @@ exprt interpretert::get_value(const irep_idt &id) return get_value(get_type, integer2size_t(whole_lhs_object_address)); } -void interpreter( - const symbol_tablet &symbol_table, - const goto_functionst &goto_functions, - message_handlert &message_handler) -{ - interpretert interpreter( - symbol_table, - goto_functions, - message_handler); - interpreter(); -} - /// Prints the current state of the memory map Since messaget mdofifies class /// members, print functions are nonconst void interpretert::print_memory(bool input_flags) @@ -1079,3 +1067,15 @@ void interpretert::print_memory(bool input_flags) debug() << eom; } } + +void interpreter( + const goto_modelt &goto_model, + message_handlert &message_handler) +{ + interpretert interpreter( + goto_model.symbol_table, + goto_model.goto_functions, + message_handler); + interpreter(); +} + diff --git a/src/goto-programs/interpreter.h b/src/goto-programs/interpreter.h index 8d598852b1a..c4b84863bc7 100644 --- a/src/goto-programs/interpreter.h +++ b/src/goto-programs/interpreter.h @@ -14,11 +14,10 @@ Author: Daniel Kroening, kroening@kroening.com #include -#include "goto_functions.h" +#include "goto_model.h" void interpreter( - const symbol_tablet &symbol_table, - const goto_functionst &goto_functions, - message_handlert &message_handler); + const goto_modelt &, + message_handlert &); #endif // CPROVER_GOTO_PROGRAMS_INTERPRETER_H diff --git a/src/goto-programs/read_goto_binary.h b/src/goto-programs/read_goto_binary.h index bbaba7a5c11..1cc60e13a37 100644 --- a/src/goto-programs/read_goto_binary.h +++ b/src/goto-programs/read_goto_binary.h @@ -14,10 +14,10 @@ Author: Daniel Kroening, kroening@kroening.com #include -class symbol_tablet; class goto_functionst; -class message_handlert; class goto_modelt; +class message_handlert; +class symbol_tablet; bool read_goto_binary( const std::string &filename, diff --git a/src/goto-programs/remove_exceptions.cpp b/src/goto-programs/remove_exceptions.cpp index 712aaf4b1f3..0c9a922367d 100644 --- a/src/goto-programs/remove_exceptions.cpp +++ b/src/goto-programs/remove_exceptions.cpp @@ -584,9 +584,7 @@ void remove_exceptions( /// removes throws/CATCH-POP/CATCH-PUSH void remove_exceptions(goto_modelt &goto_model) { - std::map> exceptions_map; - remove_exceptionst remove_exceptions( + remove_exceptions( goto_model.symbol_table, - exceptions_map); - remove_exceptions(goto_model.goto_functions); + goto_model.goto_functions); } diff --git a/src/goto-programs/remove_returns.cpp b/src/goto-programs/remove_returns.cpp index d74e135693b..cc3a68440c3 100644 --- a/src/goto-programs/remove_returns.cpp +++ b/src/goto-programs/remove_returns.cpp @@ -389,10 +389,8 @@ void remove_returnst::restore(goto_functionst &goto_functions) } /// restores return statements -void restore_returns( - symbol_tablet &symbol_table, - goto_functionst &goto_functions) +void restore_returns(goto_modelt &goto_model) { - remove_returnst rr(symbol_table); - rr.restore(goto_functions); + remove_returnst rr(goto_model.symbol_table); + rr.restore(goto_model.goto_functions); } diff --git a/src/goto-programs/remove_returns.h b/src/goto-programs/remove_returns.h index d4e50cae57b..04b113cff18 100644 --- a/src/goto-programs/remove_returns.h +++ b/src/goto-programs/remove_returns.h @@ -29,6 +29,8 @@ void remove_returns(goto_modelt &); // reverse the above operations void restore_returns(symbol_tablet &, goto_functionst &); +void restore_returns(goto_modelt &); + code_typet original_return_type( const symbol_tablet &symbol_table, const irep_idt &function_id); diff --git a/src/goto-programs/remove_static_init_loops.cpp b/src/goto-programs/remove_static_init_loops.cpp index e6493732b62..92554c50e4d 100644 --- a/src/goto-programs/remove_static_init_loops.cpp +++ b/src/goto-programs/remove_static_init_loops.cpp @@ -10,6 +10,7 @@ Author: Daniel Kroening, kroening@kroening.com /// Unwind loops in static initializers #include "remove_static_init_loops.h" +#include "goto_model.h" #include @@ -104,11 +105,10 @@ void remove_static_init_loopst::unwind_enum_static( /// \par parameters: symbol table, goto_functions and options /// \return side effect is adding loops to unwindset void remove_static_init_loops( - const symbol_tablet &symbol_table, - const goto_functionst &goto_functions, + const goto_modelt &goto_model, optionst &options, message_handlert &msg) { - remove_static_init_loopst remove_loops(symbol_table); - remove_loops.unwind_enum_static(goto_functions, options, msg); + remove_static_init_loopst remove_loops(goto_model.symbol_table); + remove_loops.unwind_enum_static(goto_model.goto_functions, options, msg); } diff --git a/src/goto-programs/remove_static_init_loops.h b/src/goto-programs/remove_static_init_loops.h index 3f781f6a70b..5c31ac527d7 100644 --- a/src/goto-programs/remove_static_init_loops.h +++ b/src/goto-programs/remove_static_init_loops.h @@ -9,18 +9,19 @@ Author: Daniel Kroening, kroening@kroening.com /// \file /// Unwind loops in static initializers +#ifndef CPROVER_GOTO_PROGRAMS_REMOVE_STATIC_INIT_LOOPS_H +#define CPROVER_GOTO_PROGRAMS_REMOVE_STATIC_INIT_LOOPS_H + #include #include #include #include -#ifndef CPROVER_GOTO_PROGRAMS_REMOVE_STATIC_INIT_LOOPS_H -#define CPROVER_GOTO_PROGRAMS_REMOVE_STATIC_INIT_LOOPS_H +class goto_modelt; void remove_static_init_loops( - const symbol_tablet &, - const goto_functionst &, + const goto_modelt &, optionst &, message_handlert &); diff --git a/src/goto-programs/show_goto_functions.h b/src/goto-programs/show_goto_functions.h index 4f63fde97a6..8cfcbff3ad9 100644 --- a/src/goto-programs/show_goto_functions.h +++ b/src/goto-programs/show_goto_functions.h @@ -14,7 +14,6 @@ Author: Peter Schrammel #include -class goto_functionst; class namespacet; class goto_modelt; @@ -24,11 +23,6 @@ class goto_modelt; #define HELP_SHOW_GOTO_FUNCTIONS \ " --show-goto-functions show goto program\n" -void show_goto_functions( - const namespacet &ns, - ui_message_handlert::uit ui, - const goto_functionst &goto_functions); - void show_goto_functions( const goto_modelt &, ui_message_handlert::uit ui); diff --git a/src/goto-programs/show_properties.h b/src/goto-programs/show_properties.h index b5564818195..98ccc8a948c 100644 --- a/src/goto-programs/show_properties.h +++ b/src/goto-programs/show_properties.h @@ -14,15 +14,9 @@ Author: Daniel Kroening, kroening@kroening.com #include -class goto_functionst; class namespacet; class goto_modelt; -void show_properties( - const namespacet &ns, - ui_message_handlert::uit ui, - const goto_functionst &goto_functions); - void show_properties( const goto_modelt &, ui_message_handlert::uit ui); diff --git a/src/goto-programs/slice_global_inits.cpp b/src/goto-programs/slice_global_inits.cpp index 2518a754af5..cc4f7349eb7 100644 --- a/src/goto-programs/slice_global_inits.cpp +++ b/src/goto-programs/slice_global_inits.cpp @@ -25,14 +25,13 @@ Date: December 2016 #include #include -void slice_global_inits( - const namespacet &ns, - goto_functionst &goto_functions) +void slice_global_inits(goto_modelt &goto_model) { // gather all functions reachable from the entry point - call_grapht call_graph(goto_functions); + call_grapht call_graph(goto_model); const call_grapht::grapht &graph=call_graph.graph; + goto_functionst &goto_functions=goto_model.goto_functions; std::list worklist; std::unordered_set functions_reached; diff --git a/src/goto-programs/slice_global_inits.h b/src/goto-programs/slice_global_inits.h index 25a96121961..9067bf83a57 100644 --- a/src/goto-programs/slice_global_inits.h +++ b/src/goto-programs/slice_global_inits.h @@ -14,11 +14,8 @@ Date: December 2016 #ifndef CPROVER_GOTO_PROGRAMS_SLICE_GLOBAL_INITS_H #define CPROVER_GOTO_PROGRAMS_SLICE_GLOBAL_INITS_H -class goto_functionst; -class namespacet; +class goto_modelt; -void slice_global_inits( - const namespacet &ns, - goto_functionst &goto_functions); +void slice_global_inits(goto_modelt &); #endif diff --git a/src/goto-programs/write_goto_binary.cpp b/src/goto-programs/write_goto_binary.cpp index 75542144d91..bdc353ad122 100644 --- a/src/goto-programs/write_goto_binary.cpp +++ b/src/goto-programs/write_goto_binary.cpp @@ -17,18 +17,20 @@ Author: CM Wintersteiger #include #include +#include + /// Writes a goto program to disc, using goto binary format ver 2 bool write_goto_binary_v3( std::ostream &out, - const symbol_tablet &lsymbol_table, - const goto_functionst &functions, + const symbol_tablet &symbol_table, + const goto_functionst &goto_functions, irep_serializationt &irepconverter) { // first write symbol table - write_gb_word(out, lsymbol_table.symbols.size()); + write_gb_word(out, symbol_table.symbols.size()); - forall_symbols(it, lsymbol_table.symbols) + forall_symbols(it, symbol_table.symbols) { // Since version 2, symbols are not converted to ireps, // instead they are saved in a custom binary format @@ -72,13 +74,13 @@ bool write_goto_binary_v3( // now write functions, but only those with body unsigned cnt=0; - forall_goto_functions(it, functions) + forall_goto_functions(it, goto_functions) if(it->second.body_available()) cnt++; write_gb_word(out, cnt); - for(const auto &fct : functions.function_map) + for(const auto &fct : goto_functions.function_map) { if(fct.second.body_available()) { @@ -122,8 +124,21 @@ bool write_goto_binary_v3( /// Writes a goto program to disc bool write_goto_binary( std::ostream &out, - const symbol_tablet &lsymbol_table, - const goto_functionst &functions, + const goto_modelt &goto_model, + int version) +{ + return write_goto_binary( + out, + goto_model.symbol_table, + goto_model.goto_functions, + version); +} + +/// Writes a goto program to disc +bool write_goto_binary( + std::ostream &out, + const symbol_tablet &symbol_table, + const goto_functionst &goto_functions, int version) { // header @@ -143,8 +158,7 @@ bool write_goto_binary( case 3: return write_goto_binary_v3( - out, lsymbol_table, functions, - irepconverter); + out, symbol_table, goto_functions, irepconverter); default: throw "unknown goto binary version"; @@ -156,8 +170,7 @@ bool write_goto_binary( /// Writes a goto program to disc bool write_goto_binary( const std::string &filename, - const symbol_tablet &symbol_table, - const goto_functionst &goto_functions, + const goto_modelt &goto_model, message_handlert &message_handler) { std::ofstream out(filename, std::ios::binary); @@ -170,5 +183,5 @@ bool write_goto_binary( return true; } - return write_goto_binary(out, symbol_table, goto_functions); + return write_goto_binary(out, goto_model); } diff --git a/src/goto-programs/write_goto_binary.h b/src/goto-programs/write_goto_binary.h index fd3acd9cb77..d9cf23d6def 100644 --- a/src/goto-programs/write_goto_binary.h +++ b/src/goto-programs/write_goto_binary.h @@ -19,20 +19,23 @@ Author: CM Wintersteiger #include "goto_functions.h" -class symbol_tablet; -class goto_functionst; +class goto_modelt; class message_handlert; bool write_goto_binary( std::ostream &out, - const symbol_tablet &symbol_table, - const goto_functionst &goto_functions, + const goto_modelt &, + int version=GOTO_BINARY_VERSION); + +bool write_goto_binary( + std::ostream &out, + const symbol_tablet &, + const goto_functionst &, int version=GOTO_BINARY_VERSION); bool write_goto_binary( const std::string &filename, - const symbol_tablet &lsymbol_table, - const goto_functionst &goto_functions, - message_handlert &message_handler); + const goto_modelt &, + message_handlert &); #endif // CPROVER_GOTO_PROGRAMS_WRITE_GOTO_BINARY_H diff --git a/src/goto-symex/precondition.cpp b/src/goto-symex/precondition.cpp index 11657a78e55..8b3f9cdf082 100644 --- a/src/goto-symex/precondition.cpp +++ b/src/goto-symex/precondition.cpp @@ -10,12 +10,13 @@ Author: Daniel Kroening, kroening@kroening.com /// Symbolic Execution #include "precondition.h" +#include "goto_symex_state.h" #include #include -#include "goto_symex_state.h" +#include class preconditiont { diff --git a/src/musketeer/fence_shared.cpp b/src/musketeer/fence_shared.cpp index 4dc970c513d..01b608cc1e6 100644 --- a/src/musketeer/fence_shared.cpp +++ b/src/musketeer/fence_shared.cpp @@ -108,10 +108,11 @@ class simple_insertiont explicit simple_insertiont( messaget &_message, value_setst &_value_sets, - const symbol_tablet &_symbol_table, - const goto_functionst &_goto_functions) - :message(_message), value_sets(_value_sets), symbol_table(_symbol_table), - ns(_symbol_table), goto_functions(_goto_functions) + const goto_modelt &_goto_model): + message(_message), value_sets(_value_sets), + symbol_table(_goto_model.symbol_table), + ns(_goto_model.symbol_table), + goto_functions(_goto_model.goto_functions) {} virtual ~simple_insertiont() {} @@ -133,9 +134,8 @@ class fence_all_sharedt:public simple_insertiont fence_all_sharedt( messaget &_message, value_setst &_value_sets, - const symbol_tablet &_symbol_table, - const goto_functionst &_goto_functions) - :simple_insertiont(_message, _value_sets, _symbol_table, _goto_functions) + const goto_modelt &_goto_model): + simple_insertiont(_message, _value_sets, _goto_model) {} }; @@ -155,9 +155,8 @@ class fence_all_shared_aegt:public fence_all_sharedt fence_all_shared_aegt( messaget &_message, value_setst &_value_sets, - const symbol_tablet &_symbol_table, - const goto_functionst &_goto_functions) - :fence_all_sharedt(_message, _value_sets, _symbol_table, _goto_functions) + const goto_modelt &_goto_model): + fence_all_sharedt(_message, _value_sets, _goto_model) {} }; @@ -172,9 +171,8 @@ class fence_volatilet:public simple_insertiont fence_volatilet( messaget &_message, value_setst &_value_sets, - const symbol_tablet &_symbol_table, - const goto_functionst &_goto_functions) - :simple_insertiont(_message, _value_sets, _symbol_table, _goto_functions) + const goto_modelt &_goto_model): + simple_insertiont(_message, _value_sets, _goto_model) {} }; @@ -565,35 +563,29 @@ void fence_all_shared_aegt::fence_all_shared_aeg_explore( void fence_all_shared( message_handlert &message_handler, value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions) + goto_modelt &goto_model) { messaget message(message_handler); - fence_all_sharedt instrumenter(message, value_sets, symbol_table, - goto_functions); + fence_all_sharedt instrumenter(message, value_sets, goto_model); instrumenter.do_it(); } void fence_all_shared_aeg( message_handlert &message_handler, value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions) + goto_modelt &goto_model) { messaget message(message_handler); - fence_all_shared_aegt instrumenter(message, value_sets, symbol_table, - goto_functions); + fence_all_shared_aegt instrumenter(message, value_sets, goto_model); instrumenter.do_it(); } void fence_volatile( message_handlert &message_handler, value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions) + goto_modelt &goto_model) { messaget message(message_handler); - fence_volatilet instrumenter(message, value_sets, symbol_table, - goto_functions); + fence_volatilet instrumenter(message, value_sets, goto_model); instrumenter.do_it(); } diff --git a/src/musketeer/fence_shared.h b/src/musketeer/fence_shared.h index 370e39f817f..2aab83ab713 100644 --- a/src/musketeer/fence_shared.h +++ b/src/musketeer/fence_shared.h @@ -15,29 +15,25 @@ Author: Vincent Nimal #define CPROVER_MUSKETEER_FENCE_SHARED_H class value_setst; -class goto_functionst; -class symbol_tablet; +class goto_modelt; class message_handlert; /* finds all the shared variables (including static, global and dynamic) */ void fence_all_shared( - message_handlert &message_handler, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions); + message_handlert &, + value_setst &, + goto_modelt &); /* finds all the shared variables (including static, global and dynamic) */ void fence_all_shared_aeg( - message_handlert &message_handler, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions); + message_handlert &, + value_setst &, + goto_modelt &); /* finds all the volatile-declared variables */ void fence_volatile( - message_handlert &message_handler, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions); + message_handlert &, + value_setst &, + goto_modelt &); #endif // CPROVER_MUSKETEER_FENCE_SHARED_H diff --git a/src/musketeer/fencer.cpp b/src/musketeer/fencer.cpp index f62917df4e6..0c8619e3003 100644 --- a/src/musketeer/fencer.cpp +++ b/src/musketeer/fencer.cpp @@ -25,8 +25,7 @@ Author: Vincent Nimal void fence_weak_memory( memory_modelt model, value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, bool SCC, instrumentation_strategyt event_strategy, unsigned unwinding_bound, @@ -50,10 +49,10 @@ void fence_weak_memory( message.status() << "--------" << messaget::eom; // all access to shared variables is pushed into assignments - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) if(f_it->first!=CPROVER_PREFIX "initialize" && f_it->first!=goto_functionst::entry_point()) - introduce_temporaries(value_sets, symbol_table, f_it->first, + introduce_temporaries(value_sets, goto_model.symbol_table, f_it->first, f_it->second.body, #ifdef LOCAL_MAY f_it->second, @@ -62,7 +61,7 @@ void fence_weak_memory( message.status() << "Temporary variables added" << messaget::eom; unsigned max_thds = 0; - instrumentert instrumenter(symbol_table, goto_functions, message); + instrumentert instrumenter(goto_model, message); max_thds=instrumenter.goto2graph_cfg(value_sets, model, no_dependencies, duplicate_body); ++max_thds; @@ -167,11 +166,10 @@ void fence_weak_memory( from here*/ /* removes potential skips */ - Forall_goto_functions(f_it, goto_functions) - remove_skip(f_it->second.body); + remove_skip(goto_model); // update counters etc. - goto_functions.update(); + goto_model.goto_functions.update(); // prints the whole abstract graph if(print_graph) diff --git a/src/musketeer/fencer.h b/src/musketeer/fencer.h index b15cb631971..8788ebc4539 100644 --- a/src/musketeer/fencer.h +++ b/src/musketeer/fencer.h @@ -19,14 +19,12 @@ Author: Vincent Nimal class message_handlert; class value_setst; -class goto_functionst; -class symbol_tablet; +class goto_modelt; void fence_weak_memory( memory_modelt model, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + value_setst &, + goto_modelt &, bool SCC, instrumentation_strategyt event_strategy, unsigned unwinding_bound, @@ -42,7 +40,7 @@ void fence_weak_memory( bool hide_internals, bool print_graph, infer_modet mode, - message_handlert &message_handler, + message_handlert &, bool ignore_arrays); #endif // CPROVER_MUSKETEER_FENCER_H diff --git a/src/musketeer/musketeer_parse_options.cpp b/src/musketeer/musketeer_parse_options.cpp index fabb89a3add..1643ad04f57 100644 --- a/src/musketeer/musketeer_parse_options.cpp +++ b/src/musketeer/musketeer_parse_options.cpp @@ -85,11 +85,11 @@ int goto_fence_inserter_parse_optionst::doit() { register_languages(); - goto_functionst goto_functions; + goto_modelt goto_model; - get_goto_program(goto_functions); + get_goto_program(goto_model); - instrument_goto_program(goto_functions); + instrument_goto_program(goto_model); // write new binary? if(cmdline.args.size()==2) @@ -97,7 +97,7 @@ int goto_fence_inserter_parse_optionst::doit() status() << "Writing GOTO program to " << cmdline.args[1] << eom; if(write_goto_binary( - cmdline.args[1], symbol_table, goto_functions, get_message_handler())) + cmdline.args[1], goto_model, get_message_handler())) return 1; else return 0; @@ -132,17 +132,17 @@ int goto_fence_inserter_parse_optionst::doit() } void goto_fence_inserter_parse_optionst::get_goto_program( - goto_functionst &goto_functions) + goto_modelt &goto_model) { status() << "Reading GOTO program from " << cmdline.args[0] << eom; - if(read_goto_binary(cmdline.args[0], - symbol_table, goto_functions, get_message_handler())) + if(read_goto_binary( + cmdline.args[0], goto_model, get_message_handler())) throw 0; } void goto_fence_inserter_parse_optionst::instrument_goto_program( - goto_functionst &goto_functions) + goto_modelt &goto_model) { optionst options; @@ -155,9 +155,9 @@ void goto_fence_inserter_parse_optionst::instrument_goto_program( // we add the library, as some analyses benefit - link_to_library(symbol_table, goto_functions, ui_message_handler); + link_to_library(goto_model, ui_message_handler); - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); if( cmdline.isset("mm") || cmdline.isset("all-shared") @@ -171,27 +171,26 @@ void goto_fence_inserter_parse_optionst::instrument_goto_program( status() << "remove soundly function pointers" << eom; remove_function_pointers( get_message_handler(), - symbol_table, - goto_functions, + goto_model, cmdline.isset("pointer-check")); } if(cmdline.isset("async")) { status() << "Replace pthread_creates by __CPROVER_ASYNC_0:" << eom; - replace_async(ns, goto_functions); - goto_functions.update(); + replace_async(goto_model); + goto_model.goto_functions.update(); } // do partial inlining status() << "Partial Inlining" << eom; - goto_partial_inline(goto_functions, ns, ui_message_handler); + goto_partial_inline(goto_model, get_message_handler()); if(cmdline.isset("const-function-pointer-propagation")) { /* propagate const pointers to functions */ status() << "Propagate Constant Function Pointers" << eom; - propagate_const_function_pointers(symbol_table, goto_functions, + propagate_const_function_pointers(goto_model, get_message_handler()); } @@ -201,8 +200,7 @@ void goto_fence_inserter_parse_optionst::instrument_goto_program( status() << "Function Pointer Removal" << eom; remove_function_pointers( get_message_handler(), - symbol_table, - goto_functions, + goto_model, cmdline.isset("pointer-check"); #endif @@ -214,18 +212,18 @@ void goto_fence_inserter_parse_optionst::instrument_goto_program( #endif #ifndef LOCAL_MAY - value_set_analysis(goto_functions); + value_set_analysis(goto_model.goto_functions); #endif status() << "Removing asm code" << eom; - remove_asm(symbol_table, goto_functions); - goto_functions.update(); + remove_asm(goto_model); + goto_model.goto_functions.update(); if(cmdline.isset("all-shared")) { status() << "Shared variables accesses detection" << eom; - fence_all_shared(get_message_handler(), value_set_analysis, symbol_table, - goto_functions); + fence_all_shared(get_message_handler(), value_set_analysis, + goto_model); // simple analysis, coupled with script to insert; // does not transform the goto-binary return; @@ -234,7 +232,7 @@ void goto_fence_inserter_parse_optionst::instrument_goto_program( { status() << "Shared variables accesses detection (CF)" << eom; fence_all_shared_aeg(get_message_handler(), value_set_analysis, - symbol_table, goto_functions); + goto_model); // simple analysis, coupled with script to insert; // does not transform the goto-binary return; @@ -243,8 +241,8 @@ void goto_fence_inserter_parse_optionst::instrument_goto_program( { status() << "Detection of variables declared volatile" << eom; - fence_volatile(get_message_handler(), value_set_analysis, symbol_table, - goto_functions); + fence_volatile(get_message_handler(), value_set_analysis, + goto_model); // simple analysis, coupled with script to insert; // does not transform the goto-binary return; @@ -263,8 +261,7 @@ void goto_fence_inserter_parse_optionst::instrument_goto_program( fence_pensieve( value_set_analysis, - symbol_table, - goto_functions, + goto_model, unwind_loops, max_po_trans, !cmdline.isset("no-po-rendering"), @@ -282,7 +279,7 @@ void goto_fence_inserter_parse_optionst::instrument_goto_program( memory_modelt model; status() << "Fence detection for " << mm - << " via critical cycles and ILP" << eom; + << " via critical cycles and ILP" << eom; // strategy of instrumentation instrumentation_strategyt inst_strategy; @@ -355,8 +352,7 @@ void goto_fence_inserter_parse_optionst::instrument_goto_program( fence_weak_memory( model, value_set_analysis, - symbol_table, - goto_functions, + goto_model, cmdline.isset("scc"), inst_strategy, unwind_loops, @@ -378,16 +374,16 @@ void goto_fence_inserter_parse_optionst::instrument_goto_program( } // add failed symbols - add_failed_symbols(symbol_table); + add_failed_symbols(goto_model.symbol_table); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); // add loop ids - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.compute_loop_numbers(); // label the assertions - label_properties(goto_functions); + label_properties(goto_model); } /// display command line help diff --git a/src/musketeer/musketeer_parse_options.h b/src/musketeer/musketeer_parse_options.h index 13d0a07ef19..e227e4cf4a3 100644 --- a/src/musketeer/musketeer_parse_options.h +++ b/src/musketeer/musketeer_parse_options.h @@ -16,7 +16,7 @@ Module: Command Line Parsing #include #include -#include +#include #define GOTO_FENCE_INSERTER_OPTIONS \ "(scc)(one-event-per-cycle)(verbosity):" \ @@ -47,11 +47,9 @@ class goto_fence_inserter_parse_optionst: virtual void register_languages(); - void get_goto_program( - goto_functionst &goto_functions); + void get_goto_program(goto_modelt &); - void instrument_goto_program( - goto_functionst &goto_functions); + void instrument_goto_program(goto_modelt &); void set_verbosity(); }; diff --git a/src/musketeer/pensieve.cpp b/src/musketeer/pensieve.cpp index d46397f74a3..4b514dd84d0 100644 --- a/src/musketeer/pensieve.cpp +++ b/src/musketeer/pensieve.cpp @@ -18,8 +18,7 @@ Author: Vincent Nimal void fence_pensieve( value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, unsigned unwinding_bound, unsigned input_max_po_trans, bool render_po, @@ -33,10 +32,10 @@ void fence_pensieve( message.status() << "--------" << messaget::eom; // all access to shared variables is pushed into assignments - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) if(f_it->first!=CPROVER_PREFIX "initialize" && f_it->first!=goto_functionst::entry_point()) - introduce_temporaries(value_sets, symbol_table, f_it->first, + introduce_temporaries(value_sets, goto_model.symbol_table, f_it->first, f_it->second.body, #ifdef LOCAL_MAY f_it->second, @@ -46,7 +45,7 @@ void fence_pensieve( unsigned max_thds = 0; - instrumenter_pensievet instrumenter(symbol_table, goto_functions, message); + instrumenter_pensievet instrumenter(goto_model, message); max_thds=instrumenter.goto2graph_cfg(value_sets, Power, true, no_loop); message.status() << "Abstract event graph computed" << messaget::eom; @@ -56,7 +55,7 @@ void fence_pensieve( instrumenter.set_parameters_collection(max_thds); /* necessary for correct printings */ - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); if(naive_mode) instrumenter.collect_pairs_naive(ns); @@ -64,9 +63,9 @@ void fence_pensieve( instrumenter.collect_pairs(ns); /* removes potential skips */ - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) remove_skip(f_it->second.body); // update counters etc. - goto_functions.update(); + goto_model.goto_functions.update(); } diff --git a/src/musketeer/pensieve.h b/src/musketeer/pensieve.h index 9513a26c433..a6bf34bd00c 100644 --- a/src/musketeer/pensieve.h +++ b/src/musketeer/pensieve.h @@ -16,14 +16,12 @@ Author: Vincent Nimal #include class value_setst; -class goto_functionst; -class symbol_tablet; +class goto_modelt; class message_handlert; void fence_pensieve( value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, unsigned unwinding_bound, unsigned max_po_trans, bool render_po, diff --git a/src/musketeer/propagate_const_function_pointers.cpp b/src/musketeer/propagate_const_function_pointers.cpp index e58efe92429..c7078a50c19 100644 --- a/src/musketeer/propagate_const_function_pointers.cpp +++ b/src/musketeer/propagate_const_function_pointers.cpp @@ -18,8 +18,7 @@ Author: Vincent Nimal #include #include -#include -#include +#include #include #include @@ -142,10 +141,11 @@ class const_function_pointer_propagationt }; public: - const_function_pointer_propagationt(symbol_tablet &_symbol_table, - goto_functionst &_goto_functions, messaget &_message) - :symbol_table(_symbol_table), goto_functions(_goto_functions), - ns(_symbol_table), message(_message) + const_function_pointer_propagationt( + goto_modelt &_goto_model, messaget &_message): + symbol_table(_goto_model.symbol_table), + goto_functions(_goto_model.goto_functions), + ns(_goto_model.symbol_table), message(_message) {} /* Note that it only propagates from MAIN, following the CFG, without @@ -556,13 +556,12 @@ void const_function_pointer_propagationt::propagate( } void propagate_const_function_pointers( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, message_handlert &message_handler) { messaget message(message_handler); - const_function_pointer_propagationt propagation(symbol_table, - goto_functions, message); + const_function_pointer_propagationt propagation( + goto_model, message); propagation.propagate(); - goto_functions.update(); + goto_model.goto_functions.update(); } diff --git a/src/musketeer/propagate_const_function_pointers.h b/src/musketeer/propagate_const_function_pointers.h index af1b5497b41..660f57afbc5 100644 --- a/src/musketeer/propagate_const_function_pointers.h +++ b/src/musketeer/propagate_const_function_pointers.h @@ -12,8 +12,7 @@ Author: Vincent Nimal #ifndef CPROVER_MUSKETEER_PROPAGATE_CONST_FUNCTION_POINTERS_H #define CPROVER_MUSKETEER_PROPAGATE_CONST_FUNCTION_POINTERS_H -class symbol_tablet; -class goto_functionst; +class goto_modelt; class message_handlert; /* Note that it only propagates from MAIN, following the CFG, without @@ -24,8 +23,7 @@ class message_handlert; functions-based exploration in remove_function_pointers. */ void propagate_const_function_pointers( - symbol_tablet &symbol_tables, - goto_functionst &goto_functions, - message_handlert &message_handler); + goto_modelt &, + message_handlert &); #endif // CPROVER_MUSKETEER_PROPAGATE_CONST_FUNCTION_POINTERS_H diff --git a/src/musketeer/replace_async.h b/src/musketeer/replace_async.h index 9f3a85e1159..5d4a9eb27ff 100644 --- a/src/musketeer/replace_async.h +++ b/src/musketeer/replace_async.h @@ -12,17 +12,14 @@ Date: December 2013 #ifndef CPROVER_MUSKETEER_REPLACE_ASYNC_H #define CPROVER_MUSKETEER_REPLACE_ASYNC_H -#include +#include #include -class goto_functionst; -class namespacet; - -void replace_async( - const namespacet &ns, - goto_functionst &goto_functions) +void replace_async(goto_modelt &goto_model) { - Forall_goto_functions(f_it, goto_functions) + const namespacet ns(goto_model.symbol_table); + + Forall_goto_functions(f_it, goto_model.goto_functions) { goto_programt &program=f_it->second.body; diff --git a/src/pointer-analysis/goto_program_dereference.cpp b/src/pointer-analysis/goto_program_dereference.cpp index 857f9e722fc..64f9d5fe071 100644 --- a/src/pointer-analysis/goto_program_dereference.cpp +++ b/src/pointer-analysis/goto_program_dereference.cpp @@ -392,18 +392,18 @@ void remove_pointers( } void remove_pointers( - goto_functionst &goto_functions, - symbol_tablet &symbol_table, + goto_modelt &goto_model, value_setst &value_sets) { - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); optionst options; goto_program_dereferencet - goto_program_dereference(ns, symbol_table, options, value_sets); + goto_program_dereference( + ns, goto_model.symbol_table, options, value_sets); - Forall_goto_functions(it, goto_functions) + Forall_goto_functions(it, goto_model.goto_functions) goto_program_dereference.dereference_program(it->second.body); } diff --git a/src/pointer-analysis/goto_program_dereference.h b/src/pointer-analysis/goto_program_dereference.h index 5f2a76083ab..312dcc9f069 100644 --- a/src/pointer-analysis/goto_program_dereference.h +++ b/src/pointer-analysis/goto_program_dereference.h @@ -14,7 +14,7 @@ Author: Daniel Kroening, kroening@kroening.com #include -#include +#include #include "value_sets.h" #include "value_set_dereference.h" @@ -99,29 +99,28 @@ class goto_program_dereferencet:protected dereference_callbackt void dereference( goto_programt::const_targett target, exprt &expr, - const namespacet &ns, - value_setst &value_sets); + const namespacet &, + value_setst &); void remove_pointers( - goto_programt &goto_program, - symbol_tablet &symbol_table, - value_setst &value_sets); + goto_modelt &, + value_setst &); void remove_pointers( - goto_functionst &goto_functions, - symbol_tablet &symbol_table, - value_setst &value_sets); + goto_functionst &, + symbol_tablet &, + value_setst &); void pointer_checks( - goto_programt &goto_program, - symbol_tablet &symbol_table, - const optionst &options, - value_setst &value_sets); + goto_programt &, + symbol_tablet &, + const optionst &, + value_setst &); void pointer_checks( - goto_functionst &goto_functions, - symbol_tablet &symbol_table, - const optionst &options, - value_setst &value_sets); + goto_functionst &, + symbol_tablet &, + const optionst &, + value_setst &); #endif // CPROVER_POINTER_ANALYSIS_GOTO_PROGRAM_DEREFERENCE_H diff --git a/src/pointer-analysis/show_value_sets.cpp b/src/pointer-analysis/show_value_sets.cpp index ce555e2dd02..e1dc0bb938e 100644 --- a/src/pointer-analysis/show_value_sets.cpp +++ b/src/pointer-analysis/show_value_sets.cpp @@ -10,16 +10,17 @@ Author: Daniel Kroening, kroening@kroening.com /// Show Value Sets #include "show_value_sets.h" +#include "value_set_analysis.h" -#include +#include #include -#include "value_set_analysis.h" +#include void show_value_sets( ui_message_handlert::uit ui, - const goto_functionst &goto_functions, + const goto_modelt &goto_model, const value_set_analysist &value_set_analysis) { switch(ui) @@ -27,13 +28,13 @@ void show_value_sets( case ui_message_handlert::uit::XML_UI: { xmlt xml; - convert(goto_functions, value_set_analysis, xml); + convert(goto_model.goto_functions, value_set_analysis, xml); std::cout << xml << '\n'; } break; case ui_message_handlert::uit::PLAIN: - value_set_analysis.output(goto_functions, std::cout); + value_set_analysis.output(goto_model.goto_functions, std::cout); break; default: diff --git a/src/pointer-analysis/show_value_sets.h b/src/pointer-analysis/show_value_sets.h index d25b7addd4e..3b080f66e62 100644 --- a/src/pointer-analysis/show_value_sets.h +++ b/src/pointer-analysis/show_value_sets.h @@ -14,18 +14,12 @@ Author: Daniel Kroening, kroening@kroening.com #include -class goto_functionst; -class goto_programt; +class goto_modelt; class value_set_analysist; void show_value_sets( - ui_message_handlert::uit ui, - const goto_functionst &goto_functions, - const value_set_analysist &value_set_analysis); - -void show_value_sets( - ui_message_handlert::uit ui, - const goto_programt &goto_program, - const value_set_analysist &value_set_analysis); + ui_message_handlert::uit, + const goto_modelt &, + const value_set_analysist &); #endif // CPROVER_POINTER_ANALYSIS_SHOW_VALUE_SETS_H diff --git a/src/solvers/refinement/bv_refinement.h b/src/solvers/refinement/bv_refinement.h index 6d4fb84db95..ffe90729657 100644 --- a/src/solvers/refinement/bv_refinement.h +++ b/src/solvers/refinement/bv_refinement.h @@ -25,7 +25,7 @@ class bv_refinementt:public bv_pointerst { const namespacet *ns=nullptr; propt *prop=nullptr; - language_uit::uit ui=language_uit::uit::PLAIN; + ui_message_handlert::uit ui=ui_message_handlert::uit::PLAIN; /// Max number of times we refine a formula node unsigned max_node_refinement=5; /// Enable array refinement diff --git a/src/solvers/refinement/string_refinement.h b/src/solvers/refinement/string_refinement.h index 021176d4178..50d0fcfb129 100644 --- a/src/solvers/refinement/string_refinement.h +++ b/src/solvers/refinement/string_refinement.h @@ -37,7 +37,7 @@ class string_refinementt final: public bv_refinementt { const namespacet *ns=nullptr; propt *prop=nullptr; - language_uit::uit ui=language_uit::uit::PLAIN; + ui_message_handlert::uit ui=ui_message_handlert::uit::PLAIN; unsigned refinement_bound=0; size_t string_max_length=std::numeric_limits::max(); /// Make non-deterministic character arrays have at least one character diff --git a/src/symex/symex_parse_options.cpp b/src/symex/symex_parse_options.cpp index d5fd98ff686..b41cf2ffe59 100644 --- a/src/symex/symex_parse_options.cpp +++ b/src/symex/symex_parse_options.cpp @@ -59,7 +59,7 @@ Author: Daniel Kroening, kroening@kroening.com symex_parse_optionst::symex_parse_optionst(int argc, const char **argv): parse_options_baset(SYMEX_OPTIONS, argc, argv), - language_uit(cmdline, ui_message_handler), + messaget(ui_message_handler), ui_message_handler(cmdline, "Symex " CBMC_VERSION) { } @@ -341,42 +341,15 @@ bool symex_parse_optionst::process_goto_program(const optionst &options) if(cmdline.isset("cover")) { - std::string criterion=cmdline.get_value("cover"); - - coverage_criteriont c; - - if(criterion=="assertion" || criterion=="assertions") - c=coverage_criteriont::ASSERTION; - else if(criterion=="path" || criterion=="paths") - c=coverage_criteriont::PATH; - else if(criterion=="branch" || criterion=="branches") - c=coverage_criteriont::BRANCH; - else if(criterion=="location" || criterion=="locations") - c=coverage_criteriont::LOCATION; - else if(criterion=="decision" || criterion=="decisions") - c=coverage_criteriont::DECISION; - else if(criterion=="condition" || criterion=="conditions") - c=coverage_criteriont::CONDITION; - else if(criterion=="mcdc") - c=coverage_criteriont::MCDC; - else if(criterion=="cover") - c=coverage_criteriont::COVER; - else - { - error() << "unknown coverage criterion" << eom; - return true; - } - status() << "Instrumenting coverage goals" << eom; - instrument_cover_goals( - symbol_table, goto_model.goto_functions, c, get_message_handler()); - goto_model.goto_functions.update(); + if(instrument_cover_goals(cmdline, goto_model, get_message_handler())) + return true; } // show it? if(cmdline.isset("show-loops")) { - show_loop_ids(get_ui(), goto_model.goto_functions); + show_loop_ids(get_ui(), goto_model); return true; } diff --git a/src/symex/symex_parse_options.h b/src/symex/symex_parse_options.h index 7278cbf1261..7e6f378911c 100644 --- a/src/symex/symex_parse_options.h +++ b/src/symex/symex_parse_options.h @@ -55,7 +55,7 @@ class optionst; class symex_parse_optionst: public parse_options_baset, - public language_uit + public messaget { public: virtual int doit(); @@ -80,6 +80,11 @@ class symex_parse_optionst: void eval_verbosity(); std::string get_test(const goto_tracet &goto_trace); + + ui_message_handlert::uit get_ui() const + { + return ui_message_handler.get_ui(); + } }; #endif // CPROVER_SYMEX_SYMEX_PARSE_OPTIONS_H From fc4d44a95d4dd8957240d146dec0ed883372e152 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Thu, 7 Sep 2017 13:15:23 +0100 Subject: [PATCH 22/80] use goto_modelt --- unit/analyses/call_graph.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/unit/analyses/call_graph.cpp b/unit/analyses/call_graph.cpp index adc2e75e6c8..2f249b42147 100644 --- a/unit/analyses/call_graph.cpp +++ b/unit/analyses/call_graph.cpp @@ -56,7 +56,7 @@ SCENARIO("call_graph", // void C() { } // void D() { } - symbol_tablet symbol_table; + goto_modelt goto_model; code_typet void_function_type; { @@ -68,7 +68,8 @@ SCENARIO("call_graph", calls.move_to_operands(call1); calls.move_to_operands(call2); - symbol_table.add(create_void_function_symbol("A", calls)); + goto_model.symbol_table.add( + create_void_function_symbol("A", calls)); } { @@ -80,17 +81,19 @@ SCENARIO("call_graph", calls.move_to_operands(call1); calls.move_to_operands(call2); - symbol_table.add(create_void_function_symbol("B", calls)); + goto_model.symbol_table.add( + create_void_function_symbol("B", calls)); } - symbol_table.add(create_void_function_symbol("C", code_skipt())); - symbol_table.add(create_void_function_symbol("D", code_skipt())); + goto_model.symbol_table.add( + create_void_function_symbol("C", code_skipt())); + goto_model.symbol_table.add( + create_void_function_symbol("D", code_skipt())); - goto_functionst goto_functions; stream_message_handlert msg(std::cout); - goto_convert(symbol_table, goto_functions, msg); + goto_convert(goto_model, msg); - call_grapht call_graph_from_goto_functions(goto_functions); + call_grapht call_graph_from_goto_functions(goto_model); WHEN("A call graph is constructed from the GOTO functions") { From e4498ca908d011b8aaf950ff41c5f85b5375d896 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Wed, 23 Aug 2017 14:45:46 +0100 Subject: [PATCH 23/80] brief list of symbols, from language_uit --- .../goto_instrument_parse_options.cpp | 3 +- src/goto-programs/show_symbol_table.cpp | 77 ++++++++++++++++++- src/goto-programs/show_symbol_table.h | 13 ++++ 3 files changed, 88 insertions(+), 5 deletions(-) diff --git a/src/goto-instrument/goto_instrument_parse_options.cpp b/src/goto-instrument/goto_instrument_parse_options.cpp index dacfa6c8077..397dfc10536 100644 --- a/src/goto-instrument/goto_instrument_parse_options.cpp +++ b/src/goto-instrument/goto_instrument_parse_options.cpp @@ -41,6 +41,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include +#include #include #include @@ -467,7 +468,7 @@ int goto_instrument_parse_optionst::doit() if(cmdline.isset("show-symbol-table")) { - show_symbol_table(goto_model, get_ui()); + ::show_symbol_table(goto_model, get_ui()); return 0; } diff --git a/src/goto-programs/show_symbol_table.cpp b/src/goto-programs/show_symbol_table.cpp index eebb63dcfcd..b4230f9086b 100644 --- a/src/goto-programs/show_symbol_table.cpp +++ b/src/goto-programs/show_symbol_table.cpp @@ -23,8 +23,44 @@ void show_symbol_table_xml_ui() { } +void show_symbol_table_brief_plain( + const symbol_tablet &symbol_table, + std::ostream &out) +{ + // we want to sort alphabetically + std::set symbols; + + forall_symbols(it, symbol_table.symbols) + symbols.insert(id2string(it->first)); + + const namespacet ns(symbol_table); + + for(const std::string &id : symbols) + { + const symbolt &symbol=ns.lookup(id); + + std::unique_ptr ptr; + + if(symbol.mode=="") + ptr=get_default_language(); + else + { + ptr=get_language_from_mode(symbol.mode); + if(ptr==nullptr) + throw "symbol "+id2string(symbol.name)+" has unknown mode"; + } + + std::string type_str; + + if(symbol.type.is_not_nil()) + ptr->from_type(symbol.type, type_str, ns); + + out << symbol.name << " " << type_str << '\n'; + } +} + void show_symbol_table_plain( - const goto_modelt &goto_model, + const symbol_tablet &symbol_table, std::ostream &out) { out << '\n' << "Symbols:" << '\n' << '\n'; @@ -32,10 +68,10 @@ void show_symbol_table_plain( // we want to sort alphabetically std::set symbols; - forall_symbols(it, goto_model.symbol_table.symbols) + forall_symbols(it, symbol_table.symbols) symbols.insert(id2string(it->first)); - const namespacet ns(goto_model.symbol_table); + const namespacet ns(symbol_table); for(const std::string &id : symbols) { @@ -112,14 +148,40 @@ void show_symbol_table_plain( } } +void show_symbol_table( + const symbol_tablet &symbol_table, + ui_message_handlert::uit ui) +{ + switch(ui) + { + case ui_message_handlert::uit::PLAIN: + show_symbol_table_plain(symbol_table, std::cout); + break; + + case ui_message_handlert::uit::XML_UI: + show_symbol_table_xml_ui(); + break; + + default: + break; + } +} + void show_symbol_table( const goto_modelt &goto_model, ui_message_handlert::uit ui) +{ + show_symbol_table(goto_model.symbol_table, ui); +} + +void show_symbol_table_brief( + const symbol_tablet &symbol_table, + ui_message_handlert::uit ui) { switch(ui) { case ui_message_handlert::uit::PLAIN: - show_symbol_table_plain(goto_model, std::cout); + show_symbol_table_brief_plain(symbol_table, std::cout); break; case ui_message_handlert::uit::XML_UI: @@ -130,3 +192,10 @@ void show_symbol_table( break; } } + +void show_symbol_table_brief( + const goto_modelt &goto_model, + ui_message_handlert::uit ui) +{ + show_symbol_table_brief(goto_model.symbol_table, ui); +} diff --git a/src/goto-programs/show_symbol_table.h b/src/goto-programs/show_symbol_table.h index 5ad717e7049..82e49128967 100644 --- a/src/goto-programs/show_symbol_table.h +++ b/src/goto-programs/show_symbol_table.h @@ -14,9 +14,22 @@ Author: Daniel Kroening, kroening@kroening.com #include +class symbol_tablet; class goto_modelt; void show_symbol_table( + const symbol_tablet &, + ui_message_handlert::uit ui); + +void show_symbol_table_brief( + const symbol_tablet &, + ui_message_handlert::uit ui); + +void show_symbol_table( + const goto_modelt &, + ui_message_handlert::uit ui); + +void show_symbol_table_brief( const goto_modelt &, ui_message_handlert::uit ui); From 8c4ff7b7070548665abee173f58fdc22f993720f Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Wed, 23 Aug 2017 14:05:19 +0100 Subject: [PATCH 24/80] remove spurious references to langapi/language_ui.h --- src/cbmc/bmc.h | 4 ++-- src/cbmc/cbmc_parse_options.h | 2 -- src/cbmc/cbmc_solvers.h | 6 +++--- src/cbmc/fault_localization.h | 1 - src/goto-cc/gcc_mode.h | 6 +++--- src/goto-cc/goto_cc_mode.h | 4 ++-- src/goto-diff/goto_diff.h | 8 ++++---- src/goto-diff/goto_diff_parse_options.h | 2 -- src/goto-instrument/goto_instrument_parse_options.h | 5 ++--- src/goto-programs/read_goto_binary.cpp | 2 -- src/solvers/refinement/bv_refinement.h | 4 ++-- src/solvers/refinement/string_constraint.h | 1 - src/symex/symex_parse_options.h | 2 -- .../instantiate_not_contains.cpp | 2 +- 14 files changed, 19 insertions(+), 30 deletions(-) diff --git a/src/cbmc/bmc.h b/src/cbmc/bmc.h index 6c9a5c6bd31..c1896935460 100644 --- a/src/cbmc/bmc.h +++ b/src/cbmc/bmc.h @@ -57,7 +57,7 @@ class bmct:public safety_checkert // additional stuff expr_listt bmc_constraints; - void set_ui(language_uit::uit _ui) { ui=_ui; } + void set_ui(ui_message_handlert::uit _ui) { ui=_ui; } // the safety_checkert interface virtual resultt operator()( @@ -75,7 +75,7 @@ class bmct:public safety_checkert prop_convt &prop_conv; // use gui format - language_uit::uit ui; + ui_message_handlert::uit ui; virtual decision_proceduret::resultt run_decision_procedure(prop_convt &prop_conv); diff --git a/src/cbmc/cbmc_parse_options.h b/src/cbmc/cbmc_parse_options.h index 33c5dca4602..e0d23a986c0 100644 --- a/src/cbmc/cbmc_parse_options.h +++ b/src/cbmc/cbmc_parse_options.h @@ -15,8 +15,6 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include - #include #include diff --git a/src/cbmc/cbmc_solvers.h b/src/cbmc/cbmc_solvers.h index 02bbb8b5db9..2245ff59b70 100644 --- a/src/cbmc/cbmc_solvers.h +++ b/src/cbmc/cbmc_solvers.h @@ -17,6 +17,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include +#include #include #include @@ -25,7 +26,6 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include -#include #include #include "bv_cbmc.h" @@ -123,7 +123,7 @@ class cbmc_solverst:public messaget { } - void set_ui(language_uit::uit _ui) { ui=_ui; } + void set_ui(ui_message_handlert::uit _ui) { ui=_ui; } protected: const optionst &options; @@ -131,7 +131,7 @@ class cbmc_solverst:public messaget namespacet ns; // use gui format - language_uit::uit ui; + ui_message_handlert::uit ui; std::unique_ptr get_default(); std::unique_ptr get_dimacs(); diff --git a/src/cbmc/fault_localization.h b/src/cbmc/fault_localization.h index 008bb819b1e..dd0227327e6 100644 --- a/src/cbmc/fault_localization.h +++ b/src/cbmc/fault_localization.h @@ -15,7 +15,6 @@ Author: Peter Schrammel #include #include #include -#include #include diff --git a/src/goto-cc/gcc_mode.h b/src/goto-cc/gcc_mode.h index 8d77ed29af1..e0a5fc9f4dd 100644 --- a/src/goto-cc/gcc_mode.h +++ b/src/goto-cc/gcc_mode.h @@ -14,12 +14,12 @@ Date: June 2006 #ifndef CPROVER_GOTO_CC_GCC_MODE_H #define CPROVER_GOTO_CC_GCC_MODE_H -#include - #include "compile.h" #include "goto_cc_mode.h" -class compilet; +#include + +#include class gcc_modet:public goto_cc_modet { diff --git a/src/goto-cc/goto_cc_mode.h b/src/goto-cc/goto_cc_mode.h index a0b6ea47a96..6dbad84d3ce 100644 --- a/src/goto-cc/goto_cc_mode.h +++ b/src/goto-cc/goto_cc_mode.h @@ -14,10 +14,10 @@ Date: June 2006 #ifndef CPROVER_GOTO_CC_GOTO_CC_MODE_H #define CPROVER_GOTO_CC_GOTO_CC_MODE_H -#include - #include "goto_cc_cmdline.h" +#include + class goto_cc_modet:public messaget { public: diff --git a/src/goto-diff/goto_diff.h b/src/goto-diff/goto_diff.h index 2b6a9ac923d..23a65221358 100644 --- a/src/goto-diff/goto_diff.h +++ b/src/goto-diff/goto_diff.h @@ -13,9 +13,9 @@ Author: Peter Schrammel #define CPROVER_GOTO_DIFF_GOTO_DIFF_H #include -#include -#include + #include +#include #include @@ -37,14 +37,14 @@ class goto_difft:public messaget virtual bool operator()()=0; - void set_ui(language_uit::uit _ui) { ui=_ui; } + void set_ui(ui_message_handlert::uit _ui) { ui=_ui; } virtual std::ostream &output_functions(std::ostream &out) const; protected: const goto_modelt &goto_model1; const goto_modelt &goto_model2; - language_uit::uit ui; + ui_message_handlert::uit ui; unsigned total_functions_count; typedef std::set irep_id_sett; diff --git a/src/goto-diff/goto_diff_parse_options.h b/src/goto-diff/goto_diff_parse_options.h index 505de8410f4..a79cd064706 100644 --- a/src/goto-diff/goto_diff_parse_options.h +++ b/src/goto-diff/goto_diff_parse_options.h @@ -15,8 +15,6 @@ Author: Peter Schrammel #include #include -#include - #include #include diff --git a/src/goto-instrument/goto_instrument_parse_options.h b/src/goto-instrument/goto_instrument_parse_options.h index 5dc2c017d41..2a921437603 100644 --- a/src/goto-instrument/goto_instrument_parse_options.h +++ b/src/goto-instrument/goto_instrument_parse_options.h @@ -15,7 +15,6 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include #include #include #include @@ -82,7 +81,7 @@ Author: Daniel Kroening, kroening@kroening.com class goto_instrument_parse_optionst: public parse_options_baset, - public language_uit + public messaget { public: virtual int doit(); @@ -90,7 +89,7 @@ class goto_instrument_parse_optionst: goto_instrument_parse_optionst(int argc, const char **argv): parse_options_baset(GOTO_INSTRUMENT_OPTIONS, argc, argv), - language_uit(cmdline, ui_message_handler), + messaget(ui_message_handler), ui_message_handler(cmdline, "goto-instrument"), function_pointer_removal_done(false), partial_inlining_done(false), diff --git a/src/goto-programs/read_goto_binary.cpp b/src/goto-programs/read_goto_binary.cpp index 2b4a3805401..9e7a1968ccc 100644 --- a/src/goto-programs/read_goto_binary.cpp +++ b/src/goto-programs/read_goto_binary.cpp @@ -30,8 +30,6 @@ Module: Read Goto Programs #include #include -#include - #include "goto_model.h" #include "link_goto_model.h" #include "read_bin_goto_object.h" diff --git a/src/solvers/refinement/bv_refinement.h b/src/solvers/refinement/bv_refinement.h index ffe90729657..79367186b9b 100644 --- a/src/solvers/refinement/bv_refinement.h +++ b/src/solvers/refinement/bv_refinement.h @@ -12,7 +12,7 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_SOLVERS_REFINEMENT_BV_REFINEMENT_H #define CPROVER_SOLVERS_REFINEMENT_BV_REFINEMENT_H -#include +#include #include @@ -114,7 +114,7 @@ class bv_refinementt:public bv_pointerst protected: // use gui format - language_uit::uit ui; + ui_message_handlert::uit ui; }; #endif // CPROVER_SOLVERS_REFINEMENT_BV_REFINEMENT_H diff --git a/src/solvers/refinement/string_constraint.h b/src/solvers/refinement/string_constraint.h index c553efb8c7e..f2a19153fe6 100644 --- a/src/solvers/refinement/string_constraint.h +++ b/src/solvers/refinement/string_constraint.h @@ -20,7 +20,6 @@ Author: Romain Brenguier, romain.brenguier@diffblue.com #ifndef CPROVER_SOLVERS_REFINEMENT_STRING_CONSTRAINT_H #define CPROVER_SOLVERS_REFINEMENT_STRING_CONSTRAINT_H -#include #include #include #include diff --git a/src/symex/symex_parse_options.h b/src/symex/symex_parse_options.h index 7e6f378911c..a3fb841f20b 100644 --- a/src/symex/symex_parse_options.h +++ b/src/symex/symex_parse_options.h @@ -18,8 +18,6 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include - #include #include diff --git a/unit/solvers/refinement/string_constraint_instantiation/instantiate_not_contains.cpp b/unit/solvers/refinement/string_constraint_instantiation/instantiate_not_contains.cpp index 48cf3ed8e27..ed72dc6aa0c 100644 --- a/unit/solvers/refinement/string_constraint_instantiation/instantiate_not_contains.cpp +++ b/unit/solvers/refinement/string_constraint_instantiation/instantiate_not_contains.cpp @@ -122,7 +122,7 @@ decision_proceduret::resultt check_sat(const exprt &expr, const namespacet &ns) bv_refinementt::infot info; info.ns=&ns; info.prop=&sat_check; - const auto ui=language_uit::uit::PLAIN; + const auto ui=ui_message_handlert::uit::PLAIN; info.ui=ui; bv_refinementt solver(info); solver << expr; From 7d30cde2bcdf2ca5a37ff69e32909eff625a6a34 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Thu, 7 Sep 2017 13:28:36 +0100 Subject: [PATCH 25/80] missing copyright header --- unit/analyses/call_graph.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/unit/analyses/call_graph.cpp b/unit/analyses/call_graph.cpp index 2f249b42147..36b829cd103 100644 --- a/unit/analyses/call_graph.cpp +++ b/unit/analyses/call_graph.cpp @@ -1,3 +1,10 @@ +/*******************************************************************\ + +Module: Unit test for call graph generation + +Author: + +\*******************************************************************/ #include From fe60e60a5bfdad28ec64790e816b812692dc8666 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Sun, 10 Sep 2017 09:01:37 +0100 Subject: [PATCH 26/80] pthread_create arguments null/nonnull fix --- src/ansi-c/library/pthread_lib.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/ansi-c/library/pthread_lib.c b/src/ansi-c/library/pthread_lib.c index 71af169c91b..97194052a54 100644 --- a/src/ansi-c/library/pthread_lib.c +++ b/src/ansi-c/library/pthread_lib.c @@ -523,10 +523,10 @@ extern __CPROVER_thread_local unsigned long __CPROVER_thread_id; extern unsigned long __CPROVER_next_thread_id; inline int pthread_create( - pthread_t *thread, - const pthread_attr_t *attr, - void * (*start_routine)(void *), - void *arg) + pthread_t *thread, // must not be null + const pthread_attr_t *attr, // may be null + void * (*start_routine)(void *), // must not be null + void *arg) // may be null { __CPROVER_HIDE:; unsigned long this_thread_id; @@ -534,11 +534,8 @@ inline int pthread_create( this_thread_id=++__CPROVER_next_thread_id; __CPROVER_atomic_end(); - if(thread) - { - // pthread_t is a pointer type on some systems - *thread=(pthread_t)this_thread_id; - } + // pthread_t is a pointer type on some systems + *thread=(pthread_t)this_thread_id; #ifdef __CPROVER_CUSTOM_BITVECTOR_ANALYSIS __CPROVER_set_must(thread, "pthread-id"); From 95c5e63dce1047f5bc0759ed9d47fc994ba7c079 Mon Sep 17 00:00:00 2001 From: reuk Date: Mon, 11 Sep 2017 11:15:21 +0100 Subject: [PATCH 27/80] Disable Alpine in Travis --- .travis.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index a772cb400d1..819f340875f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,20 +39,6 @@ jobs: # env: COMPILER=g++-5 SAN_FLAGS="-fsanitize=undefined -fno-sanitize-recover -fno-omit-frame-pointer" env: COMPILER="ccache g++-5" - # Alpine Linux with musl-libc using g++ - - stage: Test different OS/CXX/Flags - os: linux - sudo: required - compiler: gcc - cache: ccache - services: - - docker - before_install: - - docker pull diffblue/cbmc-builder:alpine-0.0.3 - env: - - PRE_COMMAND="docker run -v ${TRAVIS_BUILD_DIR}:/cbmc -v ${HOME}/.ccache:/root/.ccache diffblue/cbmc-builder:alpine-0.0.3" - - COMPILER="ccache g++" - # OS X using g++ - stage: Test different OS/CXX/Flags os: osx From 3ddd377ca6d4c10149997889717d317b4705900c Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Mon, 11 Sep 2017 11:25:35 +0100 Subject: [PATCH 28/80] clean-out ill-modeled optimization in string comparisons --- src/ansi-c/library/string.c | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/src/ansi-c/library/string.c b/src/ansi-c/library/string.c index 35cf46f7f66..0dabca6ebc5 100644 --- a/src/ansi-c/library/string.c +++ b/src/ansi-c/library/string.c @@ -298,12 +298,6 @@ inline char *strncat(char *dst, const char *src, size_t n) inline int strcmp(const char *s1, const char *s2) { __CPROVER_HIDE:; - #if !defined(__linux__) || defined(__GLIBC__) - if(s1!=0 && s1==s2) return 0; - #else - // musl guarantees non-null of s1 - if(s1==s2) return 0; - #endif #ifdef __CPROVER_STRING_ABSTRACTION int retval; __CPROVER_assert(__CPROVER_is_zero_string(s1), "strcmp zero-termination of 1st argument"); @@ -345,12 +339,6 @@ inline int strcmp(const char *s1, const char *s2) inline int strcasecmp(const char *s1, const char *s2) { __CPROVER_HIDE:; - #if !defined(__linux__) || defined(__GLIBC__) - if(s1!=0 && s1==s2) return 0; - #else - // musl guarantees non-null of s1 - if(s1==s2) return 0; - #endif #ifdef __CPROVER_STRING_ABSTRACTION int retval; __CPROVER_assert(__CPROVER_is_zero_string(s1), "strcasecmp zero-termination of 1st argument"); @@ -395,12 +383,6 @@ inline int strcasecmp(const char *s1, const char *s2) inline int strncmp(const char *s1, const char *s2, size_t n) { __CPROVER_HIDE:; - #if !defined(__linux__) || defined(__GLIBC__) - if(s1!=0 && s1==s2) return 0; - #else - // musl guarantees non-null of s1 - if(s1==s2) return 0; - #endif #ifdef __CPROVER_STRING_ABSTRACTION __CPROVER_assert(__CPROVER_is_zero_string(s1) || __CPROVER_buffer_size(s1)>=n, "strncmp zero-termination of 1st argument"); __CPROVER_assert(__CPROVER_is_zero_string(s2) || __CPROVER_buffer_size(s2)>=n, "strncmp zero-termination of 2nd argument"); @@ -439,12 +421,6 @@ inline int strncmp(const char *s1, const char *s2, size_t n) inline int strncasecmp(const char *s1, const char *s2, size_t n) { __CPROVER_HIDE:; - #if !defined(__linux__) || defined(__GLIBC__) - if(s1!=0 && s1==s2) return 0; - #else - // musl guarantees non-null of s1 - if(s1==s2) return 0; - #endif #ifdef __CPROVER_STRING_ABSTRACTION int retval; __CPROVER_assert(__CPROVER_is_zero_string(s1), "strncasecmp zero-termination of 1st argument"); From 6facf7453697ea924354e6a43c3aa99dee835406 Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Sun, 10 Sep 2017 11:09:34 +0100 Subject: [PATCH 29/80] Map wrappers: forward more of the std::map interface This remains incomplete, forwarding as per users' needs rather than forwarding the entire std::map interface, hopefully splitting the difference between providing useful functionality and preserving the possibility to switch out different types without undue difficulty. --- src/pointer-analysis/value_set.h | 9 ++++++++- src/util/numbering.h | 3 +++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/pointer-analysis/value_set.h b/src/pointer-analysis/value_set.h index f30386e8eb5..68c41f4ce16 100644 --- a/src/pointer-analysis/value_set.h +++ b/src/pointer-analysis/value_set.h @@ -70,6 +70,8 @@ class value_sett typedef data_typet::const_iterator const_iterator; // NOLINTNEXTLINE(readability/identifiers) typedef data_typet::value_type value_type; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::key_type key_type; iterator begin() { return data.begin(); } const_iterator begin() const { return data.begin(); } @@ -82,7 +84,12 @@ class value_sett size_t size() const { return data.size(); } bool empty() const { return data.empty(); } - objectt &operator[](unsigned i) { return data[i]; } + void erase(key_type i) { data.erase(i); } + void erase(const_iterator it) { data.erase(it); } + + objectt &operator[](key_type i) { return data[i]; } + objectt &at(key_type i) { return data.at(i); } + const objectt &at(key_type i) const { return data.at(i); } template void insert(It b, It e) { data.insert(b, e); } diff --git a/src/util/numbering.h b/src/util/numbering.h index 4e0113a117a..f7d94e06a2c 100644 --- a/src/util/numbering.h +++ b/src/util/numbering.h @@ -152,6 +152,9 @@ class hash_numbering final T &operator[](size_type t) { return data[t]; } const T &operator[](size_type t) const { return data[t]; } + T &at(size_type t) { return data.at(t); } + const T &at(size_type t) const { return data.at(t); } + size_type size() const { return data.size(); } iterator begin() { return data.begin(); } From 22c2ab9f04df299cea4904647c2f330e95555f47 Mon Sep 17 00:00:00 2001 From: reuk Date: Wed, 30 Aug 2017 17:10:45 +0100 Subject: [PATCH 30/80] Add CMakeLists --- CMakeLists.txt | 10 ++ scripts/minisat2_CMakeLists.txt | 33 +++++++ src/CMakeLists.txt | 147 ++++++++++++++++++++++++++++ src/analyses/CMakeLists.txt | 7 ++ src/ansi-c/CMakeLists.txt | 70 +++++++++++++ src/assembler/CMakeLists.txt | 13 +++ src/big-int/CMakeLists.txt | 6 ++ src/cbmc/CMakeLists.txt | 39 ++++++++ src/clobber/CMakeLists.txt | 36 +++++++ src/cpp/CMakeLists.txt | 7 ++ src/goto-analyzer/CMakeLists.txt | 35 +++++++ src/goto-cc/CMakeLists.txt | 37 +++++++ src/goto-diff/CMakeLists.txt | 32 ++++++ src/goto-instrument/CMakeLists.txt | 36 +++++++ src/goto-programs/CMakeLists.txt | 10 ++ src/goto-symex/CMakeLists.txt | 7 ++ src/java_bytecode/CMakeLists.txt | 10 ++ src/jsil/CMakeLists.txt | 15 +++ src/json/CMakeLists.txt | 15 +++ src/langapi/CMakeLists.txt | 7 ++ src/linking/CMakeLists.txt | 7 ++ src/memory-models/CMakeLists.txt | 15 +++ src/miniz/CMakeLists.txt | 7 ++ src/musketeer/CMakeLists.txt | 30 ++++++ src/path-symex/CMakeLists.txt | 7 ++ src/pointer-analysis/CMakeLists.txt | 7 ++ src/solvers/CMakeLists.txt | 85 ++++++++++++++++ src/symex/CMakeLists.txt | 35 +++++++ src/util/CMakeLists.txt | 7 ++ src/xmllang/CMakeLists.txt | 15 +++ unit/CMakeLists.txt | 65 ++++++++++++ 31 files changed, 852 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 scripts/minisat2_CMakeLists.txt create mode 100644 src/CMakeLists.txt create mode 100644 src/analyses/CMakeLists.txt create mode 100644 src/ansi-c/CMakeLists.txt create mode 100644 src/assembler/CMakeLists.txt create mode 100644 src/big-int/CMakeLists.txt create mode 100644 src/cbmc/CMakeLists.txt create mode 100644 src/clobber/CMakeLists.txt create mode 100644 src/cpp/CMakeLists.txt create mode 100644 src/goto-analyzer/CMakeLists.txt create mode 100644 src/goto-cc/CMakeLists.txt create mode 100644 src/goto-diff/CMakeLists.txt create mode 100644 src/goto-instrument/CMakeLists.txt create mode 100644 src/goto-programs/CMakeLists.txt create mode 100644 src/goto-symex/CMakeLists.txt create mode 100644 src/java_bytecode/CMakeLists.txt create mode 100644 src/jsil/CMakeLists.txt create mode 100644 src/json/CMakeLists.txt create mode 100644 src/langapi/CMakeLists.txt create mode 100644 src/linking/CMakeLists.txt create mode 100644 src/memory-models/CMakeLists.txt create mode 100644 src/miniz/CMakeLists.txt create mode 100644 src/musketeer/CMakeLists.txt create mode 100644 src/path-symex/CMakeLists.txt create mode 100644 src/pointer-analysis/CMakeLists.txt create mode 100644 src/solvers/CMakeLists.txt create mode 100644 src/symex/CMakeLists.txt create mode 100644 src/util/CMakeLists.txt create mode 100644 src/xmllang/CMakeLists.txt create mode 100644 unit/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000000..6b2d120cf6c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.2) + +include(GNUInstallDirs) + +set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9) + +add_subdirectory(src) + +enable_testing() +add_subdirectory(unit) diff --git a/scripts/minisat2_CMakeLists.txt b/scripts/minisat2_CMakeLists.txt new file mode 100644 index 00000000000..c749d0e4c8f --- /dev/null +++ b/scripts/minisat2_CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.2) + +# CBMC only uses part of minisat2. +# This CMakeLists is designed to build just the parts that are needed. + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9") +set(CMAKE_OSX_ARCHITECTURES "i386;x86_64") +set(CMAKE_BUILD_TYPE RelWithDebInfo) + +add_library(minisat2-condensed + minisat/simp/SimpSolver.cc + minisat/core/Solver.cc +) + +set(CBMC_INCLUDE_DIR "" CACHE PATH "The path to CBMC util headers") + +target_include_directories(minisat2-condensed + PUBLIC + $ + $ + $ +) + +install(TARGETS minisat2-condensed EXPORT minisat-condensed-targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include +) + +install(DIRECTORY . DESTINATION include FILES_MATCHING PATTERN "*.h") + +install(EXPORT minisat-condensed-targets DESTINATION lib/cmake/minisat-condensed) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 00000000000..657f6c5e749 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,147 @@ +cmake_minimum_required(VERSION 3.2) + +# TODO +# -[ ] Install profiles. +# -[ ] Specify one of many different solver libraries. + +project(CBMC) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED true) + +set(CMAKE_EXPORT_COMPILE_COMMANDS true) + +find_package(BISON) +find_package(FLEX) + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +include(CPack) + +find_package(Doxygen) +if(DOXYGEN_FOUND) + add_custom_target(doc + ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doxygen.cfg + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) +endif(DOXYGEN_FOUND) + +# Add a bison target named 'parser'. +macro(generic_bison name) + bison_target( + parser + ${CMAKE_CURRENT_SOURCE_DIR}/parser.y + ${CMAKE_CURRENT_BINARY_DIR}/${name}_y.tab.cpp + COMPILE_FLAGS -pyy${name} + ) + set(renamed_parser_header ${CMAKE_CURRENT_BINARY_DIR}/${name}_y.tab.h) + add_custom_command(OUTPUT ${renamed_parser_header} + COMMAND ${CMAKE_COMMAND} -E copy ${BISON_parser_OUTPUT_HEADER} ${renamed_parser_header} + MAIN_DEPENDENCY ${BISON_parser_OUTPUT_HEADER} + ) + list(REMOVE_ITEM BISON_parser_OUTPUTS ${BISON_parser_OUTPUT_HEADER}) + list(APPEND BISON_parser_OUTPUTS ${renamed_parser_header}) +endmacro(generic_bison) + +# Add a flex target named 'scanner' +macro(generic_flex name) + flex_target( + scanner + ${CMAKE_CURRENT_SOURCE_DIR}/scanner.l + ${CMAKE_CURRENT_BINARY_DIR}/${name}_lex.yy.cpp + COMPILE_FLAGS -Pyy${name} + ) +endmacro(generic_flex) + +# Set the public include locations for a target. +macro(generic_includes name) + target_include_directories(${name} + PUBLIC + ${CBMC_BINARY_DIR} + ${CBMC_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ) +endmacro(generic_includes) + +# Link optional modules. +# Target is the name of the target with optional components. +# Name is the name of the optional target. +# Also adds a compile flag signalling to the preprocessor that the library is +# used. +macro(add_if_library target name) + if(TARGET ${name}) + target_link_libraries(${target} ${name}) + + string(TOUPPER ${name} upper_name) + string(REGEX REPLACE "-" "_" define ${upper_name}) + + target_compile_definitions(${target} PUBLIC HAVE_${define}) + endif() +endmacro(add_if_library) + +# EXTERNAL PROJECTS +include(ExternalProject) +set(extern_location ${CMAKE_CURRENT_BINARY_DIR}/extern) + +set(extern_include_directory ${extern_location}/include) +file(MAKE_DIRECTORY ${extern_include_directory}) + +set(minisat_lib ${extern_location}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}minisat2-condensed${CMAKE_STATIC_LIBRARY_SUFFIX}) + +# minisat download +# This downloads minisat2, then patches it. +# Then, it injects a minimal CMakeLists.txt so that we can build just the bits +# we actually want, without having to update the provided makefile. +ExternalProject_Add(minisat2-extern + PREFIX ${extern_location} + URL http://ftp.debian.org/debian/pool/main/m/minisat2/minisat2_2.2.1.orig.tar.gz + PATCH_COMMAND patch -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/minisat-2.2.1-patch + COMMAND cmake -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/minisat2_CMakeLists.txt CMakeLists.txt + CMAKE_ARGS -DCBMC_INCLUDE_DIR:path=${CMAKE_CURRENT_SOURCE_DIR} -DCMAKE_INSTALL_PREFIX:PATH= + BUILD_BYPRODUCTS ${minisat_lib} +) + +add_library(minisat2-condensed STATIC IMPORTED) +set_target_properties(minisat2-condensed PROPERTIES + IMPORTED_LOCATION ${minisat_lib} + INTERFACE_INCLUDE_DIRECTORIES "${extern_include_directory}" +) +add_dependencies(minisat2-condensed minisat2-extern) + +# Override add_executable to automatically sign the target on OSX. +function(add_executable name) + _add_executable(${name} ${ARGN}) + set_target_properties(${name} PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY + "Developer ID Application: Daniel Kroening") +endfunction(add_executable) + +add_subdirectory(analyses) +add_subdirectory(ansi-c) +add_subdirectory(assembler) +add_subdirectory(big-int) +add_subdirectory(cpp) +add_subdirectory(goto-programs) +add_subdirectory(goto-symex) +add_subdirectory(jsil) +add_subdirectory(json) +add_subdirectory(langapi) +add_subdirectory(linking) +add_subdirectory(memory-models) +add_subdirectory(path-symex) +add_subdirectory(pointer-analysis) +add_subdirectory(solvers) +add_subdirectory(util) +add_subdirectory(xmllang) +add_subdirectory(java_bytecode) +add_subdirectory(miniz) +add_subdirectory(musketeer) +add_subdirectory(clobber) +add_subdirectory(cbmc) +add_subdirectory(goto-cc) +add_subdirectory(goto-instrument) +add_subdirectory(symex) +add_subdirectory(goto-analyzer) +add_subdirectory(goto-diff) diff --git a/src/analyses/CMakeLists.txt b/src/analyses/CMakeLists.txt new file mode 100644 index 00000000000..70922ac2d71 --- /dev/null +++ b/src/analyses/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(analyses ${sources} ${headers}) + +generic_includes(analyses) + +target_link_libraries(analyses util pointer-analysis) diff --git a/src/ansi-c/CMakeLists.txt b/src/ansi-c/CMakeLists.txt new file mode 100644 index 00000000000..0f3fd345194 --- /dev/null +++ b/src/ansi-c/CMakeLists.txt @@ -0,0 +1,70 @@ +generic_bison(ansi_c) +generic_flex(ansi_c) + +add_executable(converter library/converter.cpp) + +add_custom_command(OUTPUT converter_input.txt + COMMAND cat ${CMAKE_CURRENT_SOURCE_DIR}/library/*.c > converter_input.txt +) + +add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/cprover_library.inc + COMMAND converter < converter_input.txt > ${CMAKE_CURRENT_BINARY_DIR}/cprover_library.inc + DEPENDS converter_input.txt +) + +add_executable(file_converter file_converter.cpp) + +function(make_inc name) + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}.inc + COMMAND file_converter < ${CMAKE_CURRENT_SOURCE_DIR}/${name}.h > ${CMAKE_CURRENT_BINARY_DIR}/${name}.inc + ) +endfunction(make_inc) + +make_inc(arm_builtin_headers) +make_inc(clang_builtin_headers) +make_inc(cw_builtin_headers) +make_inc(gcc_builtin_headers_alpha) +make_inc(gcc_builtin_headers_arm) +make_inc(gcc_builtin_headers_generic) +make_inc(gcc_builtin_headers_ia32) +make_inc(gcc_builtin_headers_ia32-2) +make_inc(gcc_builtin_headers_ia32-3) +make_inc(gcc_builtin_headers_ia32-4) +make_inc(gcc_builtin_headers_math) +make_inc(gcc_builtin_headers_mem_string) +make_inc(gcc_builtin_headers_mips) +make_inc(gcc_builtin_headers_omp) +make_inc(gcc_builtin_headers_power) +make_inc(gcc_builtin_headers_tm) +make_inc(gcc_builtin_headers_ubsan) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(ansi-c + ${sources} + ${headers} + ${BISON_parser_OUTPUTS} + ${FLEX_scanner_OUTPUTS} + ${CMAKE_CURRENT_BINARY_DIR}/arm_builtin_headers.inc + ${CMAKE_CURRENT_BINARY_DIR}/clang_builtin_headers.inc + ${CMAKE_CURRENT_BINARY_DIR}/cprover_library.inc + ${CMAKE_CURRENT_BINARY_DIR}/cw_builtin_headers.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_alpha.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_arm.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_generic.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_ia32-2.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_ia32-3.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_ia32-4.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_ia32.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_math.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_mem_string.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_mips.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_omp.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_power.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_tm.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_ubsan.inc +) + +generic_includes(ansi-c) + +target_link_libraries(ansi-c util linking goto-programs assembler) diff --git a/src/assembler/CMakeLists.txt b/src/assembler/CMakeLists.txt new file mode 100644 index 00000000000..991bcb8fbf6 --- /dev/null +++ b/src/assembler/CMakeLists.txt @@ -0,0 +1,13 @@ +generic_flex(assembler) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(assembler + ${sources} + ${headers} + ${FLEX_scanner_OUTPUTS} +) + +generic_includes(assembler) + +target_link_libraries(assembler util) diff --git a/src/big-int/CMakeLists.txt b/src/big-int/CMakeLists.txt new file mode 100644 index 00000000000..865a8d5edb4 --- /dev/null +++ b/src/big-int/CMakeLists.txt @@ -0,0 +1,6 @@ +set(SRC bigint-func.cc bigint.cc) + +add_executable(test-bigint ${SRC} bigint-test.cc) +add_library(big-int ${SRC}) + +generic_includes(big-int) diff --git a/src/cbmc/CMakeLists.txt b/src/cbmc/CMakeLists.txt new file mode 100644 index 00000000000..6777249c8d9 --- /dev/null +++ b/src/cbmc/CMakeLists.txt @@ -0,0 +1,39 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/cbmc_main.cpp +) +add_library(cbmc-lib ${sources} ${headers}) + +generic_includes(cbmc-lib) + +target_link_libraries(cbmc-lib + ansi-c + cpp + linking + big-int + goto-programs + goto-symex + pointer-analysis + goto-instrument-lib + analyses + langapi + xml + assembler + solvers + util + json +) + +add_if_library(cbmc-lib bv_refinement) +add_if_library(cbmc-lib java_bytecode) +add_if_library(cbmc-lib jsil) +add_if_library(cbmc-lib specc) +add_if_library(cbmc-lib php) + +# Executable +add_executable(cbmc cbmc_main.cpp) +target_link_libraries(cbmc cbmc-lib) + +install(TARGETS cbmc DESTINATION bin) diff --git a/src/clobber/CMakeLists.txt b/src/clobber/CMakeLists.txt new file mode 100644 index 00000000000..3d7a43ec9ca --- /dev/null +++ b/src/clobber/CMakeLists.txt @@ -0,0 +1,36 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/clobber_main.cpp +) +add_library(clobber-lib ${sources} ${headers}) + +generic_includes(clobber-lib) + +target_link_libraries(clobber-lib + ansi-c + cpp + linking + big-int + goto-programs + analyses + langapi + xml + assembler + solvers + util + goto-symex + pointer-analysis + goto-instrument-lib +) + +add_if_library(clobber-lib bv_refinement) +add_if_library(clobber-lib java_bytecode) +add_if_library(clobber-lib specc) +add_if_library(clobber-lib php) + +# Executable +add_executable(clobber clobber_main.cpp) +target_link_libraries(clobber clobber-lib) + diff --git a/src/cpp/CMakeLists.txt b/src/cpp/CMakeLists.txt new file mode 100644 index 00000000000..740c600641b --- /dev/null +++ b/src/cpp/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(cpp ${sources} ${headers}) + +generic_includes(cpp) + +target_link_libraries(cpp util ansi-c) diff --git a/src/goto-analyzer/CMakeLists.txt b/src/goto-analyzer/CMakeLists.txt new file mode 100644 index 00000000000..2fdc67e5df0 --- /dev/null +++ b/src/goto-analyzer/CMakeLists.txt @@ -0,0 +1,35 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/goto_analyzer_main.cpp + + # This doesn't build + ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_goto_function.cpp +) +add_library(goto-analyzer-lib ${sources} ${headers}) + +generic_includes(goto-analyzer-lib) + +target_link_libraries(goto-analyzer-lib + ansi-c + cpp + linking + big-int + goto-programs + analyses + pointer-analysis + langapi + json + assembler + util +) + +add_if_library(goto-analyzer-lib java_bytecode) +add_if_library(goto-analyzer-lib jsil) +add_if_library(goto-analyzer-lib specc) +add_if_library(goto-analyzer-lib php) + +# Executable +add_executable(goto-analyzer goto_analyzer_main.cpp) +target_link_libraries(goto-analyzer goto-analyzer-lib) diff --git a/src/goto-cc/CMakeLists.txt b/src/goto-cc/CMakeLists.txt new file mode 100644 index 00000000000..ad2b50f775f --- /dev/null +++ b/src/goto-cc/CMakeLists.txt @@ -0,0 +1,37 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/goto_cc_main.cpp + + # These files don't build + ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/read_goto_object.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_goto_function.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_goto_function_hashing.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_goto_program.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_goto_program_hashing.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_irep_hashing.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_symbol_hashing.cpp +) +add_library(goto-cc-lib ${sources} ${headers}) + +generic_includes(goto-cc-lib) + +target_link_libraries(goto-cc-lib + big-int + goto-programs + util + linking + ansi-c + cpp + xml + assembler + langapi +) + +add_if_library(goto-cc-lib java_bytecode) +add_if_library(goto-cc-lib jsil) + +# Executable +add_executable(goto-cc goto_cc_main.cpp) +target_link_libraries(goto-cc goto-cc-lib) diff --git a/src/goto-diff/CMakeLists.txt b/src/goto-diff/CMakeLists.txt new file mode 100644 index 00000000000..a590e4d9df2 --- /dev/null +++ b/src/goto-diff/CMakeLists.txt @@ -0,0 +1,32 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/goto_diff_main.cpp +) +add_library(goto-diff-lib ${sources} ${headers}) + +generic_includes(goto-diff-lib) + +target_link_libraries(goto-diff-lib + ansi-c + cpp + linking + big-int + pointer-analysis + goto-programs + assembler + analyses + langapi + xml + util + solvers +) + +add_if_library(goto-diff-lib java_bytecode) +add_if_library(goto-diff-lib jsil) +add_if_library(goto-diff-lib php) + +# Executable +add_executable(goto-diff goto_diff_main.cpp) +target_link_libraries(goto-diff goto-diff-lib) diff --git a/src/goto-instrument/CMakeLists.txt b/src/goto-instrument/CMakeLists.txt new file mode 100644 index 00000000000..233a3bbec41 --- /dev/null +++ b/src/goto-instrument/CMakeLists.txt @@ -0,0 +1,36 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/goto_instrument_main.cpp + + # This doesn't build + ${CMAKE_CURRENT_SOURCE_DIR}/accelerate/linearize.cpp +) +add_library(goto-instrument-lib ${sources} ${headers}) + +generic_includes(goto-instrument-lib) + +target_link_libraries(goto-instrument-lib + ansi-c + cpp + linking + big-int + goto-programs + goto-symex + assembler + pointer-analysis + analyses + langapi + xml + util + json + solvers +) + +add_if_library(goto-instrument-lib java_bytecode) +add_if_library(goto-instrument-lib glpk) + +# Executable +add_executable(goto-instrument goto_instrument_main.cpp) +target_link_libraries(goto-instrument goto-instrument-lib) diff --git a/src/goto-programs/CMakeLists.txt b/src/goto-programs/CMakeLists.txt new file mode 100644 index 00000000000..cdcf603fd3d --- /dev/null +++ b/src/goto-programs/CMakeLists.txt @@ -0,0 +1,10 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/goto_convert_new_switch_case.cpp +) +add_library(goto-programs ${sources} ${headers}) + +generic_includes(goto-programs) + +target_link_libraries(goto-programs util assembler langapi analyses ansi-c) diff --git a/src/goto-symex/CMakeLists.txt b/src/goto-symex/CMakeLists.txt new file mode 100644 index 00000000000..cc51bb603d9 --- /dev/null +++ b/src/goto-symex/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(goto-symex ${sources} ${headers}) + +generic_includes(goto-symex) + +target_link_libraries(goto-symex util) diff --git a/src/java_bytecode/CMakeLists.txt b/src/java_bytecode/CMakeLists.txt new file mode 100644 index 00000000000..8cb39ed44bf --- /dev/null +++ b/src/java_bytecode/CMakeLists.txt @@ -0,0 +1,10 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/java_bytecode_vtable.cpp +) +add_library(java_bytecode ${sources} ${headers}) + +generic_includes(java_bytecode) + +target_link_libraries(java_bytecode util goto-programs miniz json) diff --git a/src/jsil/CMakeLists.txt b/src/jsil/CMakeLists.txt new file mode 100644 index 00000000000..b3a34114639 --- /dev/null +++ b/src/jsil/CMakeLists.txt @@ -0,0 +1,15 @@ +generic_bison(jsil) +generic_flex(jsil) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(jsil + ${sources} + ${headers} + ${BISON_parser_OUTPUTS} + ${FLEX_scanner_OUTPUTS} +) + +generic_includes(jsil) + +target_link_libraries(jsil util) diff --git a/src/json/CMakeLists.txt b/src/json/CMakeLists.txt new file mode 100644 index 00000000000..944085707a0 --- /dev/null +++ b/src/json/CMakeLists.txt @@ -0,0 +1,15 @@ +generic_bison(json) +generic_flex(json) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(json + ${sources} + ${headers} + ${BISON_parser_OUTPUTS} + ${FLEX_scanner_OUTPUTS} +) + +generic_includes(json) + +target_link_libraries(json util) diff --git a/src/langapi/CMakeLists.txt b/src/langapi/CMakeLists.txt new file mode 100644 index 00000000000..aa71bc63612 --- /dev/null +++ b/src/langapi/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(langapi ${sources} ${headers}) + +generic_includes(langapi) + +target_link_libraries(langapi util) diff --git a/src/linking/CMakeLists.txt b/src/linking/CMakeLists.txt new file mode 100644 index 00000000000..f96361799db --- /dev/null +++ b/src/linking/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(linking ${sources} ${headers}) + +generic_includes(linking) + +target_link_libraries(linking util ansi-c) diff --git a/src/memory-models/CMakeLists.txt b/src/memory-models/CMakeLists.txt new file mode 100644 index 00000000000..04e51ad62b1 --- /dev/null +++ b/src/memory-models/CMakeLists.txt @@ -0,0 +1,15 @@ +generic_bison(mm) +generic_flex(mm) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(mmcc + ${sources} + ${headers} + ${BISON_parser_OUTPUTS} + ${FLEX_scanner_OUTPUTS} +) + +generic_includes(mmcc) + +target_link_libraries(mmcc util) diff --git a/src/miniz/CMakeLists.txt b/src/miniz/CMakeLists.txt new file mode 100644 index 00000000000..1d7862730e0 --- /dev/null +++ b/src/miniz/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(miniz ${sources} ${headers}) + +generic_includes(miniz) + +target_link_libraries(miniz) diff --git a/src/musketeer/CMakeLists.txt b/src/musketeer/CMakeLists.txt new file mode 100644 index 00000000000..6265183ee0b --- /dev/null +++ b/src/musketeer/CMakeLists.txt @@ -0,0 +1,30 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/musketeer_main.cpp +) +add_library(musketeer-lib ${sources} ${headers}) + +generic_includes(musketeer-lib) + +target_link_libraries(musketeer-lib + ansi-c + linking + big-int + goto-programs + goto-symex + assembler + pointer-analysis + analyses + langapi + util + solvers + goto-instrument-lib +) + +add_if_library(musketeer-lib glpk) + +# Executable +add_executable(musketeer musketeer_main.cpp) +target_link_libraries(musketeer musketeer-lib) diff --git a/src/path-symex/CMakeLists.txt b/src/path-symex/CMakeLists.txt new file mode 100644 index 00000000000..c86e9c27a25 --- /dev/null +++ b/src/path-symex/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(path-symex ${sources} ${headers}) + +generic_includes(path-symex) + +target_link_libraries(path-symex util pointer-analysis) diff --git a/src/pointer-analysis/CMakeLists.txt b/src/pointer-analysis/CMakeLists.txt new file mode 100644 index 00000000000..66d9f23893d --- /dev/null +++ b/src/pointer-analysis/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(pointer-analysis ${sources} ${headers}) + +generic_includes(pointer-analysis) + +target_link_libraries(pointer-analysis util analyses goto-programs) diff --git a/src/solvers/CMakeLists.txt b/src/solvers/CMakeLists.txt new file mode 100644 index 00000000000..4e315abef1a --- /dev/null +++ b/src/solvers/CMakeLists.txt @@ -0,0 +1,85 @@ +# TODO Specify which solver to use (minisat2 etc.) + +# We may use one of several different solver libraries. +# The following files wrap the chosen solver library. +# We remove them all from the solver-library sources list, and then add the +# ones we actually need back in. +set(chaff_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_zchaff.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_zcore.cpp +) +set(minisat_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_minisat.cpp +) +set(minisat2_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_minisat2.cpp +) +set(glucose_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_glucose.cpp +) +set(smvsat_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_smvsat.cpp +) +set(squolem2_source + ${CMAKE_CURRENT_SOURCE_DIR}/qbf/qbf_squolem.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/qbf/qbf_squolem_core.cpp +) +set(cudd_source + ${CMAKE_CURRENT_SOURCE_DIR}/qbf/qbf_bdd_core.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/qbf/qbf_skizzo_core.cpp +) +set(precosat_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_precosat.cpp +) +set(picosat_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_picosat.cpp +) +set(lingeling_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_lingeling.cpp +) +set(booleforce_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_booleforce.cpp +) +set(minibdd_source + ${CMAKE_CURRENT_SOURCE_DIR}/miniBDD/example.cpp +) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${chaff_source} + ${minisat_source} + ${minisat2_source} + ${glucose_source} + ${smvsat_source} + ${squolem2_source} + ${cudd_source} + ${precosat_source} + ${picosat_source} + ${lingeling_source} + ${booleforce_source} + ${minibdd_source} + + # Some files just don't build + ${CMAKE_CURRENT_SOURCE_DIR}/cvc/cvc_prop.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/dplib/dplib_prop.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/dplib/dplib_conv.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/dplib/dplib_dec.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/floatbv/float_approximation.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_limmat.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/smt1/smt1_prop.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/smt2/smt2_prop.cpp +) + +add_library(solvers ${sources} ${headers}) + +if(TARGET minisat2-extern) + target_sources(solvers PRIVATE ${minisat2_source}) + add_dependencies(solvers minisat2-extern) + target_compile_definitions(solvers PUBLIC HAVE_MINISAT2 __STDC_FORMAT_MACROS __STDC_LIMIT_MACROS) + target_link_libraries(solvers minisat2-condensed) +endif() + +target_link_libraries(solvers util) + +generic_includes(solvers) diff --git a/src/symex/CMakeLists.txt b/src/symex/CMakeLists.txt new file mode 100644 index 00000000000..d4450e79a37 --- /dev/null +++ b/src/symex/CMakeLists.txt @@ -0,0 +1,35 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/symex_main.cpp +) +add_library(symex-lib ${sources} ${headers}) + +target_link_libraries(symex-lib + ansi-c + cpp + linking + big-int + goto-programs + analyses + langapi + xml + assembler + solvers + util + goto-symex + pointer-analysis + goto-instrument-lib + path-symex +) + +generic_includes(symex-lib) + +add_if_library(symex-lib bv_refinement) +add_if_library(symex-lib java_bytecode) +add_if_library(symex-lib specc) +add_if_library(symex-lib php) + +add_executable(symex symex_main.cpp) + +target_link_libraries(symex symex-lib) diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt new file mode 100644 index 00000000000..b073a8baa0e --- /dev/null +++ b/src/util/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(util ${sources} ${headers}) + +generic_includes(util) + +target_link_libraries(util big-int) diff --git a/src/xmllang/CMakeLists.txt b/src/xmllang/CMakeLists.txt new file mode 100644 index 00000000000..58879cdee74 --- /dev/null +++ b/src/xmllang/CMakeLists.txt @@ -0,0 +1,15 @@ +generic_bison(xml) +generic_flex(xml) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(xml + ${sources} + ${headers} + ${BISON_parser_OUTPUTS} + ${FLEX_scanner_OUTPUTS} +) + +generic_includes(xml) + +target_link_libraries(xml util) diff --git a/unit/CMakeLists.txt b/unit/CMakeLists.txt new file mode 100644 index 00000000000..69d0f7b14b5 --- /dev/null +++ b/unit/CMakeLists.txt @@ -0,0 +1,65 @@ +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED true) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + # Used in executables + ${CMAKE_CURRENT_SOURCE_DIR}/miniBDD.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/string_utils.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/sharing_node.cpp + + # Don't build + ${CMAKE_CURRENT_SOURCE_DIR}/sharing_map.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/elf_reader.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/smt2_parser.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/json.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/cpp_parser.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/osx_fat_reader.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/unicode.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/wp.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/cpp_scanner.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/float_utils.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/ieee_float.cpp +) + +add_executable(unit ${sources} ${headers}) +target_include_directories(unit + PUBLIC + ${CBMC_BINARY_DIR} + ${CBMC_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} +) +target_link_libraries(unit ansi-c solvers java_bytecode) +add_test(NAME unit COMMAND unit WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + +add_executable(miniBDD miniBDD.cpp) +target_include_directories(miniBDD + PUBLIC + ${CBMC_BINARY_DIR} + ${CBMC_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} +) +target_link_libraries(miniBDD solvers ansi-c) +add_test(miniBDD miniBDD) + +add_executable(string_utils string_utils.cpp) +target_include_directories(string_utils + PUBLIC + ${CBMC_BINARY_DIR} + ${CBMC_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} +) +target_link_libraries(string_utils solvers ansi-c) +add_test(string_utils string_utils) + +add_executable(sharing_node sharing_node.cpp) +target_include_directories(sharing_node + PUBLIC + ${CBMC_BINARY_DIR} + ${CBMC_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} +) +add_test(sharing_node sharing_node) + +install(TARGETS unit miniBDD string_utils sharing_node DESTINATION bin) From e609bbb51a0bc9312c33cb8e625567c25d13bfd8 Mon Sep 17 00:00:00 2001 From: reuk Date: Thu, 24 Aug 2017 18:24:15 +0100 Subject: [PATCH 31/80] Add CMake howto to COMPILING file --- COMPILING | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/COMPILING b/COMPILING index 3df46849022..2ec4c482bba 100644 --- a/COMPILING +++ b/COMPILING @@ -171,7 +171,7 @@ Follow these instructions: BUILD_ENV = MSVC Open the Visual Studio Command prompt, and then bash.exe -login from - Cygwin from in there. + Cygwin from in there. 3) Type cd src; make - that should do it. @@ -183,6 +183,53 @@ can be used for building with MSBuild. Note that you still need to run flex/bison using "make generated_files" before opening the project. +WORKING WITH CMAKE (EXPERIMENTAL) +--------------------------------- + +There is an experimental build based on CMake instead of hand-written +makefiles. It should work on a wider variety of systems than the standard +makefile build, and can integrate better with IDEs and static-analysis tools. + +0) Run `cmake --version`. If you get a command-not-found error, or the installed + version is lower than 3.2, go and install a new version. Most Linux + distributions have a package for CMake, and Mac users can get it through + Homebrew. Windows users should download it manually from cmake.org. + +1) Create a directory to store your build: + `mkdir build` + Run this from the *top level* folder of the project. This is different from + the other builds, which require you to `cd src` first. + +2) Generate build files with CMake: + `cmake -H. -Bbuild` + This command tells CMake to use the configuration in the current directory, + and to generate build files into the `build` directory. + This is the point to specify custom build settings, such as compilers and + build back-ends. You can use clang (for example) by adding the argument + `-DCMAKE_CXX_COMPILER=clang++` to the command line. You can also tell + CMake to generate IDE projects by supplying the `-G` flag. + Run `cmake -G` for a comprehensive list of supported back-ends. + + Generally it is not necessary to manually specify individual compiler or + linker flags, as CMake defines a number of "build modes" including Debug + and Release modes. To build in a particular mode, add the flag + `-DCMAKE_BUILD_TYPE=Debug` (or `Release`) to the initial invocation. + + If you *do* need to manually add flags, use `-DCMAKE_CXX_FLAGS=...` and + `-DCMAKE_EXE_LINKER_FLAGS=...`. This is useful for enabling clang's + sanitizers. + + Finally, to enable building universal binaries on macOS, you can pass the + flag `-DCMAKE_OSX_ARCHITECTURES=i386;x86_64`. If you don't supply this flag, + the build will just be for the architecture of your machine. + +3) Run the build: + `cmake --build build` + This command tells CMake to invoke the correct tool to run the build in the + `build` directory. You can also use the build back-end directly by invoking + `make`, `ninja`, or opening the generated IDE project as appropriate. + + WORKING WITH ECLIPSE -------------------- From f6e49683c9ceda35fea459b0054de4ac2ae75208 Mon Sep 17 00:00:00 2001 From: reuk Date: Wed, 30 Aug 2017 17:17:38 +0100 Subject: [PATCH 32/80] Enable running tests from CMake --- CMakeLists.txt | 13 ++++- regression/CMakeLists.txt | 36 ++++++++++++++ regression/ansi-c/CMakeLists.txt | 4 ++ regression/ansi-c/Makefile | 13 ++++- .../cbmc-java-inheritance/CMakeLists.txt | 4 ++ regression/cbmc-java/CMakeLists.txt | 4 ++ regression/cbmc/CMakeLists.txt | 4 ++ regression/cpp/CMakeLists.txt | 4 ++ regression/cpp/Makefile | 13 ++++- regression/goto-analyzer/CMakeLists.txt | 4 ++ regression/goto-diff/CMakeLists.txt | 4 ++ .../goto-instrument-typedef/CMakeLists.txt | 10 ++++ regression/goto-instrument-typedef/Makefile | 16 +++++-- regression/goto-instrument-typedef/chain.sh | 25 ++++++---- regression/goto-instrument/CMakeLists.txt | 10 ++++ regression/goto-instrument/Makefile | 16 +++++-- regression/goto-instrument/chain.sh | 47 ++++++++++++------- regression/invariants/CMakeLists.txt | 7 +++ regression/strings-smoke-tests/CMakeLists.txt | 4 ++ regression/strings/CMakeLists.txt | 4 ++ regression/test-script/CMakeLists.txt | 4 ++ src/ansi-c/CMakeLists.txt | 25 ++++++++++ src/ansi-c/check_library.sh | 14 ++++++ src/goto-cc/CMakeLists.txt | 4 ++ unit/CMakeLists.txt | 19 +++++--- 25 files changed, 263 insertions(+), 45 deletions(-) create mode 100644 regression/CMakeLists.txt create mode 100644 regression/ansi-c/CMakeLists.txt create mode 100644 regression/cbmc-java-inheritance/CMakeLists.txt create mode 100644 regression/cbmc-java/CMakeLists.txt create mode 100644 regression/cbmc/CMakeLists.txt create mode 100644 regression/cpp/CMakeLists.txt create mode 100644 regression/goto-analyzer/CMakeLists.txt create mode 100644 regression/goto-diff/CMakeLists.txt create mode 100644 regression/goto-instrument-typedef/CMakeLists.txt create mode 100644 regression/goto-instrument/CMakeLists.txt create mode 100644 regression/invariants/CMakeLists.txt create mode 100644 regression/strings-smoke-tests/CMakeLists.txt create mode 100644 regression/strings/CMakeLists.txt create mode 100644 regression/test-script/CMakeLists.txt create mode 100755 src/ansi-c/check_library.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b2d120cf6c..aa6117fe69f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,19 @@ cmake_minimum_required(VERSION 3.2) +set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9) + include(GNUInstallDirs) -set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) add_subdirectory(src) -enable_testing() +set(enable_cbmc_tests on CACHE BOOL "Whether CBMC tests should be enabled") + +if(${enable_cbmc_tests}) + enable_testing() +endif() add_subdirectory(unit) +add_subdirectory(regression) diff --git a/regression/CMakeLists.txt b/regression/CMakeLists.txt new file mode 100644 index 00000000000..245e8611246 --- /dev/null +++ b/regression/CMakeLists.txt @@ -0,0 +1,36 @@ +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED true) + +set(test_pl_path "${CMAKE_CURRENT_SOURCE_DIR}/test.pl") + +macro(add_test_pl_profile name cmdline flag profile) + add_test( + NAME "${name}-${profile}" + COMMAND ${test_pl_path} -c ${cmdline} ${flag} + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + ) + set_tests_properties("${name}-${profile}" PROPERTIES + LABELS "${profile}" + ) +endmacro(add_test_pl_profile) + +macro(add_test_pl_tests name cmdline) + add_test_pl_profile("${name}" "${cmdline}" -C CORE) + add_test_pl_profile("${name}" "${cmdline}" -T THOROUGH) + add_test_pl_profile("${name}" "${cmdline}" -F FUTURE) + add_test_pl_profile("${name}" "${cmdline}" -K KNOWNBUG) +endmacro(add_test_pl_tests) + +add_subdirectory(ansi-c) +add_subdirectory(cbmc) +add_subdirectory(cbmc-java) +add_subdirectory(cbmc-java-inheritance) +add_subdirectory(cpp) +add_subdirectory(goto-analyzer) +add_subdirectory(goto-diff) +add_subdirectory(goto-instrument) +add_subdirectory(goto-instrument-typedef) +add_subdirectory(invariants) +add_subdirectory(strings) +add_subdirectory(strings-smoke-tests) +add_subdirectory(test-script) diff --git a/regression/ansi-c/CMakeLists.txt b/regression/ansi-c/CMakeLists.txt new file mode 100644 index 00000000000..027ec188f71 --- /dev/null +++ b/regression/ansi-c/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "ansi-c" + "$" +) diff --git a/regression/ansi-c/Makefile b/regression/ansi-c/Makefile index 87af55e3306..c770b3b3ed7 100644 --- a/regression/ansi-c/Makefile +++ b/regression/ansi-c/Makefile @@ -1,13 +1,22 @@ default: tests.log +include ../../src/config.inc +include ../../src/common + +ifeq ($(BUILD_ENV_),MSVC) + exe=../../../src/goto-cc/goto-cl +else + exe=../../../src/goto-cc/goto-cc +endif + test: - @if ! ../test.pl -c ../../../src/goto-cc/goto-cc ; then \ + @if ! ../test.pl -c $(exe) ; then \ ../failed-tests-printer.pl ; \ exit 1 ; \ fi tests.log: ../test.pl - @if ! ../test.pl -c ../../../src/goto-cc/goto-cc ; then \ + @if ! ../test.pl -c $(exe) ; then \ ../failed-tests-printer.pl ; \ exit 1 ; \ fi diff --git a/regression/cbmc-java-inheritance/CMakeLists.txt b/regression/cbmc-java-inheritance/CMakeLists.txt new file mode 100644 index 00000000000..cf949e080b8 --- /dev/null +++ b/regression/cbmc-java-inheritance/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "cbmc-java-inheritance" + "$" +) diff --git a/regression/cbmc-java/CMakeLists.txt b/regression/cbmc-java/CMakeLists.txt new file mode 100644 index 00000000000..37252add85e --- /dev/null +++ b/regression/cbmc-java/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "cbmc-java" + "$" +) diff --git a/regression/cbmc/CMakeLists.txt b/regression/cbmc/CMakeLists.txt new file mode 100644 index 00000000000..ee9f8f2e90f --- /dev/null +++ b/regression/cbmc/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "cbmc" + "$" +) diff --git a/regression/cpp/CMakeLists.txt b/regression/cpp/CMakeLists.txt new file mode 100644 index 00000000000..c6eea89555b --- /dev/null +++ b/regression/cpp/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "cpp" + "$" +) diff --git a/regression/cpp/Makefile b/regression/cpp/Makefile index 87af55e3306..c770b3b3ed7 100644 --- a/regression/cpp/Makefile +++ b/regression/cpp/Makefile @@ -1,13 +1,22 @@ default: tests.log +include ../../src/config.inc +include ../../src/common + +ifeq ($(BUILD_ENV_),MSVC) + exe=../../../src/goto-cc/goto-cl +else + exe=../../../src/goto-cc/goto-cc +endif + test: - @if ! ../test.pl -c ../../../src/goto-cc/goto-cc ; then \ + @if ! ../test.pl -c $(exe) ; then \ ../failed-tests-printer.pl ; \ exit 1 ; \ fi tests.log: ../test.pl - @if ! ../test.pl -c ../../../src/goto-cc/goto-cc ; then \ + @if ! ../test.pl -c $(exe) ; then \ ../failed-tests-printer.pl ; \ exit 1 ; \ fi diff --git a/regression/goto-analyzer/CMakeLists.txt b/regression/goto-analyzer/CMakeLists.txt new file mode 100644 index 00000000000..3d5daac5b92 --- /dev/null +++ b/regression/goto-analyzer/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "goto-analyzer" + "$" +) diff --git a/regression/goto-diff/CMakeLists.txt b/regression/goto-diff/CMakeLists.txt new file mode 100644 index 00000000000..9f0957a1386 --- /dev/null +++ b/regression/goto-diff/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "goto-diff" + "$" +) diff --git a/regression/goto-instrument-typedef/CMakeLists.txt b/regression/goto-instrument-typedef/CMakeLists.txt new file mode 100644 index 00000000000..63a842ccec9 --- /dev/null +++ b/regression/goto-instrument-typedef/CMakeLists.txt @@ -0,0 +1,10 @@ +if(WIN32) + set(is_windows true) +else() + set(is_windows false) +endif() + +add_test_pl_tests( + "goto-instrument-typedef" + "${CMAKE_CURRENT_SOURCE_DIR}/chain.sh $ $ ${is_windows}" +) diff --git a/regression/goto-instrument-typedef/Makefile b/regression/goto-instrument-typedef/Makefile index 08fe97ae88c..56de781ae2c 100644 --- a/regression/goto-instrument-typedef/Makefile +++ b/regression/goto-instrument-typedef/Makefile @@ -1,14 +1,24 @@ - default: tests.log +include ../../src/config.inc +include ../../src/common + +ifeq ($(BUILD_ENV_),MSVC) + exe=../../../src/goto-cc/goto-cl + is_windows="true" +else + exe=../../../src/goto-cc/goto-cc + is_windows="false" +endif + test: - @if ! ../test.pl -c ../chain.sh ; then \ + @if ! ../test.pl -c '../chain.sh $(exe) ../../../src/goto-instrument/goto-instrument $(is_windows)' ; then \ ../failed-tests-printer.pl ; \ exit 1; \ fi tests.log: - @if ! ../test.pl -c ../chain.sh ; then \ + @if ! ../test.pl -c '../chain.sh $(exe) ../../../src/goto-instrument/goto-instrument $(is_windows)' ; then \ ../failed-tests-printer.pl ; \ exit 1; \ fi diff --git a/regression/goto-instrument-typedef/chain.sh b/regression/goto-instrument-typedef/chain.sh index 9cef4ffdfa4..d53833cccd9 100755 --- a/regression/goto-instrument-typedef/chain.sh +++ b/regression/goto-instrument-typedef/chain.sh @@ -1,14 +1,21 @@ #!/bin/bash -SRC=../../../src +GC=$1 +GI=$2 +is_windows=$3 -GC=$SRC/goto-cc/goto-cc -GI=$SRC/goto-instrument/goto-instrument +name=${*:$#} +name=${name%.c} -OPTS=$1 -NAME=${2%.c} +args=${*:4:$#-4} -rm $NAME.gb -$GC $NAME.c --function fun -o $NAME.gb -echo $GI $OPTS $NAME.gb -$GI $OPTS $NAME.gb +rm "${name}.gb" +if [[ "${is_windows}" == "true" ]]; then + "$GC" "${name}.c" --function fun + mv "${name}.exe" "${name}.gb" +else + "$GC" "${name}.c" --function fun -o "${name}.gb" +fi + +echo "$GI" ${args} "${name}.gb" +"$GI" ${args} "${name}.gb" diff --git a/regression/goto-instrument/CMakeLists.txt b/regression/goto-instrument/CMakeLists.txt new file mode 100644 index 00000000000..088fcab9651 --- /dev/null +++ b/regression/goto-instrument/CMakeLists.txt @@ -0,0 +1,10 @@ +if(WIN32) + set(is_windows true) +else() + set(is_windows false) +endif() + +add_test_pl_tests( + "goto-instrument" + "${CMAKE_CURRENT_SOURCE_DIR}/chain.sh $ $ $ ${is_windows}" +) diff --git a/regression/goto-instrument/Makefile b/regression/goto-instrument/Makefile index 94605814b4a..a8d54370285 100644 --- a/regression/goto-instrument/Makefile +++ b/regression/goto-instrument/Makefile @@ -1,14 +1,24 @@ - default: tests.log +include ../../src/config.inc +include ../../src/common + +ifeq ($(BUILD_ENV_),MSVC) + exe=../../../src/goto-cc/goto-cl + is_windows="true" +else + exe=../../../src/goto-cc/goto-cc + is_windows="false" +endif + test: - @if ! ../test.pl -c ../chain.sh ; then \ + @if ! ../test.pl -c '../chain.sh $(exe) ../../../src/goto-instrument/goto-instrument ../../../src/cbmc/cbmc $(is_windows)' ; then \ ../failed-tests-printer.pl ; \ exit 1; \ fi tests.log: - @if ! ../test.pl -c ../chain.sh ; then \ + @if ! ../test.pl -c '../chain.sh $(exe) ../../../src/goto-instrument/goto-instrument ../../../src/cbmc/cbmc $(is_windows)' ; then \ ../failed-tests-printer.pl ; \ exit 1; \ fi diff --git a/regression/goto-instrument/chain.sh b/regression/goto-instrument/chain.sh index 68f50b095bc..2656ea4488f 100755 --- a/regression/goto-instrument/chain.sh +++ b/regression/goto-instrument/chain.sh @@ -2,26 +2,37 @@ set -e -src=../../../src -goto_cc=$src/goto-cc/goto-cc -goto_instrument=$src/goto-instrument/goto-instrument -cbmc=$src/cbmc/cbmc +goto_cc=$1 +goto_instrument=$2 +cbmc=$3 +is_windows=$4 -name=${@:$#} +name=${*:$#} name=${name%.c} -args=${@:1:$#-1} - -$goto_cc -o $name.gb $name.c -# $goto_instrument --show-goto-functions $name.gb -$goto_instrument $args $name.gb ${name}-mod.gb -if [ ! -e ${name}-mod.gb ] ; then - cp $name.gb ${name}-mod.gb -elif echo "$args" | grep -q -- "--dump-c" ; then - mv ${name}-mod.gb ${name}-mod.c - $goto_cc ${name}-mod.c -o ${name}-mod.gb - rm ${name}-mod.c +args=${*:5:$#-5} + +if [[ "${is_windows}" == "true" ]]; then + $goto_cc "${name}.c" + mv "${name}.exe" "${name}.gb" +else + $goto_cc -o "${name}.gb" "${name}.c" fi -$goto_instrument --show-goto-functions ${name}-mod.gb -$cbmc ${name}-mod.gb +$goto_instrument ${args} "${name}.gb" "${name}-mod.gb" +if [ ! -e "${name}-mod.gb" ] ; then + cp "$name.gb" "${name}-mod.gb" +elif echo $args | grep -q -- "--dump-c" ; then + mv "${name}-mod.gb" "${name}-mod.c" + + if [[ "${is_windows}" == "true" ]]; then + $goto_cc "${name}-mod.c" + mv "${name}-mod.exe" "${name}-mod.gb" + else + $goto_cc -o "${name}-mod.gb" "${name}-mod.c" + fi + + rm "${name}-mod.c" +fi +$goto_instrument --show-goto-functions "${name}-mod.gb" +$cbmc "${name}-mod.gb" diff --git a/regression/invariants/CMakeLists.txt b/regression/invariants/CMakeLists.txt new file mode 100644 index 00000000000..467e2b13950 --- /dev/null +++ b/regression/invariants/CMakeLists.txt @@ -0,0 +1,7 @@ +add_executable(driver driver.cpp) +target_link_libraries(driver big-int util) + +add_test_pl_tests( + "invariants" + "$" +) diff --git a/regression/strings-smoke-tests/CMakeLists.txt b/regression/strings-smoke-tests/CMakeLists.txt new file mode 100644 index 00000000000..6e8a19a9796 --- /dev/null +++ b/regression/strings-smoke-tests/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "strings-smoke-test" + "$" +) diff --git a/regression/strings/CMakeLists.txt b/regression/strings/CMakeLists.txt new file mode 100644 index 00000000000..846e65ae00d --- /dev/null +++ b/regression/strings/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "strings" + "$" +) diff --git a/regression/test-script/CMakeLists.txt b/regression/test-script/CMakeLists.txt new file mode 100644 index 00000000000..00ad3a848d6 --- /dev/null +++ b/regression/test-script/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "test-script" + "${CMAKE_CURRENT_SOURCE_DIR}/program_runner.sh" +) diff --git a/src/ansi-c/CMakeLists.txt b/src/ansi-c/CMakeLists.txt index 0f3fd345194..9556873965b 100644 --- a/src/ansi-c/CMakeLists.txt +++ b/src/ansi-c/CMakeLists.txt @@ -20,6 +20,31 @@ function(make_inc name) ) endfunction(make_inc) +################################################################################ + +if(MINGW) + set(platform_unavail + ${CMAKE_CURRENT_SOURCE_DIR}/library/java.io.c + ${CMAKE_CURRENT_SOURCE_DIR}/library/err.c + ${CMAKE_CURRENT_SOURCE_DIR}/library/threads.c + ) +else() + set(platform_unavail + ${CMAKE_CURRENT_SOURCE_DIR}/library/java.io.c + ${CMAKE_CURRENT_SOURCE_DIR}/library/threads.c + ) +endif() + +file(GLOB library_check_sources "library/*.c") +list(REMOVE_ITEM library_check_sources ${platform_unavail}) + +add_custom_target(library_check + ${CMAKE_CURRENT_SOURCE_DIR}/check_library.sh ${library_check_sources} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +################################################################################ + make_inc(arm_builtin_headers) make_inc(clang_builtin_headers) make_inc(cw_builtin_headers) diff --git a/src/ansi-c/check_library.sh b/src/ansi-c/check_library.sh new file mode 100755 index 00000000000..c02d0c95bf9 --- /dev/null +++ b/src/ansi-c/check_library.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +for var in "$@"; do + cp "${var}" __libcheck.c + sed -i 's/__builtin_[^v]/s&/' __libcheck.c + sed -i 's/__sync_/s&/' __libcheck.c + sed -i 's/__noop/s&/' __libcheck.c + cc -std=gnu99 -E -include library/cprover.h -D__CPROVER_bool=_Bool -D__CPROVER_thread_local=__thread -DLIBRARY_CHECK -o __libcheck.i __libcheck.c + cc -S -Wall -Werror -pedantic -Wextra -std=gnu99 __libcheck.i -o __libcheck.s -Wno-unused-label -Wno-uninitialized + + ec="$?" + rm __libcheck.s __libcheck.i __libcheck.c + [ "${ec}" -eq 0 ] || exit "${ec}" +done diff --git a/src/goto-cc/CMakeLists.txt b/src/goto-cc/CMakeLists.txt index ad2b50f775f..6aa01b6139c 100644 --- a/src/goto-cc/CMakeLists.txt +++ b/src/goto-cc/CMakeLists.txt @@ -35,3 +35,7 @@ add_if_library(goto-cc-lib jsil) # Executable add_executable(goto-cc goto_cc_main.cpp) target_link_libraries(goto-cc goto-cc-lib) + +if(WIN32) + set_target_properties(goto-cc PROPERTIES OUTPUT_NAME goto-cl) +endif() diff --git a/unit/CMakeLists.txt b/unit/CMakeLists.txt index 69d0f7b14b5..623e57ecb50 100644 --- a/unit/CMakeLists.txt +++ b/unit/CMakeLists.txt @@ -31,7 +31,12 @@ target_include_directories(unit ${CMAKE_CURRENT_SOURCE_DIR} ) target_link_libraries(unit ansi-c solvers java_bytecode) -add_test(NAME unit COMMAND unit WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) +add_test( + NAME unit + COMMAND $ + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) +set_tests_properties(unit PROPERTIES LABELS CORE) add_executable(miniBDD miniBDD.cpp) target_include_directories(miniBDD @@ -41,7 +46,8 @@ target_include_directories(miniBDD ${CMAKE_CURRENT_SOURCE_DIR} ) target_link_libraries(miniBDD solvers ansi-c) -add_test(miniBDD miniBDD) +add_test(NAME miniBDD COMMAND $) +set_tests_properties(miniBDD PROPERTIES LABELS CORE) add_executable(string_utils string_utils.cpp) target_include_directories(string_utils @@ -51,7 +57,8 @@ target_include_directories(string_utils ${CMAKE_CURRENT_SOURCE_DIR} ) target_link_libraries(string_utils solvers ansi-c) -add_test(string_utils string_utils) +add_test(NAME string_utils COMMAND $) +set_tests_properties(string_utils PROPERTIES LABELS CORE) add_executable(sharing_node sharing_node.cpp) target_include_directories(sharing_node @@ -60,6 +67,6 @@ target_include_directories(sharing_node ${CBMC_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ) -add_test(sharing_node sharing_node) - -install(TARGETS unit miniBDD string_utils sharing_node DESTINATION bin) +target_link_libraries(sharing_node util) +add_test(NAME sharing_node COMMAND $) +set_tests_properties(sharing_node PROPERTIES LABELS CORE) From 3c36aa501f422bfe994b8c877171df7367855840 Mon Sep 17 00:00:00 2001 From: reuk Date: Wed, 30 Aug 2017 17:10:12 +0100 Subject: [PATCH 33/80] Enable CMake in Travis --- .travis.yml | 29 +++++++++++++++++++++++++++++ appveyor.yml | 13 ------------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index a772cb400d1..f85cf23da0c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -151,6 +151,35 @@ jobs: - EXTRA_CXXFLAGS="-DDEBUG" script: echo "Not running any tests for a debug build." + - stage: Test different OS/CXX/Flags + os: linux + env: + - BUILD_SYSTEM=cmake + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-5 + install: + - mkdir build + - cmake -Bbuild -H. '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_COMPILER=g++-5' + - cmake --build build -- -j4 + script: (cd build; ctest -V -L CORE) + before_cache: + + - stage: Test different OS/CXX/Flags + os: osx + env: + - BUILD_SYSTEM=cmake + install: + - mkdir build + - cmake -Bbuild -H. '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_OSX_ARCHITECTURES=i386;x86_64' + - cmake --build build -- -j4 + script: (cd build; ctest -V -L CORE) + before_cache: + + allow_failures: - <<: *linter-stage diff --git a/appveyor.yml b/appveyor.yml index 2efea4e75c2..7fe07b6da72 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -60,19 +60,6 @@ build_script: test_script: - cmd: | cd regression - sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" ansi-c/Makefile - sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" cpp/Makefile - sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" goto-instrument/chain.sh - sed -i "15s/.*/$goto_cc $name.c/" goto-instrument/chain.sh - sed -i "16i mv $name.exe $name.gb" goto-instrument/chain.sh - sed -i "23s/.*/ $goto_cc ${name}-mod.c/" goto-instrument/chain.sh - sed -i "24i mv ${name}-mod.exe $name-mod.gb" goto-instrument/chain.sh - cat goto-instrument/chain.sh - - sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" goto-instrument-typedef/chain.sh || true - sed -i "12s/.*/$GC $NAME.c --function fun/" goto-instrument-typedef/chain.sh || true - sed -i "13i mv $NAME.exe $NAME.gb" goto-instrument-typedef/chain.sh || true - cat goto-instrument-typedef/chain.sh || true rem HACK disable failing tests rmdir /s /q ansi-c\arch_flags_mcpu_bad From 62510558de57bc0ef3b02bd7501cd8696fbf73ab Mon Sep 17 00:00:00 2001 From: reuk Date: Fri, 1 Sep 2017 12:23:21 +0100 Subject: [PATCH 34/80] Fix and refactor library_check target --- src/ansi-c/CMakeLists.txt | 4 +++- src/ansi-c/Makefile | 15 +-------------- .../{check_library.sh => library_check.sh} | 16 ++++++++-------- 3 files changed, 12 insertions(+), 23 deletions(-) rename src/ansi-c/{check_library.sh => library_check.sh} (54%) diff --git a/src/ansi-c/CMakeLists.txt b/src/ansi-c/CMakeLists.txt index 9556873965b..1e95d1e1e72 100644 --- a/src/ansi-c/CMakeLists.txt +++ b/src/ansi-c/CMakeLists.txt @@ -39,7 +39,7 @@ file(GLOB library_check_sources "library/*.c") list(REMOVE_ITEM library_check_sources ${platform_unavail}) add_custom_target(library_check - ${CMAKE_CURRENT_SOURCE_DIR}/check_library.sh ${library_check_sources} + ${CMAKE_CURRENT_SOURCE_DIR}/library_check.sh ${library_check_sources} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) @@ -93,3 +93,5 @@ add_library(ansi-c generic_includes(ansi-c) target_link_libraries(ansi-c util linking goto-programs assembler) + +add_dependencies(ansi-c library_check) diff --git a/src/ansi-c/Makefile b/src/ansi-c/Makefile index 58dd5b46025..1cfc9b01385 100644 --- a/src/ansi-c/Makefile +++ b/src/ansi-c/Makefile @@ -92,20 +92,7 @@ else platform_unavail = library/java.io.c library/threads.c endif library_check: library/*.c - for f in $(filter-out $(platform_unavail), $^) ; do \ - echo "Checking $$f" ; \ - cp $$f __libcheck.c ; \ - perl -p -i -e 's/(__builtin_[^v])/s$$1/' __libcheck.c ; \ - perl -p -i -e 's/(__sync_)/s$$1/' __libcheck.c ; \ - perl -p -i -e 's/(__noop)/s$$1/' __libcheck.c ; \ - $(CC) -std=gnu99 -E -include library/cprover.h -D__CPROVER_bool=_Bool \ - -D__CPROVER_thread_local=__thread -DLIBRARY_CHECK -o __libcheck.i __libcheck.c ; \ - $(CC) -S -Wall -Werror -pedantic -Wextra -std=gnu99 __libcheck.i -o __libcheck.s \ - -Wno-unused-label ; \ - ec=$$? ; \ - $(RM) __libcheck.s __libcheck.i __libcheck.c ; \ - [ $$ec -eq 0 ] || exit $$ec ; \ - done + ./library_check.sh $(filter-out $(platform_unavail), $^) touch $@ cprover_library.inc: library/converter$(EXEEXT) library/*.c diff --git a/src/ansi-c/check_library.sh b/src/ansi-c/library_check.sh similarity index 54% rename from src/ansi-c/check_library.sh rename to src/ansi-c/library_check.sh index c02d0c95bf9..c65dcd8919e 100755 --- a/src/ansi-c/check_library.sh +++ b/src/ansi-c/library_check.sh @@ -1,14 +1,14 @@ #!/usr/bin/env bash -for var in "$@"; do - cp "${var}" __libcheck.c - sed -i 's/__builtin_[^v]/s&/' __libcheck.c - sed -i 's/__sync_/s&/' __libcheck.c - sed -i 's/__noop/s&/' __libcheck.c +for f in "$@"; do + echo "Checking ${f}" + cp "${f}" __libcheck.c + perl -p -i -e 's/(__builtin_[^v])/s$1/' __libcheck.c + perl -p -i -e 's/(__sync_)/s$1/' __libcheck.c + perl -p -i -e 's/(__noop)/s$1/' __libcheck.c cc -std=gnu99 -E -include library/cprover.h -D__CPROVER_bool=_Bool -D__CPROVER_thread_local=__thread -DLIBRARY_CHECK -o __libcheck.i __libcheck.c - cc -S -Wall -Werror -pedantic -Wextra -std=gnu99 __libcheck.i -o __libcheck.s -Wno-unused-label -Wno-uninitialized - - ec="$?" + cc -S -Wall -Werror -pedantic -Wextra -std=gnu99 __libcheck.i -o __libcheck.s -Wno-unused-label + ec="${?}" rm __libcheck.s __libcheck.i __libcheck.c [ "${ec}" -eq 0 ] || exit "${ec}" done From d953327a4c6a1bb2e559c4367ff7874b37af6ce0 Mon Sep 17 00:00:00 2001 From: reuk Date: Fri, 1 Sep 2017 15:36:36 +0100 Subject: [PATCH 35/80] Enable caching for CMake builds (hopefully) --- .travis.yml | 11 +++++------ CMakeLists.txt | 5 +++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index f85cf23da0c..91e4ee5b44f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -153,6 +153,7 @@ jobs: - stage: Test different OS/CXX/Flags os: linux + cache: ccache env: - BUILD_SYSTEM=cmake addons: @@ -162,22 +163,20 @@ jobs: packages: - g++-5 install: - - mkdir build - - cmake -Bbuild -H. '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_COMPILER=g++-5' + - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_FLAGS_RELEASE=-O3' '-DCMAKE_CXX_FLAGS=-Wall -Wpedantic -Werror' '-DCMAKE_CXX_COMPILER=g++-5' - cmake --build build -- -j4 script: (cd build; ctest -V -L CORE) - before_cache: - stage: Test different OS/CXX/Flags os: osx + cache: ccache env: - BUILD_SYSTEM=cmake + - CCACHE_CPP2=yes install: - - mkdir build - - cmake -Bbuild -H. '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_OSX_ARCHITECTURES=i386;x86_64' + - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_FLAGS_RELEASE=-O3' '-DCMAKE_CXX_FLAGS=-Wall -Wpedantic -Werror' '-DCMAKE_OSX_ARCHITECTURES=i386;x86_64' - cmake --build build -- -j4 script: (cd build; ctest -V -L CORE) - before_cache: allow_failures: diff --git a/CMakeLists.txt b/CMakeLists.txt index aa6117fe69f..4cbffa34afe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,10 @@ cmake_minimum_required(VERSION 3.2) +find_program(CCACHE_PROGRAM ccache) +if(CCACHE_PROGRAM) + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") + endif() + set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9) include(GNUInstallDirs) From 9afbced5badfb0ca93e6d68f6df876c8efa7e1fa Mon Sep 17 00:00:00 2001 From: reuk Date: Wed, 6 Sep 2017 10:24:36 +0100 Subject: [PATCH 36/80] Disable 32-bit builds in Travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 91e4ee5b44f..b3ffb61424c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -174,7 +174,7 @@ jobs: - BUILD_SYSTEM=cmake - CCACHE_CPP2=yes install: - - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_FLAGS_RELEASE=-O3' '-DCMAKE_CXX_FLAGS=-Wall -Wpedantic -Werror' '-DCMAKE_OSX_ARCHITECTURES=i386;x86_64' + - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_FLAGS_RELEASE=-O3' '-DCMAKE_CXX_FLAGS=-Wall -Wpedantic -Werror' '-DCMAKE_OSX_ARCHITECTURES=x86_64' - cmake --build build -- -j4 script: (cd build; ctest -V -L CORE) From 5afa9296d169298ddc091a18ed25a58b90ba76ba Mon Sep 17 00:00:00 2001 From: reuk Date: Thu, 7 Sep 2017 14:35:38 +0100 Subject: [PATCH 37/80] Quote paths in flex/bison commands --- src/CMakeLists.txt | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 657f6c5e749..7ab9f642226 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -23,8 +23,8 @@ include(CPack) find_package(Doxygen) if(DOXYGEN_FOUND) add_custom_target(doc - ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doxygen.cfg - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + "${DOXYGEN_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/doxygen.cfg" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" ) endif(DOXYGEN_FOUND) @@ -32,26 +32,26 @@ endif(DOXYGEN_FOUND) macro(generic_bison name) bison_target( parser - ${CMAKE_CURRENT_SOURCE_DIR}/parser.y - ${CMAKE_CURRENT_BINARY_DIR}/${name}_y.tab.cpp - COMPILE_FLAGS -pyy${name} + "${CMAKE_CURRENT_SOURCE_DIR}/parser.y" + "${CMAKE_CURRENT_BINARY_DIR}/${name}_y.tab.cpp" + COMPILE_FLAGS "-pyy${name}" ) - set(renamed_parser_header ${CMAKE_CURRENT_BINARY_DIR}/${name}_y.tab.h) - add_custom_command(OUTPUT ${renamed_parser_header} - COMMAND ${CMAKE_COMMAND} -E copy ${BISON_parser_OUTPUT_HEADER} ${renamed_parser_header} - MAIN_DEPENDENCY ${BISON_parser_OUTPUT_HEADER} + set(renamed_parser_header "${CMAKE_CURRENT_BINARY_DIR}/${name}_y.tab.h") + add_custom_command(OUTPUT "${renamed_parser_header}" + COMMAND "${CMAKE_COMMAND}" -E copy "${BISON_parser_OUTPUT_HEADER}" "${renamed_parser_header}" + MAIN_DEPENDENCY "${BISON_parser_OUTPUT_HEADER}" ) - list(REMOVE_ITEM BISON_parser_OUTPUTS ${BISON_parser_OUTPUT_HEADER}) - list(APPEND BISON_parser_OUTPUTS ${renamed_parser_header}) + list(REMOVE_ITEM BISON_parser_OUTPUTS "${BISON_parser_OUTPUT_HEADER}") + list(APPEND BISON_parser_OUTPUTS "${renamed_parser_header}") endmacro(generic_bison) # Add a flex target named 'scanner' macro(generic_flex name) flex_target( scanner - ${CMAKE_CURRENT_SOURCE_DIR}/scanner.l - ${CMAKE_CURRENT_BINARY_DIR}/${name}_lex.yy.cpp - COMPILE_FLAGS -Pyy${name} + "${CMAKE_CURRENT_SOURCE_DIR}/scanner.l" + "${CMAKE_CURRENT_BINARY_DIR}/${name}_lex.yy.cpp" + COMPILE_FLAGS "-Pyy${name}" ) endmacro(generic_flex) From ad486f8c554e3ccb06d2fa8aace8d8588b4af5ee Mon Sep 17 00:00:00 2001 From: reuk Date: Fri, 8 Sep 2017 10:05:51 +0100 Subject: [PATCH 38/80] Set up glucose externalproject --- .travis.yml | 2 +- CMakeLists.txt | 4 +++ scripts/glucose_CMakeLists.txt | 30 ++++++++++++++++++++++ src/CMakeLists.txt | 38 ++++++++++++++++++++++++---- src/solvers/CMakeLists.txt | 11 +++++--- src/solvers/sat/satcheck.h | 2 +- src/solvers/sat/satcheck_glucose.cpp | 11 ++++---- 7 files changed, 81 insertions(+), 17 deletions(-) create mode 100644 scripts/glucose_CMakeLists.txt diff --git a/.travis.yml b/.travis.yml index b3ffb61424c..286349aac72 100644 --- a/.travis.yml +++ b/.travis.yml @@ -163,7 +163,7 @@ jobs: packages: - g++-5 install: - - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_FLAGS_RELEASE=-O3' '-DCMAKE_CXX_FLAGS=-Wall -Wpedantic -Werror' '-DCMAKE_CXX_COMPILER=g++-5' + - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_FLAGS_RELEASE=-O3' '-DCMAKE_CXX_FLAGS=-Wall -Wpedantic -Werror' '-DCMAKE_CXX_COMPILER=g++-5' '-Dsat_impl=glucose' - cmake --build build -- -j4 script: (cd build; ctest -V -L CORE) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4cbffa34afe..9a48454082f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,10 @@ add_subdirectory(src) set(enable_cbmc_tests on CACHE BOOL "Whether CBMC tests should be enabled") +set(sat_impl "minisat2" CACHE STRING + "This setting controls the SAT library which is used. Valid values are 'minisat2' and 'glucose'" +) + if(${enable_cbmc_tests}) enable_testing() endif() diff --git a/scripts/glucose_CMakeLists.txt b/scripts/glucose_CMakeLists.txt new file mode 100644 index 00000000000..862fc8ba675 --- /dev/null +++ b/scripts/glucose_CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.2) + +# CBMC only uses part of glucose. +# This CMakeLists is designed to build just the parts that are needed. + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9") +set(CMAKE_OSX_ARCHITECTURES "i386;x86_64") +set(CMAKE_BUILD_TYPE RelWithDebInfo) + +add_library(glucose-condensed + simp/SimpSolver.cc + core/Solver.cc +) + +target_include_directories(glucose-condensed + PUBLIC + $ + $ +) + +install(TARGETS glucose-condensed EXPORT glucose-condensed-targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include +) + +install(DIRECTORY . DESTINATION include FILES_MATCHING PATTERN "*.h") + +install(EXPORT glucose-condensed-targets DESTINATION lib/cmake/glucose-condensed) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7ab9f642226..a7be2e0fd31 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -89,18 +89,20 @@ set(extern_location ${CMAKE_CURRENT_BINARY_DIR}/extern) set(extern_include_directory ${extern_location}/include) file(MAKE_DIRECTORY ${extern_include_directory}) +################################################################################ + set(minisat_lib ${extern_location}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}minisat2-condensed${CMAKE_STATIC_LIBRARY_SUFFIX}) -# minisat download -# This downloads minisat2, then patches it. -# Then, it injects a minimal CMakeLists.txt so that we can build just the bits -# we actually want, without having to update the provided makefile. +# minisat download: This downloads minisat2, then patches it. Then, it +# injects a minimal CMakeLists.txt so that we can build just the bits we +# actually want, without having to update the provided makefile. + ExternalProject_Add(minisat2-extern PREFIX ${extern_location} URL http://ftp.debian.org/debian/pool/main/m/minisat2/minisat2_2.2.1.orig.tar.gz PATCH_COMMAND patch -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/minisat-2.2.1-patch COMMAND cmake -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/minisat2_CMakeLists.txt CMakeLists.txt - CMAKE_ARGS -DCBMC_INCLUDE_DIR:path=${CMAKE_CURRENT_SOURCE_DIR} -DCMAKE_INSTALL_PREFIX:PATH= + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= -DCBMC_INCLUDE_DIR:path=${CMAKE_CURRENT_SOURCE_DIR} BUILD_BYPRODUCTS ${minisat_lib} ) @@ -111,6 +113,32 @@ set_target_properties(minisat2-condensed PROPERTIES ) add_dependencies(minisat2-condensed minisat2-extern) +################################################################################ + +set(glucose_lib ${extern_location}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}glucose-condensed${CMAKE_STATIC_LIBRARY_SUFFIX}) + +# glucose download: This downloads glucose, then patches it. Then, it +# injects a minimal CMakeLists.txt so that we can build just the bits we +# actually want, without having to update the provided makefile. + +ExternalProject_Add(glucose-extern + PREFIX ${extern_location} + URL http://www.labri.fr/perso/lsimon/downloads/softwares/glucose-syrup.tgz + PATCH_COMMAND patch -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/glucose-syrup-patch + COMMAND cmake -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/glucose_CMakeLists.txt CMakeLists.txt + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= + BUILD_BYPRODUCTS ${glucose_lib} +) + +add_library(glucose-condensed STATIC IMPORTED) +set_target_properties(glucose-condensed PROPERTIES + IMPORTED_LOCATION ${glucose_lib} + INTERFACE_INCLUDE_DIRECTORIES "${extern_include_directory}" +) +add_dependencies(glucose-condensed glucose-extern) + +################################################################################ + # Override add_executable to automatically sign the target on OSX. function(add_executable name) _add_executable(${name} ${ARGN}) diff --git a/src/solvers/CMakeLists.txt b/src/solvers/CMakeLists.txt index 4e315abef1a..c21370d4bd5 100644 --- a/src/solvers/CMakeLists.txt +++ b/src/solvers/CMakeLists.txt @@ -1,5 +1,3 @@ -# TODO Specify which solver to use (minisat2 etc.) - # We may use one of several different solver libraries. # The following files wrap the chosen solver library. # We remove them all from the solver-library sources list, and then add the @@ -73,11 +71,16 @@ list(REMOVE_ITEM sources add_library(solvers ${sources} ${headers}) -if(TARGET minisat2-extern) +if("${sat_impl}" STREQUAL "minisat2" AND TARGET minisat2-extern) target_sources(solvers PRIVATE ${minisat2_source}) add_dependencies(solvers minisat2-extern) - target_compile_definitions(solvers PUBLIC HAVE_MINISAT2 __STDC_FORMAT_MACROS __STDC_LIMIT_MACROS) + target_compile_definitions(solvers PUBLIC SATCHECK_MINISAT2 HAVE_MINISAT2 __STDC_FORMAT_MACROS __STDC_LIMIT_MACROS) target_link_libraries(solvers minisat2-condensed) +elseif("${sat_impl}" STREQUAL "glucose" AND TARGET glucose-extern) + target_sources(solvers PRIVATE ${glucose_source}) + add_dependencies(solvers glucose-extern) + target_compile_definitions(solvers PUBLIC SATCHECK_GLUCOSE HAVE_GLUCOSE __STDC_FORMAT_MACROS __STDC_LIMIT_MACROS) + target_link_libraries(solvers glucose-condensed) endif() target_link_libraries(solvers util) diff --git a/src/solvers/sat/satcheck.h b/src/solvers/sat/satcheck.h index ada65d253e8..4905f3195ee 100644 --- a/src/solvers/sat/satcheck.h +++ b/src/solvers/sat/satcheck.h @@ -14,7 +14,7 @@ Author: Daniel Kroening, kroening@kroening.com // #define SATCHECK_ZCHAFF // #define SATCHECK_MINISAT1 -#define SATCHECK_MINISAT2 +// #define SATCHECK_MINISAT2 // #define SATCHECK_GLUCOSE // #define SATCHECK_BOOLEFORCE // #define SATCHECK_PRECOSAT diff --git a/src/solvers/sat/satcheck_glucose.cpp b/src/solvers/sat/satcheck_glucose.cpp index 3d6e2ae3934..fa146d09414 100644 --- a/src/solvers/sat/satcheck_glucose.cpp +++ b/src/solvers/sat/satcheck_glucose.cpp @@ -114,7 +114,7 @@ void satcheck_glucose_baset::lcnf(const bvt &bv) template propt::resultt satcheck_glucose_baset::prop_solve() { - assert(status!=ERROR); + assert(status!=statust::ERROR); // We start counting at 1, thus there is one variable fewer. { @@ -153,9 +153,8 @@ propt::resultt satcheck_glucose_baset::prop_solve() { messaget::status() << "SAT checker: instance is SATISFIABLE" << eom; - assert(!solver->model.empty()); - status=SAT; - return P_SATISFIABLE; + status=statust::SAT; + return resultt::P_SATISFIABLE; } else { @@ -165,8 +164,8 @@ propt::resultt satcheck_glucose_baset::prop_solve() } } - status=UNSAT; - return P_UNSATISFIABLE; + status=statust::UNSAT; + return resultt::P_UNSATISFIABLE; } template From 5ee349f322d62d4b3e8a59e8314a22f0d9841f24 Mon Sep 17 00:00:00 2001 From: reuk Date: Fri, 8 Sep 2017 11:07:16 +0100 Subject: [PATCH 39/80] Control SAT library from makefiles --- src/common | 8 ++++---- src/config.inc | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/common b/src/common index 2cab9f49cbb..323bdbf4367 100644 --- a/src/common +++ b/src/common @@ -33,11 +33,11 @@ endif CP_CFLAGS = -MMD -MP CXXFLAGS ?= -Wall -O2 ifeq ($(filter-out OSX OSX_Universal,$(BUILD_ENV_)),) - CP_CXXFLAGS = -MMD -MP -mmacosx-version-min=10.9 -std=c++11 -stdlib=libc++ + CP_CXXFLAGS += -MMD -MP -mmacosx-version-min=10.9 -std=c++11 -stdlib=libc++ LINKFLAGS += -mmacosx-version-min=10.9 -stdlib=libc++ LINKNATIVE += -mmacosx-version-min=10.9 -stdlib=libc++ else - CP_CXXFLAGS = -MMD -MP -std=c++11 + CP_CXXFLAGS += -MMD -MP -std=c++11 endif ifeq ($(filter -O%,$(CXXFLAGS)),) CP_CXXFLAGS += -O2 @@ -100,7 +100,7 @@ else ifeq ($(BUILD_ENV_),Cygwin) CFLAGS ?= -Wall -O2 CXXFLAGS ?= -Wall -O2 CP_CFLAGS = -MMD -MP - CP_CXXFLAGS = -MMD -MP -std=c++11 -U__STRICT_ANSI__ + CP_CXXFLAGS += -MMD -MP -std=c++11 -U__STRICT_ANSI__ LINKFLAGS = -static -std=c++11 LINKLIB = ar rcT $@ $^ LINKBIN = $(CXX) $(LINKFLAGS) -o $@ -Wl,--start-group $^ -Wl,--end-group $(LIBS) -static @@ -130,7 +130,7 @@ else ifeq ($(BUILD_ENV_),MSVC) CFLAGS ?= /W3 /O2 /GF CXXFLAGS ?= /W3 /D_CRT_SECURE_NO_WARNINGS /O2 /GF CP_CFLAGS = - CP_CXXFLAGS = + CP_CXXFLAGS += LINKLIB = lib /NOLOGO /OUT:$@ $^ LINKBIN = $(CXX) $(LINKFLAGS) /Fe$@ $^ $(LIBS) LINKNATIVE = $(HOSTCXX) /Fe$@ $^ diff --git a/src/config.inc b/src/config.inc index dc2c8f6a47c..5c276dc19c6 100644 --- a/src/config.inc +++ b/src/config.inc @@ -26,6 +26,42 @@ MINISAT2 = ../../minisat-2.2.1 #GLUCOSE = ../../glucose-syrup #SMVSAT = +ifneq ($(PRECOSAT),) + CP_CXXFLAGS += -DSATCHECK_PRECOSAT +endif + +ifneq ($(PICOSAT),) + CP_CXXFLAGS += -DSATCHECK_PICOSAT +endif + +ifneq ($(LINGELING),) + CP_CXXFLAGS += -DSATCHECK_LINGELING +endif + +ifneq ($(CHAFF),) + CP_CXXFLAGS += -DSATCHECK_CHAFF +endif + +ifneq ($(BOOLEFORCE),) + CP_CXXFLAGS += -DSATCHECK_BOOLEFORCE +endif + +ifneq ($(MINISAT),) + CP_CXXFLAGS += -DSATCHECK_MINISAT +endif + +ifneq ($(MINISAT2),) + CP_CXXFLAGS += -DSATCHECK_MINISAT2 +endif + +ifneq ($(GLUCOSE),) + CP_CXXFLAGS += -DSATCHECK_GLUCOSE +endif + +ifneq ($(SMVSAT),) + CP_CXXFLAGS += -DSATCHECK_SMVSAT +endif + # Signing identity for MacOS Gatekeeper OSX_IDENTITY="Developer ID Application: Daniel Kroening" From 7d4e9b59d09ba82bffdf024db308819068e65744 Mon Sep 17 00:00:00 2001 From: reuk Date: Fri, 8 Sep 2017 11:16:26 +0100 Subject: [PATCH 40/80] Make CMake release flags similar to Makefile build --- .travis.yml | 4 ++-- CMakeLists.txt | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 286349aac72..7a5aeebf8e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -163,7 +163,7 @@ jobs: packages: - g++-5 install: - - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_FLAGS_RELEASE=-O3' '-DCMAKE_CXX_FLAGS=-Wall -Wpedantic -Werror' '-DCMAKE_CXX_COMPILER=g++-5' '-Dsat_impl=glucose' + - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_COMPILER=g++-5' '-Dsat_impl=glucose' - cmake --build build -- -j4 script: (cd build; ctest -V -L CORE) @@ -174,7 +174,7 @@ jobs: - BUILD_SYSTEM=cmake - CCACHE_CPP2=yes install: - - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_FLAGS_RELEASE=-O3' '-DCMAKE_CXX_FLAGS=-Wall -Wpedantic -Werror' '-DCMAKE_OSX_ARCHITECTURES=x86_64' + - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_OSX_ARCHITECTURES=x86_64' - cmake --build build -- -j4 script: (cd build; ctest -V -L CORE) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a48454082f..b00896b9dfe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,18 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR + "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" +) + # Ensure NDEBUG is not set for release builds + set(CMAKE_CXX_FLAGS_RELEASE "-O2") + # Enable lots of warnings + set(CMAKE_CXX_FLAGS "-Wall -Wpedantic -Werror") +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + # This would be the place to enable warnings for Windows builds, although + # config.inc doesn't seem to do that currently +endif() + add_subdirectory(src) set(enable_cbmc_tests on CACHE BOOL "Whether CBMC tests should be enabled") From 91684da5ea86cc7b5b5bd01e47deace8777dd5a9 Mon Sep 17 00:00:00 2001 From: reuk Date: Fri, 8 Sep 2017 11:42:09 +0100 Subject: [PATCH 41/80] Clean up CMake files after #1321 --- CMakeLists.txt | 4 ++-- src/goto-analyzer/CMakeLists.txt | 3 --- src/goto-cc/CMakeLists.txt | 9 --------- src/goto-programs/CMakeLists.txt | 3 --- src/java_bytecode/CMakeLists.txt | 3 --- src/solvers/CMakeLists.txt | 20 ++++++++------------ 6 files changed, 10 insertions(+), 32 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b00896b9dfe..a5c0ef6893d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,14 +25,14 @@ elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") # config.inc doesn't seem to do that currently endif() -add_subdirectory(src) - set(enable_cbmc_tests on CACHE BOOL "Whether CBMC tests should be enabled") set(sat_impl "minisat2" CACHE STRING "This setting controls the SAT library which is used. Valid values are 'minisat2' and 'glucose'" ) +add_subdirectory(src) + if(${enable_cbmc_tests}) enable_testing() endif() diff --git a/src/goto-analyzer/CMakeLists.txt b/src/goto-analyzer/CMakeLists.txt index 2fdc67e5df0..1e07f53afbe 100644 --- a/src/goto-analyzer/CMakeLists.txt +++ b/src/goto-analyzer/CMakeLists.txt @@ -3,9 +3,6 @@ file(GLOB_RECURSE sources "*.cpp") file(GLOB_RECURSE headers "*.h") list(REMOVE_ITEM sources ${CMAKE_CURRENT_SOURCE_DIR}/goto_analyzer_main.cpp - - # This doesn't build - ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_goto_function.cpp ) add_library(goto-analyzer-lib ${sources} ${headers}) diff --git a/src/goto-cc/CMakeLists.txt b/src/goto-cc/CMakeLists.txt index 6aa01b6139c..7d7a2d579da 100644 --- a/src/goto-cc/CMakeLists.txt +++ b/src/goto-cc/CMakeLists.txt @@ -3,15 +3,6 @@ file(GLOB_RECURSE sources "*.cpp") file(GLOB_RECURSE headers "*.h") list(REMOVE_ITEM sources ${CMAKE_CURRENT_SOURCE_DIR}/goto_cc_main.cpp - - # These files don't build - ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/read_goto_object.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_goto_function.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_goto_function_hashing.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_goto_program.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_goto_program_hashing.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_irep_hashing.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/xml_binaries/xml_symbol_hashing.cpp ) add_library(goto-cc-lib ${sources} ${headers}) diff --git a/src/goto-programs/CMakeLists.txt b/src/goto-programs/CMakeLists.txt index cdcf603fd3d..84a06943b98 100644 --- a/src/goto-programs/CMakeLists.txt +++ b/src/goto-programs/CMakeLists.txt @@ -1,8 +1,5 @@ file(GLOB_RECURSE sources "*.cpp") file(GLOB_RECURSE headers "*.h") -list(REMOVE_ITEM sources - ${CMAKE_CURRENT_SOURCE_DIR}/goto_convert_new_switch_case.cpp -) add_library(goto-programs ${sources} ${headers}) generic_includes(goto-programs) diff --git a/src/java_bytecode/CMakeLists.txt b/src/java_bytecode/CMakeLists.txt index 8cb39ed44bf..282519dbf1c 100644 --- a/src/java_bytecode/CMakeLists.txt +++ b/src/java_bytecode/CMakeLists.txt @@ -1,8 +1,5 @@ file(GLOB_RECURSE sources "*.cpp") file(GLOB_RECURSE headers "*.h") -list(REMOVE_ITEM sources - ${CMAKE_CURRENT_SOURCE_DIR}/java_bytecode_vtable.cpp -) add_library(java_bytecode ${sources} ${headers}) generic_includes(java_bytecode) diff --git a/src/solvers/CMakeLists.txt b/src/solvers/CMakeLists.txt index c21370d4bd5..910b39f7c6e 100644 --- a/src/solvers/CMakeLists.txt +++ b/src/solvers/CMakeLists.txt @@ -41,6 +41,9 @@ set(booleforce_source set(minibdd_source ${CMAKE_CURRENT_SOURCE_DIR}/miniBDD/example.cpp ) +set(limmat_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_limmat.cpp +) file(GLOB_RECURSE sources "*.cpp") file(GLOB_RECURSE headers "*.h") @@ -57,26 +60,19 @@ list(REMOVE_ITEM sources ${lingeling_source} ${booleforce_source} ${minibdd_source} - - # Some files just don't build - ${CMAKE_CURRENT_SOURCE_DIR}/cvc/cvc_prop.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/dplib/dplib_prop.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/dplib/dplib_conv.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/dplib/dplib_dec.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/floatbv/float_approximation.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_limmat.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/smt1/smt1_prop.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/smt2/smt2_prop.cpp + ${limmat_source} ) add_library(solvers ${sources} ${headers}) -if("${sat_impl}" STREQUAL "minisat2" AND TARGET minisat2-extern) +if("${sat_impl}" STREQUAL "minisat2") + message(STATUS "Building solvers with minisat2") target_sources(solvers PRIVATE ${minisat2_source}) add_dependencies(solvers minisat2-extern) target_compile_definitions(solvers PUBLIC SATCHECK_MINISAT2 HAVE_MINISAT2 __STDC_FORMAT_MACROS __STDC_LIMIT_MACROS) target_link_libraries(solvers minisat2-condensed) -elseif("${sat_impl}" STREQUAL "glucose" AND TARGET glucose-extern) +elseif("${sat_impl}" STREQUAL "glucose") + message(STATUS "Building solvers with glucose") target_sources(solvers PRIVATE ${glucose_source}) add_dependencies(solvers glucose-extern) target_compile_definitions(solvers PUBLIC SATCHECK_GLUCOSE HAVE_GLUCOSE __STDC_FORMAT_MACROS __STDC_LIMIT_MACROS) From 4dde3c5a09c145c0ba06ce52e5e45fac7c4e457d Mon Sep 17 00:00:00 2001 From: reuk Date: Fri, 8 Sep 2017 13:19:00 +0100 Subject: [PATCH 42/80] Disable glucose in Travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7a5aeebf8e3..ba21b38d27f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -163,7 +163,7 @@ jobs: packages: - g++-5 install: - - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_COMPILER=g++-5' '-Dsat_impl=glucose' + - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_COMPILER=g++-5' - cmake --build build -- -j4 script: (cd build; ctest -V -L CORE) From 0cfd7b055527bd86c293eddc765fbceafa223067 Mon Sep 17 00:00:00 2001 From: reuk Date: Mon, 11 Sep 2017 11:24:34 +0100 Subject: [PATCH 43/80] Remove PRE_COMMAND scaffolding --- .travis.yml | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 819f340875f..5aca4c423ab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -142,22 +142,16 @@ jobs: install: - ccache --max-size=1G - - COMMAND="make -C src minisat2-download" && - eval ${PRE_COMMAND} ${COMMAND} - - COMMAND="make -C src/ansi-c library_check" && - eval ${PRE_COMMAND} ${COMMAND} - - COMMAND="make -C src CXX=\"$COMPILER\" CXXFLAGS=\"-Wall -Werror -pedantic -O2 -g $EXTRA_CXXFLAGS\" -j2" && - eval ${PRE_COMMAND} ${COMMAND} - - COMMAND="make -C src CXX=\"$COMPILER\" CXXFLAGS=\"$FLAGS $EXTRA_CXXFLAGS\" -j2 clobber.dir memory-models.dir musketeer.dir" && - eval ${PRE_COMMAND} ${COMMAND} + - make -C src minisat2-download + - make -C src/ansi-c library_check + - make -C src "CXX=${COMPILER}" "CXXFLAGS=-Wall -Werror -pedantic -O2 -g ${EXTRA_CXXFLAGS}" -j2 + - make -C src "CXX=${COMPILER}" "CXXFLAGS=-Wall -Werror -pedantic -O2 -g ${EXTRA_CXXFLAGS}" -j2 clobber.dir memory-models.dir musketeer.dir script: - if [ -e bin/gcc ] ; then export PATH=$PWD/bin:$PATH ; fi ; - COMMAND="env UBSAN_OPTIONS=print_stacktrace=1 make -C regression test CXX=\"$COMPILER\" CXXFLAGS=\"-Wall -Werror -pedantic -O2 -g $EXTRA_CXXFLAGS\"" && - eval ${PRE_COMMAND} ${COMMAND} - - COMMAND="make -C unit CXX=\"$COMPILER\" CXXFLAGS=\"-Wall -Werror -pedantic -O2 -g $EXTRA_CXXFLAGS\" -j2" && - eval ${PRE_COMMAND} ${COMMAND} - - COMMAND="make -C unit test" && eval ${PRE_COMMAND} ${COMMAND} + - env UBSAN_OPTIONS=print_stacktrace=1 make -C regression test "CXX=${COMPILER}" "CXXFLAGS=-Wall -Werror -pedantic -O2 -g ${EXTRA_CXXFLAGS}" + - make -C unit "CXX=${COMPILER}" "CXXFLAGS=-Wall -Werror -pedantic -O2 -g ${EXTRA_CXXFLAGS}" -j2 + - make -C unit test before_cache: - ccache -s From 8fc714dfc160434430297cc421dd7d5bc51059a6 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Mon, 11 Sep 2017 16:14:45 +0100 Subject: [PATCH 44/80] use __CPROVER_assert --- regression/symex/show-trace1/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regression/symex/show-trace1/main.c b/regression/symex/show-trace1/main.c index e5a7ae24717..5105f95c26a 100644 --- a/regression/symex/show-trace1/main.c +++ b/regression/symex/show-trace1/main.c @@ -11,5 +11,5 @@ int main() if(i==2) if(j==i+1) if(k==i*j) - assert(0); + __CPROVER_assert(0, ""); } From 3896110f560985086f57252744c2c85c8553659d Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Mon, 11 Sep 2017 16:17:38 +0100 Subject: [PATCH 45/80] output statements --- src/path-symex/path_symex.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/path-symex/path_symex.cpp b/src/path-symex/path_symex.cpp index 8f8f6f3707a..e637c3d4f84 100644 --- a/src/path-symex/path_symex.cpp +++ b/src/path-symex/path_symex.cpp @@ -1090,6 +1090,10 @@ void path_symext::operator()( { // just needs to be recorded } + else if(statement==ID_output) + { + // just needs to be recorded + } else throw "unexpected OTHER statement: "+id2string(statement); } From 211355d39f5b11bb14475a32ae8a29f574e2434c Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Mon, 11 Sep 2017 17:46:17 +0100 Subject: [PATCH 46/80] comments on test --- regression/symex/show-trace1/main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/regression/symex/show-trace1/main.c b/regression/symex/show-trace1/main.c index 5105f95c26a..3b216553005 100644 --- a/regression/symex/show-trace1/main.c +++ b/regression/symex/show-trace1/main.c @@ -4,9 +4,9 @@ int main() { int i, j, k; - i=input(); - j=input(); - k=input(); + i=input(); // expect 2 + j=input(); // expect 3 + k=input(); // expect 6 if(i==2) if(j==i+1) From 746bff5be21a5f032972d57d57ec6d38b84094f8 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Mon, 11 Sep 2017 17:53:46 +0100 Subject: [PATCH 47/80] remove_returns missing in symex --- src/symex/symex_parse_options.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/symex/symex_parse_options.cpp b/src/symex/symex_parse_options.cpp index b41cf2ffe59..5d96f2d5949 100644 --- a/src/symex/symex_parse_options.cpp +++ b/src/symex/symex_parse_options.cpp @@ -26,23 +26,24 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include #include -#include -#include -#include -#include -#include #include -#include +#include +#include +#include +#include #include +#include #include +#include +#include #include +#include #include #include -#include -#include -#include +#include +#include +#include #include #include @@ -304,6 +305,7 @@ bool symex_parse_optionst::process_goto_program(const optionst &options) goto_check(options, goto_model); // remove stuff + remove_returns(goto_model); remove_complex(goto_model); remove_vector(goto_model); // remove function pointers From 430218f9cf2d0e542bc29614b49b17be27bb7516 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Mon, 11 Sep 2017 18:00:21 +0100 Subject: [PATCH 48/80] option is now --trace --- regression/symex/show-trace1/test.desc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regression/symex/show-trace1/test.desc b/regression/symex/show-trace1/test.desc index d38b0c9289d..930f344a07a 100644 --- a/regression/symex/show-trace1/test.desc +++ b/regression/symex/show-trace1/test.desc @@ -1,6 +1,6 @@ CORE main.c ---show-trace +--trace ^EXIT=10$ ^SIGNAL=0$ ^VERIFICATION FAILED$ From 5195d246c0d9d9523f827f1f8cc18639ccfd8333 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Mon, 11 Sep 2017 22:48:54 +0100 Subject: [PATCH 49/80] avoid confusion between SSA lhs and full lhs during assignment --- src/path-symex/path_symex.cpp | 45 ++++++++++++++++--------------- src/path-symex/path_symex_class.h | 1 + 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/path-symex/path_symex.cpp b/src/path-symex/path_symex.cpp index e637c3d4f84..3beecc4cfdf 100644 --- a/src/path-symex/path_symex.cpp +++ b/src/path-symex/path_symex.cpp @@ -129,7 +129,7 @@ void path_symext::assign( // start recursion on lhs exprt::operandst _guard; // start with empty guard - assign_rec(state, _guard, ssa_lhs, ssa_rhs); + assign_rec(state, _guard, lhs, ssa_lhs, ssa_rhs); } inline static typet c_sizeof_type_rec(const exprt &expr) @@ -347,6 +347,7 @@ void path_symext::symex_va_arg_next( void path_symext::assign_rec( path_symex_statet &state, exprt::operandst &guard, + const exprt &full_lhs, const exprt &ssa_lhs, const exprt &ssa_rhs) { @@ -376,17 +377,17 @@ void path_symext::assign_rec( // increase the SSA counter and produce new SSA symbol expression var_info.increment_ssa_counter(); - symbol_exprt new_lhs=var_info.ssa_symbol(); + symbol_exprt new_ssa_lhs=var_info.ssa_symbol(); #ifdef DEBUG - std::cout << "new_lhs: " << new_lhs.get_identifier() << '\n'; + std::cout << "new_ssa_lhs: " << new_ssa_lhs.get_identifier() << '\n'; #endif // record new state of lhs { // reference is not stable path_symex_statet::var_statet &var_state=state.get_var_state(var_info); - var_state.ssa_symbol=new_lhs; + var_state.ssa_symbol=new_ssa_lhs; } // rhs nil means non-det assignment @@ -398,11 +399,11 @@ void path_symext::assign_rec( else { // consistency check - if(!base_type_eq(ssa_rhs.type(), new_lhs.type(), state.var_map.ns)) + if(!base_type_eq(ssa_rhs.type(), new_ssa_lhs.type(), state.var_map.ns)) { #ifdef DEBUG std::cout << "ssa_rhs: " << ssa_rhs.pretty() << '\n'; - std::cout << "new_lhs: " << new_lhs.pretty() << '\n'; + std::cout << "new_ssa_lhs: " << new_ssa_lhs.pretty() << '\n'; #endif throw "assign_rec got different types"; } @@ -413,8 +414,8 @@ void path_symext::assign_rec( if(!guard.empty()) step.guard=conjunction(guard); - step.full_lhs=ssa_lhs; - step.ssa_lhs=new_lhs; + step.full_lhs=full_lhs; + step.ssa_lhs=new_ssa_lhs; step.ssa_rhs=ssa_rhs; // propagate the rhs? @@ -425,10 +426,10 @@ void path_symext::assign_rec( else if(ssa_lhs.id()==ID_typecast) { // dereferencing might yield a typecast - const exprt &new_lhs=to_typecast_expr(ssa_lhs).op(); - typecast_exprt new_rhs(ssa_rhs, new_lhs.type()); + const exprt &new_ssa_lhs=to_typecast_expr(ssa_lhs).op(); + typecast_exprt new_rhs(ssa_rhs, new_ssa_lhs.type()); - assign_rec(state, guard, new_lhs, new_rhs); + assign_rec(state, guard, full_lhs, new_ssa_lhs, new_rhs); } else if(ssa_lhs.id()==ID_member) { @@ -454,7 +455,7 @@ void path_symext::assign_rec( with_exprt new_rhs(struct_op, member_name, ssa_rhs); - assign_rec(state, guard, struct_op, new_rhs); + assign_rec(state, guard, full_lhs, struct_op, new_rhs); } else if(compound_type.id()==ID_union) { @@ -462,9 +463,9 @@ void path_symext::assign_rec( exprt offset=from_integer(0, index_type()); byte_extract_exprt - new_lhs(byte_update_id(), struct_op, offset, ssa_rhs.type()); + new_ssa_lhs(byte_update_id(), struct_op, offset, ssa_rhs.type()); - assign_rec(state, guard, new_lhs, ssa_rhs); + assign_rec(state, guard, full_lhs, new_ssa_lhs, ssa_rhs); } else throw "assign_rec: member expects struct or union type"; @@ -496,12 +497,12 @@ void path_symext::assign_rec( // true guard.push_back(cond); - assign_rec(state, guard, lhs_if_expr.true_case(), ssa_rhs); + assign_rec(state, guard, full_lhs, lhs_if_expr.true_case(), ssa_rhs); guard.pop_back(); // false guard.push_back(not_exprt(cond)); - assign_rec(state, guard, lhs_if_expr.false_case(), ssa_rhs); + assign_rec(state, guard, full_lhs, lhs_if_expr.false_case(), ssa_rhs); guard.pop_back(); } else if(ssa_lhs.id()==ID_byte_extract_little_endian || @@ -533,9 +534,9 @@ void path_symext::assign_rec( new_rhs.offset()=byte_extract_expr.offset(); new_rhs.value()=ssa_rhs; - const exprt new_lhs=byte_extract_expr.op(); + const exprt new_ssa_lhs=byte_extract_expr.op(); - assign_rec(state, guard, new_lhs, new_rhs); + assign_rec(state, guard, full_lhs, new_ssa_lhs, new_rhs); } else if(ssa_lhs.id()==ID_struct) { @@ -555,7 +556,7 @@ void path_symext::assign_rec( exprt::operandst::const_iterator lhs_it=operands.begin(); forall_operands(it, ssa_rhs) { - assign_rec(state, guard, *lhs_it, *it); + assign_rec(state, guard, full_lhs, *lhs_it, *it); ++lhs_it; } } @@ -571,7 +572,7 @@ void path_symext::assign_rec( components[i].get_name(), components[i].type()), state.var_map.ns); - assign_rec(state, guard, operands[i], new_rhs); + assign_rec(state, guard, full_lhs, operands[i], new_rhs); } } } @@ -594,7 +595,7 @@ void path_symext::assign_rec( exprt::operandst::const_iterator lhs_it=operands.begin(); forall_operands(it, ssa_rhs) { - assign_rec(state, guard, *lhs_it, *it); + assign_rec(state, guard, full_lhs, *lhs_it, *it); ++lhs_it; } } @@ -610,7 +611,7 @@ void path_symext::assign_rec( from_integer(i, index_type()), array_type.subtype()), state.var_map.ns); - assign_rec(state, guard, operands[i], new_rhs); + assign_rec(state, guard, full_lhs, operands[i], new_rhs); } } } diff --git a/src/path-symex/path_symex_class.h b/src/path-symex/path_symex_class.h index 933b871e9fa..cd67b9c31aa 100644 --- a/src/path-symex/path_symex_class.h +++ b/src/path-symex/path_symex_class.h @@ -93,6 +93,7 @@ class path_symext void assign_rec( path_symex_statet &state, exprt::operandst &guard, // instantiated + const exprt &full_lhs, // not instantiated, no recursion const exprt &ssa_lhs, // instantiated, recursion here const exprt &ssa_rhs); // instantiated From 5d2d07bc00a9b9ff2984af8d5e709a6a81a7a593 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Tue, 12 Sep 2017 13:01:35 +0100 Subject: [PATCH 50/80] enable symex regression testing --- regression/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/regression/Makefile b/regression/Makefile index d47df3994cc..f4d37f8c442 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -12,6 +12,7 @@ DIRS = ansi-c \ invariants \ strings \ strings-smoke-tests \ + symex \ test-script \ # Empty last line From 6a2fd5010ed9420c6861a2e18bef70c1a4816e28 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Tue, 12 Sep 2017 18:23:50 +0100 Subject: [PATCH 51/80] added symex to Appveyor build --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 2efea4e75c2..ecfdda6c81f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -56,6 +56,7 @@ build_script: call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x64 sed -i "s/BUILD_ENV[ ]*=.*/BUILD_ENV = MSVC/" src/config.inc make -C src -j2 + make -C src symex.dir -j2 test_script: - cmd: | From 2816b80de503a3115bc4541264e56c39e04c61d5 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Wed, 13 Sep 2017 09:54:21 +0100 Subject: [PATCH 52/80] revert symex regression until Appvoyer works --- regression/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/regression/Makefile b/regression/Makefile index f4d37f8c442..d47df3994cc 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -12,7 +12,6 @@ DIRS = ansi-c \ invariants \ strings \ strings-smoke-tests \ - symex \ test-script \ # Empty last line From 0496142cd73bd6ac075d27188bf20301304b0d1e Mon Sep 17 00:00:00 2001 From: Pascal Kesseli Date: Tue, 12 Sep 2017 17:04:22 +0200 Subject: [PATCH 53/80] Account for replaced functions in exceptions_map Invariant in `uncaught_exceptions_analysist::output` expects all functions in the GOTO model to be present in the exceptions_map. However, functions like __CPROVER_assert(...) get replaced by explicit GOTO instructions and will not occur as function calls, thus not be in the map. This fix addresses this issue, which only occurs in a debug output produced with -DDEBUG. --- regression/cbmc-java/exceptions25/main.c | 7 +++++++ regression/cbmc-java/exceptions25/test.desc | 14 ++++++++++++++ src/analyses/uncaught_exceptions_analysis.cpp | 8 +++++--- 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 regression/cbmc-java/exceptions25/main.c create mode 100644 regression/cbmc-java/exceptions25/test.desc diff --git a/regression/cbmc-java/exceptions25/main.c b/regression/cbmc-java/exceptions25/main.c new file mode 100644 index 00000000000..ab24eded4f8 --- /dev/null +++ b/regression/cbmc-java/exceptions25/main.c @@ -0,0 +1,7 @@ +int main(void) +{ + int x; + __CPROVER_assume(x < 10); + __CPROVER_assert(x != 0, ""); + return 0; +} diff --git a/regression/cbmc-java/exceptions25/test.desc b/regression/cbmc-java/exceptions25/test.desc new file mode 100644 index 00000000000..f8823e7d524 --- /dev/null +++ b/regression/cbmc-java/exceptions25/test.desc @@ -0,0 +1,14 @@ +CORE +main.c + +^EXIT=10$ +^SIGNAL=0$ +VERIFICATION FAILED +-- +^warning: ignoring +-- +When compiling CBMC with -DDEBUG uncaught exception analysis prints an +exceptions map per function. This test ensures that meta-functions which are +replaced by explicit GOTO instructions (e.g. __CPROVER_assert, __CPROVER_assume) +and thus do not occur as explicit function calls in the final GOTO program are +handled correctly. diff --git a/src/analyses/uncaught_exceptions_analysis.cpp b/src/analyses/uncaught_exceptions_analysis.cpp index 4b0674c375d..dfd0d9a51ca 100644 --- a/src/analyses/uncaught_exceptions_analysis.cpp +++ b/src/analyses/uncaught_exceptions_analysis.cpp @@ -193,9 +193,11 @@ void uncaught_exceptions_analysist::output( { const auto fn=it->first; const exceptions_mapt::const_iterator found=exceptions_map.find(fn); - INVARIANT( - found!=exceptions_map.end(), - "each function expected to be recorded in `exceptions_map`"); + // Functions like __CPROVER_assert and __CPROVER_assume are replaced by + // explicit GOTO instructions and will not show up in exceptions_map. + if(found==exceptions_map.end()) + continue; + const auto &fs=found->second; if(!fs.empty()) { From e73a884e26b34bfc44969871eb474d7fcaf1b30e Mon Sep 17 00:00:00 2001 From: thk123 Date: Wed, 13 Sep 2017 10:14:27 +0100 Subject: [PATCH 54/80] Attempt to fix the symex appveyor build Starting off by just making the Makefile look the same --- regression/symex/Makefile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/regression/symex/Makefile b/regression/symex/Makefile index 120e9a347c0..006aaf3a346 100644 --- a/regression/symex/Makefile +++ b/regression/symex/Makefile @@ -1,10 +1,16 @@ default: tests.log test: - @../test.pl -c ../../../src/symex/symex + @if ! ../test.pl -c ../../../src/symex/symex ; then \ + ../failed-tests-printer.pl ; \ + exit 1 ; \ + fi tests.log: ../test.pl - @../test.pl -c ../../../src/symex/symex + @if ! ../test.pl -c ../../../src/symex/symex ; then \ + ../failed-tests-printer.pl ; \ + exit 1 ; \ + fi show: @for dir in *; do \ From af8d46f6f3414aaac2f1f81ee112752c1519dc0d Mon Sep 17 00:00:00 2001 From: thk123 Date: Wed, 13 Sep 2017 10:32:28 +0100 Subject: [PATCH 55/80] Reverting manually commited fixes --- appveyor.yml | 1 - regression/Makefile | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index ecfdda6c81f..2efea4e75c2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -56,7 +56,6 @@ build_script: call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x64 sed -i "s/BUILD_ENV[ ]*=.*/BUILD_ENV = MSVC/" src/config.inc make -C src -j2 - make -C src symex.dir -j2 test_script: - cmd: | diff --git a/regression/Makefile b/regression/Makefile index d47df3994cc..f4d37f8c442 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -12,6 +12,7 @@ DIRS = ansi-c \ invariants \ strings \ strings-smoke-tests \ + symex \ test-script \ # Empty last line From a31f1d9e5106e29eb80216d969d6fd364c1b5d13 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Wed, 13 Sep 2017 10:55:51 +0100 Subject: [PATCH 56/80] remove musketeer --- .travis.yml | 2 +- src/Makefile | 4 +- src/musketeer/Makefile | 62 - src/musketeer/cycles_visitor.cpp | 381 - src/musketeer/cycles_visitor.h | 50 - .../experiments/goto-runner/clean.sh | 18 - .../goto-runner/dkr11.cs.ox.ac.uk.config | 52 - .../goto-runner/dkr12.cs.ox.ac.uk.config | 52 - .../experiments/goto-runner/goto-runner.sh | 471 - .../experiments/goto-runner/pkgs-jenkins-all | 17214 ---------------- .../goto-runner/pkgs-jenkins-paper | 10 - .../experiments/goto-runner/pkgs-qm-all | 9121 -------- .../experiments/goto-runner/pkgs-qm-paper | 10 - .../experiments/goto-runner/readme.txt | 18 - src/musketeer/fence-insertion/fi.py | 1061 - src/musketeer/fence-insertion/test1/clean.sh | 3 - .../fence-insertion/test1/results-musk.txt | 21 - .../fence-insertion/test1/results-other.txt | 21 - src/musketeer/fence-insertion/test1/test.sh | 26 - src/musketeer/fence-insertion/test2/clean.sh | 3 - .../fence-insertion/test2/results.txt | 6 - src/musketeer/fence-insertion/test2/test.sh | 21 - src/musketeer/fence_assert.cpp | 32 - src/musketeer/fence_assert.h | 52 - src/musketeer/fence_inserter.cpp | 1107 - src/musketeer/fence_inserter.h | 196 - src/musketeer/fence_shared.cpp | 591 - src/musketeer/fence_shared.h | 39 - src/musketeer/fence_user_def.cpp | 44 - src/musketeer/fence_user_def.h | 52 - src/musketeer/fencer.cpp | 182 - src/musketeer/fencer.h | 46 - src/musketeer/graph_visitor.cpp | 484 - src/musketeer/graph_visitor.h | 75 - src/musketeer/ilp.h | 70 - src/musketeer/infer_mode.h | 20 - src/musketeer/languages.cpp | 21 - src/musketeer/musketeer_main.cpp | 18 - src/musketeer/musketeer_parse_options.cpp | 453 - src/musketeer/musketeer_parse_options.h | 57 - src/musketeer/pensieve.cpp | 71 - src/musketeer/pensieve.h | 33 - .../propagate_const_function_pointers.cpp | 567 - .../propagate_const_function_pointers.h | 29 - src/musketeer/replace_async.h | 83 - src/musketeer/version.h | 6 - 46 files changed, 2 insertions(+), 32953 deletions(-) delete mode 100644 src/musketeer/Makefile delete mode 100644 src/musketeer/cycles_visitor.cpp delete mode 100644 src/musketeer/cycles_visitor.h delete mode 100644 src/musketeer/experiments/goto-runner/clean.sh delete mode 100644 src/musketeer/experiments/goto-runner/dkr11.cs.ox.ac.uk.config delete mode 100644 src/musketeer/experiments/goto-runner/dkr12.cs.ox.ac.uk.config delete mode 100644 src/musketeer/experiments/goto-runner/goto-runner.sh delete mode 100644 src/musketeer/experiments/goto-runner/pkgs-jenkins-all delete mode 100644 src/musketeer/experiments/goto-runner/pkgs-jenkins-paper delete mode 100644 src/musketeer/experiments/goto-runner/pkgs-qm-all delete mode 100644 src/musketeer/experiments/goto-runner/pkgs-qm-paper delete mode 100644 src/musketeer/experiments/goto-runner/readme.txt delete mode 100644 src/musketeer/fence-insertion/fi.py delete mode 100644 src/musketeer/fence-insertion/test1/clean.sh delete mode 100644 src/musketeer/fence-insertion/test1/results-musk.txt delete mode 100644 src/musketeer/fence-insertion/test1/results-other.txt delete mode 100644 src/musketeer/fence-insertion/test1/test.sh delete mode 100644 src/musketeer/fence-insertion/test2/clean.sh delete mode 100644 src/musketeer/fence-insertion/test2/results.txt delete mode 100644 src/musketeer/fence-insertion/test2/test.sh delete mode 100644 src/musketeer/fence_assert.cpp delete mode 100644 src/musketeer/fence_assert.h delete mode 100644 src/musketeer/fence_inserter.cpp delete mode 100644 src/musketeer/fence_inserter.h delete mode 100644 src/musketeer/fence_shared.cpp delete mode 100644 src/musketeer/fence_shared.h delete mode 100644 src/musketeer/fence_user_def.cpp delete mode 100644 src/musketeer/fence_user_def.h delete mode 100644 src/musketeer/fencer.cpp delete mode 100644 src/musketeer/fencer.h delete mode 100644 src/musketeer/graph_visitor.cpp delete mode 100644 src/musketeer/graph_visitor.h delete mode 100644 src/musketeer/ilp.h delete mode 100644 src/musketeer/infer_mode.h delete mode 100644 src/musketeer/languages.cpp delete mode 100644 src/musketeer/musketeer_main.cpp delete mode 100644 src/musketeer/musketeer_parse_options.cpp delete mode 100644 src/musketeer/musketeer_parse_options.h delete mode 100644 src/musketeer/pensieve.cpp delete mode 100644 src/musketeer/pensieve.h delete mode 100644 src/musketeer/propagate_const_function_pointers.cpp delete mode 100644 src/musketeer/propagate_const_function_pointers.h delete mode 100644 src/musketeer/replace_async.h delete mode 100644 src/musketeer/version.h diff --git a/.travis.yml b/.travis.yml index 5aca4c423ab..765fab9d9bd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -145,7 +145,7 @@ install: - make -C src minisat2-download - make -C src/ansi-c library_check - make -C src "CXX=${COMPILER}" "CXXFLAGS=-Wall -Werror -pedantic -O2 -g ${EXTRA_CXXFLAGS}" -j2 - - make -C src "CXX=${COMPILER}" "CXXFLAGS=-Wall -Werror -pedantic -O2 -g ${EXTRA_CXXFLAGS}" -j2 clobber.dir memory-models.dir musketeer.dir + - make -C src "CXX=${COMPILER}" "CXXFLAGS=-Wall -Werror -pedantic -O2 -g ${EXTRA_CXXFLAGS}" -j2 clobber.dir memory-models.dir script: - if [ -e bin/gcc ] ; then export PATH=$PWD/bin:$PATH ; fi ; diff --git a/src/Makefile b/src/Makefile index 6d2c3f0a8fd..78fb1a34cb8 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,6 +1,6 @@ DIRS = ansi-c big-int cbmc cpp goto-cc goto-instrument goto-programs \ goto-symex langapi pointer-analysis solvers util linking xmllang \ - assembler analyses java_bytecode path-symex musketeer \ + assembler analyses java_bytecode path-symex \ json goto-analyzer jsil symex goto-diff clobber \ memory-models miniz @@ -26,8 +26,6 @@ goto-instrument.dir: languages goto-programs.dir pointer-analysis.dir \ goto-symex.dir linking.dir analyses.dir solvers.dir \ json.dir -musketeer.dir: goto-instrument.dir - cbmc.dir: languages solvers.dir goto-symex.dir analyses.dir \ pointer-analysis.dir goto-programs.dir linking.dir \ goto-instrument.dir diff --git a/src/musketeer/Makefile b/src/musketeer/Makefile deleted file mode 100644 index be41fa923cc..00000000000 --- a/src/musketeer/Makefile +++ /dev/null @@ -1,62 +0,0 @@ -SRC = cycles_visitor.cpp \ - fence_assert.cpp \ - fence_inserter.cpp \ - fence_shared.cpp \ - fence_user_def.cpp \ - fencer.cpp \ - graph_visitor.cpp \ - languages.cpp \ - musketeer_main.cpp \ - musketeer_parse_options.cpp \ - pensieve.cpp \ - propagate_const_function_pointers.cpp \ - # Empty last line - -OBJ += ../ansi-c/ansi-c$(LIBEXT) \ - ../linking/linking$(LIBEXT) \ - ../big-int/big-int$(LIBEXT) \ - ../goto-programs/goto-programs$(LIBEXT) \ - ../goto-symex/goto-symex$(LIBEXT) \ - ../assembler/assembler$(LIBEXT) \ - ../pointer-analysis/pointer-analysis$(LIBEXT) \ - ../analyses/analyses$(LIBEXT) \ - ../langapi/langapi$(LIBEXT) \ - ../util/util$(LIBEXT) \ - ../solvers/solvers$(LIBEXT) \ - ../goto-instrument/wmm/weak_memory$(OBJEXT) \ - ../goto-instrument/wmm/fence$(OBJEXT) \ - ../goto-instrument/wmm/event_graph$(OBJEXT) \ - ../goto-instrument/wmm/goto2graph$(OBJEXT) \ - ../goto-instrument/wmm/data_dp$(OBJEXT) \ - ../goto-instrument/wmm/abstract_event$(OBJEXT) \ - ../goto-instrument/wmm/instrumenter_strategies$(OBJEXT) \ - ../goto-instrument/wmm/cycle_collection$(OBJEXT) \ - ../goto-instrument/wmm/shared_buffers$(OBJEXT) \ - ../goto-instrument/wmm/pair_collection$(OBJEXT) \ - ../goto-instrument/rw_set$(OBJEXT) - -INCLUDES= -I .. - -LIBS = - -CLEANFILES = musketeer$(EXEEXT) - -include ../config.inc -include ../common - -all: musketeer$(EXEEXT) - -ifneq ($(LIB_GLPK),) - LIBS += $(LIB_GLPK) - CP_CXXFLAGS += -DHAVE_GLPK -endif - -############################################################################### - -musketeer$(EXEEXT): $(OBJ) - $(LINKBIN) - -.PHONY: musketeer-mac-signed - -musketeer-mac-signed: musketeer$(EXEEXT) - codesign -v -s $(OSX_IDENTITY) musketeer$(EXEEXT) diff --git a/src/musketeer/cycles_visitor.cpp b/src/musketeer/cycles_visitor.cpp deleted file mode 100644 index 08bbe4bea96..00000000000 --- a/src/musketeer/cycles_visitor.cpp +++ /dev/null @@ -1,381 +0,0 @@ -/*******************************************************************\ - -Module: cycles visitor for computing edges involved for fencing - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// cycles visitor for computing edges involved for fencing - -#include "cycles_visitor.h" - -#include -#include - -#include "fence_inserter.h" - -class instrumentert; - -/* implemented: BTWN1, BTWN4 */ -#define BTWN1 - -/* po^+ /\ U{C_1, ..., C_n} \/ delays */ -void cycles_visitort::po_edges(std::set &edges) -{ - instrumentert &instrumenter=fence_inserter.instrumenter; - - event_grapht &egraph=instrumenter.egraph; - - for(std::set::iterator - C_j=instrumenter.set_of_cycles.begin(); - C_j!=instrumenter.set_of_cycles.end(); - ++C_j) - { - /* filters */ - if(fence_inserter.filter_cycles(C_j->id)) - continue; - -#ifdef BTWN1 - /* btwn1: variables are all the pos involved in cycles, plus the delays - for dp when analysing Power or ARM */ - if(fence_inserter.model==Power || fence_inserter.model==Unknown) - { - /* for Power/ARM, add also delays as variables for dp (other fences - are superfluous if the edge is not in pos; yet it's not harmful) */ - for(std::set::iterator e_i=C_j->unsafe_pairs.begin(); - e_i!=C_j->unsafe_pairs.end(); ++e_i) - { - if(e_i->is_po) - edges.insert(fence_inserter.add_edge(*e_i)); - else - { - /* also add pos of non-delaying pos+ of cycles, as they could AC or - BC */ - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_in(e_i->first).begin(); - next_it!=egraph.po_in(e_i->first).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(e_i->first); - new_path.push_back(next_it->first); - fence_inserter.const_graph_visitor.const_graph_explore_AC(egraph, - next_it->first, new_path); - } - - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(e_i->second).begin(); - next_it!=egraph.po_out(e_i->second).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(e_i->second); - new_path.push_back(next_it->first); - fence_inserter.const_graph_visitor.const_graph_explore_BC(egraph, - next_it->first, new_path); - } - } - } - } - - event_grapht::critical_cyclet::const_iterator cur=C_j->begin(); - assert(cur!=C_j->end()); - event_grapht::critical_cyclet::const_iterator next=cur; - ++next; - assert(next!=C_j->end()); - for(; cur!=C_j->end() && next!=C_j->end(); ++cur, ++next) - { - if(egraph[*cur].is_fence() || egraph[*next].is_fence()) - continue; - - const edget e_i(*cur, *next); - - if(e_i.is_po) - edges.insert(fence_inserter.add_edge(e_i)); - else - { - /* adds basic pos from this pos^+ */ - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(e_i.first).begin(); - next_it!=egraph.po_out(e_i.first).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(e_i.first); - new_path.push_back(next_it->first); - fence_inserter.const_graph_visitor.const_graph_explore(egraph, - next_it->first, e_i.second, new_path); - } - } - } - /* last case */ - { - const edget e_i(*cur, C_j->front()); - - if(!egraph[*cur].is_fence() && !egraph[C_j->front()].is_fence()) - { - if(e_i.is_po) - edges.insert(fence_inserter.add_edge(e_i)); - else - { - /* adds basic pos from this pos^+ */ - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(e_i.first).begin(); - next_it!=egraph.po_out(e_i.first).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(e_i.first); - new_path.push_back(next_it->first); - fence_inserter.const_graph_visitor.const_graph_explore(egraph, - next_it->first, e_i.second, new_path); - } - } - } - } -#elif defined BTWN4 - /* add delays as var */ - for(std::set::iterator e_i=C_j->unsafe_pairs.begin(); - e_i!=C_j->unsafe_pairs.end(); ++e_i) - edges.insert(fence_inserter.add_edge(*e_i)); - - /* maximum pos+ at the intersection of two cycles */ - std::set::iterator C_k=C_j; - ++C_k; - for(; C_k!=instrumenter.set_of_cycles.end(); ++C_k) - { - /* not necessary; might improve the construction time however */ -#if 0 - /* first, let us check if these cycles are entangled */ - event_grapht::critical_cyclet::const_iterator C_j_it=C_j->begin(); - event_grapht::critical_cyclet::const_iterator C_k_it=C_k->begin(); - for(; C_j_it!=C_j->end(); ++C_j_it) - { - for( ; - C_k_it!=C_k->end() && - !egraph.are_po_ordered(*C_j_it, *C_k_it) && - !egraph.are_po_ordered(*C_k_it, *C_j_it); - ++C_k_it) - { - } - - if(C_k_it!=C_k->end()) - break; - } - - if(C_j_it==C_j->end()) - continue; -#endif - - /* computes the largest pos+ in C_j */ - std::map m_begin; - std::map m_end; - std::set m_threads; - - unsigned previous_thread=0; - for(event_grapht::critical_cyclet::const_iterator C_j_it=C_j->begin(); - C_j_it!=C_j->end(); ++C_j_it) - { - const unsigned current_thread=egraph[*C_j_it].thread; - - if(previous_thread==current_thread && C_j_it!=C_j->begin()) - m_end[previous_thread]=C_j_it; - else - { - m_begin[current_thread]=C_j_it; - m_end[current_thread]=C_j_it; - m_threads.insert(current_thread); - } - - previous_thread=current_thread; - } - - /* computes the largest pos+ in C_k */ - std::map k_begin; - std::map k_end; - std::set k_threads; - - previous_thread=0; - for(event_grapht::critical_cyclet::const_iterator C_k_it=C_k->begin(); - C_k_it!=C_k->end(); ++C_k_it) - { - const unsigned current_thread=egraph[*C_k_it].thread; - - if(previous_thread==current_thread && C_k_it!=C_k->begin()) - k_end[previous_thread]=C_k_it; - else - { - k_begin[current_thread]=C_k_it; - k_end[current_thread]=C_k_it; - k_threads.insert(current_thread); - } - - previous_thread=current_thread; - } - - /* if there are some commun threads, take the intersection if relevant */ - for(std::set::const_iterator it=m_threads.begin(); - it!=m_threads.end(); ++it) - if(k_threads.find(*it)!=k_threads.end()) - { - const event_idt a=*m_begin[*it]; - const event_idt b=*m_end[*it]; - const event_idt c=*k_begin[*it]; - const event_idt d=*k_end[*it]; - - if(egraph.are_po_ordered(b, c)) - continue; - else if(egraph.are_po_ordered(d, a)) - continue; - else if(egraph.are_po_ordered(a, c) && egraph.are_po_ordered(b, d)) - fence_inserter.add_edge(edget(c, b)); - else if(egraph.are_po_ordered(a, c) && egraph.are_po_ordered(d, b)) - fence_inserter.add_edge(edget(c, d)); - else if(egraph.are_po_ordered(c, a) && egraph.are_po_ordered(b, d)) - fence_inserter.add_edge(edget(a, b)); - else if(egraph.are_po_ordered(c, a) && egraph.are_po_ordered(d, b)) - fence_inserter.add_edge(edget(a, d)); - } - } -#else - throw "no BTWN definition selected!"; -#endif - } -} - -/* C_j /\ po^+ /\ poWR */ -void cycles_visitort::powr_constraint( - const event_grapht::critical_cyclet &C_j, - std::set &edges) -{ - event_grapht &graph=fence_inserter.instrumenter.egraph; - - for(std::set::iterator e_i=C_j.unsafe_pairs.begin(); - e_i!=C_j.unsafe_pairs.end(); ++e_i) - { - if(e_i->is_po && - (graph[e_i->first].operation==abstract_eventt::operationt::Write && - graph[e_i->second].operation==abstract_eventt::operationt::Read)) - { - if( edges.insert(fence_inserter.add_edge(*e_i)).second ) - ++fence_inserter.constraints_number; - } - } -} - -/* C_j /\ po^+ /\ poWW */ -void cycles_visitort::poww_constraint( - const event_grapht::critical_cyclet &C_j, - std::set &edges) -{ - event_grapht &graph=fence_inserter.instrumenter.egraph; - - for(std::set::iterator e_i=C_j.unsafe_pairs.begin(); - e_i!=C_j.unsafe_pairs.end(); ++e_i) - { - if(e_i->is_po && - (graph[e_i->first].operation==abstract_eventt::operationt::Write && - graph[e_i->second].operation==abstract_eventt::operationt::Write)) - { - if( edges.insert(fence_inserter.add_edge(*e_i)).second ) - ++fence_inserter.constraints_number; - } - } -} - -/* C_j /\ po^+ /\ poRW */ -void cycles_visitort::porw_constraint( - const event_grapht::critical_cyclet &C_j, - std::set &edges) -{ - event_grapht &graph=fence_inserter.instrumenter.egraph; - - for(std::set::iterator e_i=C_j.unsafe_pairs.begin(); - e_i!=C_j.unsafe_pairs.end(); ++e_i) - { - if(e_i->is_po && - (graph[e_i->first].operation==abstract_eventt::operationt::Read && - graph[e_i->second].operation==abstract_eventt::operationt::Write)) - { - if( edges.insert(fence_inserter.add_edge(*e_i)).second ) - ++fence_inserter.constraints_number; - } - } -} - -/* C_j /\ po^+ /\ poRR */ -void cycles_visitort::porr_constraint( - const event_grapht::critical_cyclet &C_j, - std::set &edges) -{ - event_grapht &graph=fence_inserter.instrumenter.egraph; - - for(std::set::iterator e_i=C_j.unsafe_pairs.begin(); - e_i!=C_j.unsafe_pairs.end(); ++e_i) - { - if(e_i->is_po && - (graph[e_i->first].operation==abstract_eventt::operationt::Read && - graph[e_i->second].operation==abstract_eventt::operationt::Read)) - { - if( edges.insert(fence_inserter.add_edge(*e_i)).second ) - ++fence_inserter.constraints_number; - } - } -} - -/* C_j /\ comWR */ -void cycles_visitort::com_constraint( - const event_grapht::critical_cyclet &C_j, - std::set &edges) -{ - event_grapht &egraph=fence_inserter.instrumenter.egraph; - - for(std::set::const_iterator it=C_j.unsafe_pairs.begin(); - it!=C_j.unsafe_pairs.end(); - ++it) - { - if(egraph[it->first].operation==abstract_eventt::operationt::Write - && egraph[it->second].operation==abstract_eventt::operationt::Read - && egraph[it->first].thread!=egraph[it->second].thread) - if( edges.insert(fence_inserter.add_invisible_edge(*it)).second ) - ++fence_inserter.constraints_number; - } - -#if 0 - event_grapht &egraph=instrumenter.egraph; - - std::list::const_iterator e_it=C_j.begin(); - std::list::const_iterator next_it=e_it; - assert(!C_j.empty()); - ++next_it; - for(; next_it!=C_j.end() && e_it!=C_j.end(); ++e_it, ++next_it) - { - const abstract_eventt &e1=egraph[*e_it]; - const abstract_eventt &e2=egraph[*next_it]; - - if(e1.operation==abstract_eventt::Write - && e2.operation==abstract_eventt::Read - && e1.thread!=e2.thread) - { - if( edges.insert(add_invisible_edge(edget(*e_it, *next_it))).second ) - ++constraints_number; - } - } - /* last case */ - assert(e_it!=C_j.end()); - next_it=C_j.begin(); - - const abstract_eventt &e1=egraph[*e_it]; - const abstract_eventt &e2=egraph[*next_it]; - - if(e1.operation==abstract_eventt::Write - && e2.operation==abstract_eventt::Read - && e1.thread!=e2.thread) - { - if( edges.insert(add_invisible_edge(edget(*e_it, *next_it))).second ) - ++constraints_number; - } -#endif -} diff --git a/src/musketeer/cycles_visitor.h b/src/musketeer/cycles_visitor.h deleted file mode 100644 index 0b9b122eed8..00000000000 --- a/src/musketeer/cycles_visitor.h +++ /dev/null @@ -1,50 +0,0 @@ -/*******************************************************************\ - -Module: cycles visitor for computing edges involved for fencing - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// cycles visitor for computing edges involved for fencing - -#ifndef CPROVER_MUSKETEER_CYCLES_VISITOR_H -#define CPROVER_MUSKETEER_CYCLES_VISITOR_H - -#include - -#include - -class fence_insertert; - -class cycles_visitort -{ -protected: - typedef event_grapht::critical_cyclet::delayt edget; - - fence_insertert &fence_inserter; - -public: - explicit cycles_visitort(fence_insertert &_fi) - : fence_inserter(_fi) - {} - - /* computes po^+ edges in U{C_1, ..., C_j} */ - void po_edges(std::set &edges); - - /* computes pairs that will be protected for the - TSO/PSO/RMO/Power/ARM by the constraints */ - void powr_constraint(const event_grapht::critical_cyclet &C_j, - std::set &edges); - void poww_constraint(const event_grapht::critical_cyclet &C_j, - std::set &edges); - void porw_constraint(const event_grapht::critical_cyclet &C_j, - std::set &edges); - void porr_constraint(const event_grapht::critical_cyclet &C_j, - std::set &edges); - void com_constraint(const event_grapht::critical_cyclet &C_j, - std::set &edges); -}; - -#endif // CPROVER_MUSKETEER_CYCLES_VISITOR_H diff --git a/src/musketeer/experiments/goto-runner/clean.sh b/src/musketeer/experiments/goto-runner/clean.sh deleted file mode 100644 index eadc3f9523d..00000000000 --- a/src/musketeer/experiments/goto-runner/clean.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -rm -f goto-magic goto-functions-* test test.c progress-* pid-* info-* \ - results.txt *.gb.linked.* *.tar *.tar.bz2 - -rm -rf success-* failure-* - -rm -f nohup.out - -rm -rf inst-0 inst-1 - -# Remove all unpacked folders -for F in * -do - if [ -d "$F" ] && [ ${F:0:8} = 'goto-cc-' ]; then - rm -rf "$F" - fi -done diff --git a/src/musketeer/experiments/goto-runner/dkr11.cs.ox.ac.uk.config b/src/musketeer/experiments/goto-runner/dkr11.cs.ox.ac.uk.config deleted file mode 100644 index 774f3c09b24..00000000000 --- a/src/musketeer/experiments/goto-runner/dkr11.cs.ox.ac.uk.config +++ /dev/null @@ -1,52 +0,0 @@ -# Virtual memory limit for this script and children (in KiB) -MAXMEM=4000000 - -# Virtual memory limit for each (parallel) fencter run (in KiB), the sum of -# which should be smaller than the above -MAXMEM_FE=1500000 - -# Maximum size of archives to download (in bytes) -MAX_ARCHIVE_SIZE=100000000 - -# Maximum size of goto binaries to check (in bytes) -MAX_GB_SIZE=10000000 - -# Maximum LoC of goto binaries to check (LoC according to goto-instrument -# --count-eloc) -MAX_LOC=15000 - -# Tool timeout (in sec) -TIMEOUT=600 - -# Parallel factor (must be >= 1) -FACTOR=1 - -# List of packages -FILE_LIST=pkgs-qm-all - -# URL to download packages from (package name from pkgs-*-(all|paper) is -# inserted between BEFORE and AFTER) -#BEFORE='http://dkr-debian.cs.ox.ac.uk:8080/job/goto-cc-' -#AFTER='/ws/goto-binaries.tar.bz2' -BEFORE='http://theory.eecs.qmul.ac.uk/debian+mole/pkgs/' -AFTER='-goto-binaries.tar.bz2' - -# Path to pthread lib to link with (default) -PTHREAD_LIB=pthread_lib.c - -# Path to pthread lib to link with when the above one doesn't work (e.g. due to -# version issues); use same path as above if there's no alternative file to -# prevent file not found error -PTHREAD_LIB_ALT=pthread_lib_alt.c - -# Tool invocations to try on the goto binaries (run $FACTOR tools in parallel) -FE[0]="cbmc --mm sc" -FE[1]="cbmc --mm tso" - -# Other needed tools -GI="./goto-instrument" -GC="./goto-cc" - -# Indicate if downloaded archives should be kept -KEEP=1 - diff --git a/src/musketeer/experiments/goto-runner/dkr12.cs.ox.ac.uk.config b/src/musketeer/experiments/goto-runner/dkr12.cs.ox.ac.uk.config deleted file mode 100644 index 774f3c09b24..00000000000 --- a/src/musketeer/experiments/goto-runner/dkr12.cs.ox.ac.uk.config +++ /dev/null @@ -1,52 +0,0 @@ -# Virtual memory limit for this script and children (in KiB) -MAXMEM=4000000 - -# Virtual memory limit for each (parallel) fencter run (in KiB), the sum of -# which should be smaller than the above -MAXMEM_FE=1500000 - -# Maximum size of archives to download (in bytes) -MAX_ARCHIVE_SIZE=100000000 - -# Maximum size of goto binaries to check (in bytes) -MAX_GB_SIZE=10000000 - -# Maximum LoC of goto binaries to check (LoC according to goto-instrument -# --count-eloc) -MAX_LOC=15000 - -# Tool timeout (in sec) -TIMEOUT=600 - -# Parallel factor (must be >= 1) -FACTOR=1 - -# List of packages -FILE_LIST=pkgs-qm-all - -# URL to download packages from (package name from pkgs-*-(all|paper) is -# inserted between BEFORE and AFTER) -#BEFORE='http://dkr-debian.cs.ox.ac.uk:8080/job/goto-cc-' -#AFTER='/ws/goto-binaries.tar.bz2' -BEFORE='http://theory.eecs.qmul.ac.uk/debian+mole/pkgs/' -AFTER='-goto-binaries.tar.bz2' - -# Path to pthread lib to link with (default) -PTHREAD_LIB=pthread_lib.c - -# Path to pthread lib to link with when the above one doesn't work (e.g. due to -# version issues); use same path as above if there's no alternative file to -# prevent file not found error -PTHREAD_LIB_ALT=pthread_lib_alt.c - -# Tool invocations to try on the goto binaries (run $FACTOR tools in parallel) -FE[0]="cbmc --mm sc" -FE[1]="cbmc --mm tso" - -# Other needed tools -GI="./goto-instrument" -GC="./goto-cc" - -# Indicate if downloaded archives should be kept -KEEP=1 - diff --git a/src/musketeer/experiments/goto-runner/goto-runner.sh b/src/musketeer/experiments/goto-runner/goto-runner.sh deleted file mode 100644 index f3e64cc37f2..00000000000 --- a/src/musketeer/experiments/goto-runner/goto-runner.sh +++ /dev/null @@ -1,471 +0,0 @@ -#!/bin/bash - -# Run tool on all of Michael's Debian packages. -# -# goto-runner.sh -# -# : natural; id of this instance -# : line at which to start in $FILE_LIST (1-based) -# : line at which to stop in $FILE_LIST (inclusive) -# -# Produced files: -# - progress-*: progress -# - info-*: logfile of the script -# - pid-*: pid of the script -# - in success-*/*: output of successful runs -# - in failure-*/*: output of unsuccessful runs -# -# Progress format (updated when a new package is handled): -# (line-start) current line / line-stop (total lines) -# ... - -# ------------------------------------------------------------------------------ -# Config - -. "$(hostname).config" || exit 1 - -# ------------------------------------------------------------------------------ -# Misc - -error() { - echo $PRE "$1" >&2 -} - -inf() { - echo $PRE "$1" -} - -bail() { - error "$1" - exit 1 -} - -usage() { - echo -e '\nUsage:' >&2 - echo -e ' goto-runner.sh \n' >&2 -} - -natcheck() { - echo "$1" | egrep -q '^(0|([1-9][0-9]*))$' > /dev/null 2>&1 - [ $? -ne 0 ] && bail 'not a natural number' -} - -# Replace forward slashes with underscores -replace() { - echo "$1" | sed 's/\//\_/g' -} - -# ------------------------------------------------------------------------------ -# Handle arguments - -PRE='goto-runner:' - -if [ $# -ne 3 ]; then - error 'number of arguments != 3' - usage - exit 1 -fi - -I="$1" -LSTART="$2" -LSTOP="$3" - -natcheck "$I" -natcheck "$LSTART" -natcheck "$LSTOP" - -if [ "$LSTART" -eq 0 ]; then - error 'line-start must be >= 1' - usage - exit 1 -fi -if [ "$LSTART" -gt "$LSTOP" ]; then - error'line-start greater than line-stop' - usage - exit 1 -fi - -TN=${#FE[@]} - -# ------------------------------------------------------------------------------ -# Signal handling - -STOP=0 - -grace() { - inf 'Termination signal received; will exit after this iteration' - STOP=1 -} - -trap grace SIGINT SIGTERM - -# ------------------------------------------------------------------------------ -# Sanity checks - -N=$TN -for ((i=0; i /dev/null 2>&1 - [ $? -eq 127 ] && bail "Cannot invoke $T" -done - -[ ! -f "$PTHREAD_LIB" ] && bail 'pthread lib file does not exist' -[ ! -f "$PTHREAD_LIB_ALT" ] && bail 'alt pthread lib file does not exist' - -natcheck "$FACTOR" - -# ------------------------------------------------------------------------------ -# Preparation - -ulimit -v $MAXMEM - -INFO="info-$I" -PROG="progress-$I" - -[ -e $INFO ] && bail "file $INFO already exists (delete it to start afresh)" -[ ! -r $FILE_LIST ] && bail "file $FILE_LIST cannot be opened for reading" - -> $INFO -> $PROG - -echo '# vim: nowrap' >> $INFO - -# Directories for output files -mkdir success-$I > /dev/null 2>&1 -mkdir failure-$I > /dev/null 2>&1 - -# Magic -echo '0 bequad 0x7f47424600000002 goto-binary-old' > goto-magic -echo '0 belong 0x7f474246 goto-binary' > goto-magic -echo 'int main() {}' > test.c -$GC test.c -o test > /dev/null 2>&1 -file -m goto-magic test 2>&1 | grep 'goto-binary' > /dev/null 2>&1 -[ $? -ne 0 ] && bail 'goto magic failed' - -TOTAL=$(wc -l $FILE_LIST | cut -f 1 -d ' ') -NUM=$(($LSTOP - $LSTART + 1)) -COUNT=$LSTART - -FILES=$(tail -n +$LSTART $FILE_LIST | head -n $NUM) - -# Number of files handled so far -FILE_COUNT=0 - -# Number of goto binaries handled so far -GB_COUNT=0 - -# Number of goto binaries suitable for tool so far -FE_COUNT=0 - -MAIN_COUNT=0 -PTHREAD_COUNT=0 -LOC_COUNT=0 - -PKG_URL_COUNT=0 -PKG_SIZE_COUNT=0 -PKG_DOWN_COUNT=0 - -for ((i=0; i pid-$I - -# ------------------------------------------------------------------------------ -# Progress - -print-progress() { - echo -e "($LSTART) $COUNT / $LSTOP ($TOTAL)\n" > $PROG - - echo "Packages at URL: $PKG_URL_COUNT" >> $PROG - echo "^ + size within bounds: $PKG_SIZE_COUNT" >> $PROG - echo -e "^ + package downloaded: $PKG_DOWN_COUNT\n" >> $PROG - - echo "Files within packages: $FILE_COUNT" >> $PROG - echo "^ + is a goto binary: $GB_COUNT" >> $PROG - echo "^ + main: $MAIN_COUNT" >> $PROG - echo "^ + pthread_create: $PTHREAD_COUNT" >> $PROG - echo "^ + loc size within bounds: $LOC_COUNT" >> $PROG - echo -e "^ + linking successful: $FE_COUNT\n" >> $PROG - - local i=0 - for ((i=0; i> $PROG - echo "$i timeout: ${TO_COUNT[$i]}" >> $PROG - echo "$i error: ${CRASH_COUNT[$i]}" >> $PROG - done -} - -# ------------------------------------------------------------------------------ -# Exploration - -# Download packages and perform checks (for all lines in $FILE_LIST) -for L in $FILES -do - print-progress - - echo -e "\n>>> PACKAGE: $L ($COUNT)\n" >> $INFO - - COUNT=$(($COUNT + 1)) - - # Produce URL and archive name - URL="$BEFORE$L$AFTER" - ARCHIVE="${L}.tar.bz2" - - # Check if archive exists - wget --spider -nv --timeout=60 "$URL" > /dev/null 2>&1 - if [ $? -ne 0 ]; then - echo "$L: package does not exist at URL (or network problems)" >> $INFO - continue - fi - - PKG_URL_COUNT=$(($PKG_URL_COUNT + 1)) - - ARCHIVE_SIZE=$(wget --spider --timeout=60 "$URL" 2>&1) - if [ $? -ne 0 ]; then - echo "$L: error on checking archive size" >> $INFO - continue - fi - ARCHIVE_SIZE=$(echo "$ARCHIVE_SIZE" | grep 'Length:' | sed -r \ - 's/(^Length: | \(.*$)//g') - natcheck "$ARCHIVE_SIZE" - if [ "$ARCHIVE_SIZE" -gt "$MAX_ARCHIVE_SIZE" ]; then - echo "$L: archive size exceeds maximum size" >> $INFO - continue - fi - - PKG_SIZE_COUNT=$(($PKG_SIZE_COUNT + 1)) - - wget -nv --timeout=60 "$URL" -O "$ARCHIVE" > /dev/null 2>&1 - if [ $? -ne 0 ]; then - echo "$L: download error" >> $INFO - rm -f "$ARCHIVE" - continue - fi - - PKG_DOWN_COUNT=$(($PKG_DOWN_COUNT + 1)) - - # Unpack archive - mkdir "$L" - if [ $? -ne 0 ]; then - echo "$L: cannot create dir for unpacking" >> $INFO - continue - fi - tar xj -C "$L" -f "$ARCHIVE" - if [ $? -ne 0 ]; then - echo "$L: cannot untar archive" >> $INFO - continue - fi - if [ ! -d "$L/goto-binaries" ]; then - echo "$L: unexpected dir" >> $INFO - continue - fi - - echo -e 'package ok\n' >> $INFO - - # Traverse files in package - PKGFILES=$(find "$L/goto-binaries" -type f) - for F in $PKGFILES - do - print-progress - - FILE_COUNT=$(($FILE_COUNT + 1)) - - file -m goto-magic "$F" 2>&1 | grep 'goto-binary' > /dev/null 2>&1 - # If file is a goto binary - if [ $? -eq 0 ]; then - - GB_COUNT=$(($GB_COUNT + 1)) - - # Size of the binary - SIZE=$(wc -c "$F" | cut -d ' ' -f 1) - natcheck $SIZE - if [ $SIZE -gt $MAX_GB_SIZE ]; then - echo "$L: $F: Goto binary exceeds maximum size" >> $INFO - continue - fi - - timeout -k 5 30 $GI --show-goto-functions "$F" > goto-functions-$I 2> \ - /dev/null - if [ $? -ne 0 ]; then - # Most likely out of memory (ignore this binary and go to next one) - echo "$L: $F: Cannot get goto functions" >> $INFO - continue - fi - - # Check if there is a main function (invocation) - egrep 'main[\ ]?((\([\ ]?\))|(\(.+,.+\)))' goto-functions-$I > /dev/null \ - 2>&1 - if [ $? -ne 0 ]; then - echo "$L: $F: No main()" >> $INFO - continue - fi - - MAIN_COUNT=$(($MAIN_COUNT + 1)) - - # Check if there is an invocation of pthread_create - egrep 'pthread_create[\ ]?\(.+,.+,.+,.+\)' goto-functions-$I > /dev/null \ - 2>&1 - if [ $? -ne 0 ]; then - echo "$L: $F: No pthread_create()" >> $INFO - continue - fi - - PTHREAD_COUNT=$(($PTHREAD_COUNT + 1)) - - # LoC - LOC=$(timeout -k 5 30 $GI --count-eloc "$F" 2> /dev/null) - if [ $? -ne 0 ]; then - echo "$L: $F: Error on counting LoC" >> $INFO - continue - fi - LOC=$(echo "$LOC" | tail -n 1 | cut -d ' ' -f 5) - natcheck "$LOC" - if [ $LOC -gt $MAX_LOC ]; then - echo "$L: $F: Goto binary LoC exceeds maximum" >> $INFO - continue - fi - - LOC_COUNT=$(($LOC_COUNT + 1)) - - # Change name (CBMC/goto-cc bug workaround) - mv "$F" "$F.gb" - F="$F.gb" - - # Link with pthreads lib - $GC -o "$F.linked" "$F" "$PTHREAD_LIB" - if [ $? -ne 0 ]; then - echo "$L: $F: Linking error, trying next pthread lib" >> $INFO - $GC -o "$F.linked" "$F" "$PTHREAD_LIB_ALT" - if [ $? -ne 0 ]; then - echo "$L: $F: Linking error, giving up" >> $INFO - continue - fi - fi - F="$F.linked" - - # Increment number of goto binaries suitable for tool - FE_COUNT=$(($FE_COUNT + 1)) - - echo "@@@ Running tools on $L: $F." >> $INFO - echo "@@@ LoC: $LOC" >> $INFO - echo "@@@ Binary size (in bytes): $SIZE" >> $INFO - - # ------------------------------------------------------------------------ - # Invoke tools - - TN1=$(($TN - 1)) - - # Running list - PIDS="" - - # Pid to idx - declare -A PM - - for ((i=0; i> ../$INFO - bash -c "ulimit -v $MAXMEM_FE; $INV" & - P=$! - PIDS="$PIDS $P" - PM[$P]=$i - cd .. - - # Continue if <= parallel factor and we have not invoked all - R=$(($R + 1)) - if [ $R -lt $FACTOR ] && [ $i -lt $TN1 ]; then - continue - fi - - while true; do - for P in $PIDS - do - kill -0 $P > /dev/null 2>&1 - if [ $? -ne 0 ]; then - wait $P - RET=$? - IDX=${PM[$P]} - # Attempt to kill process just to be sure - kill -9 $P > /dev/null 2>&1 - PIDS=$(echo "$PIDS" | sed "s/$P//g") - R=$(($R - 1)) - cd "inst-$IDX" - # Harvest results - if [ $RET -eq 0 ]; then - echo "@@@: Success on $F ($IDX) (return code 0)" >> ../$INFO - mv "$OUT.$IDX" ../success-$I - if [ -f results.txt ]; then - mv results.txt ../success-$I/"$OUT.$IDX.res" - fi - SUC_COUNT[$IDX]=$((${SUC_COUNT[$IDX]} + 1)) - else - echo "@@@: Failure on $F ($IDX) (return code $RET)" >> ../$INFO - mv "$OUT.$IDX" ../failure-$I - if [ $RET -eq 124 ] || [ $RET -eq 137 ]; then - TO_COUNT[$IDX]=$((${TO_COUNT[$IDX]} + 1)) - else - CRASH_COUNT[$IDX]=$((${CRASH_COUNT[$IDX]} + 1)) - fi - fi - cd .. - rm -rf "inst-$IDX" - print-progress - if [ $i -lt $TN1 ]; then - continue 3 - fi - if [ -z "${PIDS// /}" ]; then - break 2 - fi - fi - done - sleep 3 - done - done - - # ------------------------------------------------------------------------ - - else - echo "$L: $F: Not a goto binary" >> $INFO - fi # If file is a goto binary - done # For all files in package - - # Delete archive and unpacked files - if [ $KEEP -eq 0 ]; then - # Downloaded archive - rm -rf "$ARCHIVE" - # Directory were archive was unpacked to - rm -rf "$L" - fi - - # delete goto functions dumped by goto-instrument - rm -f goto-functions-$I - - if [ $STOP -eq 1 ]; then - break - fi -done - -# Cleanup before termination -rm -f goto-magic - -print-progress diff --git a/src/musketeer/experiments/goto-runner/pkgs-jenkins-all b/src/musketeer/experiments/goto-runner/pkgs-jenkins-all deleted file mode 100644 index 845a1ba975a..00000000000 --- a/src/musketeer/experiments/goto-runner/pkgs-jenkins-all +++ /dev/null @@ -1,17214 +0,0 @@ -0ad -0ad-data -2ping -2vcard -389-adminutil -389-console -3dchess -3depict -4digits -4g8 -4store -6tunnel -7kaa -7kaa-data -9base -9menu -9wm -a2jmidid -a2ps -a52dec -a56 -a7xpg -aa3d -aac-tactics -aafigure -aalib -aaphoto -abacas -abcde -abcm2ps -abcmidi -abe -abgate -abicheck -abi-compliance-checker -abind -abinit -abiword -abntex -abook -abootimg -abr2gbr -abraca -abtransfers -accerciser -access-modifier-checker -accessodf -accountsservice -acct -ace -acedb -acegi-security -ace-of-penguins -aces3 -acetoneiso -acfax -acheck -acheck-rules -acheck-rules-fr -achilles -ack -ack-grep -acl -acl2 -aclock.app -acm -aconnectgui -acorn-fdisk -acoustid-fingerprinter -acpi -acpica-unix -acpid -acpidump -acpi-support -acpitail -acpitool -acr38 -acsccid -actdiag -actionaz -activemq -activemq-activeio -activemq-protobuf -activity-log-manager -activiz.net -adabrowse -adacgi -adacontrol -ada-reference-manual -adasockets -adblock-plus -adblock-plus-element-hiding-helper -addresses-for-gnustep -adduser -adios -adjtimex -adlint -admesh -adminer -adns -adolc -adonthell -adonthell-data -adplay -adplug -adun.app -advancecomp -advene -advi -adzapper -aegis -aegisub -aeolus -aephea -aes2501-wy -aesfix -aeskeyfind -aeskulap -aespipe -aether -aewan -aewm -aewm++ -aewm++-goodies -affiche -afflib -afnix -aft -afterstep -afuse -agave -agda -agda-bin -agda-stdlib -agedu -agenda.app -agg -aggregate -aghermann -aglfn -agtl -aha -ahcpd -ahven -aiccu -aide -aiksaurus -airport-utils -airstrike -aisleriot -ajaxterm -aj-snapshot -akonadi -akonadi-googledata -akuma -alacarte -alarm-clock -alarm-clock-applet -albatross -aldo -ale -alembic -alevt -alex -alex4 -alglib -algol68g -algotutor -alice -alien -alien-arena -alienblaster -alien-hunter -aliki -allegro4.4 -alleyoop -alliance -all-in-one-sidebar -all-knowing-dns -alltray -almanah -alpine -alqalam -alsa-base -alsaequal -alsa-lib -alsamixergui -alsa-oss -alsaplayer -alsa-plugins -alsa-tools -alsa-utils -alsoft-conf -alt-ergo -altermime -alt-key -altree -alure -amanda -amap-align -amarok -amavisd-milter -amavisd-new -ambdec -amb-plugins -amide -amideco -amiga-fdisk -amispammer -amoeba -amoebax -amora-server -ampache-themes -amphetamine -amphetamine-data -ample -ampliconnoise -ampsharp -amrita2 -ams -amsynth -amtterm -amule -amule-emc -am-utils -an -anacron -analitza -analog -anarchism -and -anet -angband -angband-doc -angrydd -animals -animal-sniffer -anjuta -anjuta-extras -anki -ann -anna -annotation-indexer -anon-proxy -ant -ant-contrib -antelope -antennavis -anthy -antigrav -antiword -antlr -antlr3 -antlr-maven-plugin -ant-phone -ants -anubis -anypaper -anyremote -anyremote2html -anything-el -anytun -aoetools -aoeui -aolserver4 -aolserver4-nsldap -aolserver4-nsmysql -aolserver4-nsopenssl -aolserver4-nspostgres -aolserver4-nssha1 -aolserver4-nssqlite3 -aolserver4-nsxml -apache2 -apache-log4j1.2 -apache-mime4j -apache-mod-auth-ntlm-winbind -apache-pom -apachetop -apache-upload-progress-module -apbs -apcalc -apcupsd -apel -apertium -apertium-dbus -apertium-en-ca -apertium-en-es -apertium-eo-ca -apertium-eo-es -apertium-es-ca -apertium-es-gl -apertium-es-pt -apertium-es-ro -apertium-eu-es -apertium-fr-ca -apertium-fr-es -apertium-oc-ca -apertium-oc-es -apertium-pt-ca -apertium-pt-gl -apertium-tolk -apf -apf-firewall -apg -apgdiff -apipkg -aplus-fsf -apmd -apng2gif -apoo -apparix -apparmor -appconfig -apper -app-install-data -appmenu-qt -approx -apq -apq-postgresql -apr -apron -aprsd -aprsdigi -apr-util -apsfilter -apt -apt-build -apt-cacher -apt-cacher-ng -apt-clone -aptdaemon -apt-dater -apt-dpkg-ref -apt-file -apt-forktracer -aptfs -apticron -aptitude -apt-listbugs -apt-listchanges -apt-mirror -apt-move -apt-offline -aptoncd -apt-p2p -apt-rdepends -apt-setup -aptsh -apt-show-source -apt-show-versions -apt-spacewalk -apt-spy -apt-src -apt-transport-debtorrent -apt-watch -apt-xapian-index -apt-zip -ap-utils -apvlv -apwal -aqemu -aqsis -aqualung -ara -arandr -aranym -arbtt -arc -archivemail -archivemount -archmage -archmbox -ardentryst -ardesia -ardour -arduino -arduino-mk -arename -argparse -args4j -argtable2 -argus -argus-client -argvalidate -argyll -aria2 -aribas -ario -arista -arj -ark -armada-backlight -armadillo -armagetronad -arno-iptables-firewall -aroarfw -arora -arpack -arpack++ -arpalert -arping -arpon -arp-scan -arptables -arpwatch -array-info -artha -as31 -asc -ascd -ascdc -ascii -ascii2binary -asciidoc -asciijump -asciimathtml -asciio -asclock -asc-music -asedriveiiie -asio -asis -asm -asm2 -asm3 -asmail -asmix -asmixer -asmon -asp -aspcud -aspectc++ -aspectj -aspell -aspell-am -aspell-ar -aspell-ar-large -aspell-bn -aspell-br -aspell-cs -aspell-cy -aspell-el -aspell-en -aspell-fa -aspell-fr -aspell-ga -aspell-gu -aspell-he -aspell-hi -aspell-hr -aspell-hsb -aspell-hu -aspell-hy -aspell-is -aspell-it -aspell-kk -aspell-kn -aspell-ku -aspell-ml -aspell-mr -aspell-or -aspell-pa -aspell-pl -aspell-pt -aspell-ro -aspell-sk -aspell-sl -aspell-sv -aspell-ta -aspell-te -aspell-tl -aspell-uz -aspic -asql -asr-manpages -assaultcube -assimp -assogiate -asterisk -asterisk-core-sounds -asterisk-espeak -asterisk-flite -asterisk-moh-opsound -asterisk-prompt-de -asterisk-prompt-es-co -asterisk-prompt-fr-armelle -asterisk-prompt-fr-proformatique -asterisk-prompt-it -asterisk-prompt-se -astronomical-almanac -astyle -asunder -asused -aswiki -asylum -asymptote -async-http-client -at -atanks -atari800 -atdgen -aterm -atftp -atheist -athena-jot -atinject-jsr330 -atk1.0 -atkmm1.6 -atlas -atlas-cpp -atlc -atom4 -atomicparsley -atomix -atool -atop -atoppatch -atp -atris -atsar -ats-lang-anairiats -at-spi -at-spi2-atk -at-spi2-core -attal -attal-themes -attica -attr -aubio -auctex -audacious -audacious-dumb -audacious-plugins -audacity -audex -audiofile -audiolink -audiopreview -audioread -audit -audtty -aufs-tools -augeas -aumix -auralquiz -auth2db -authbind -authres -auto-apt -autoclass -auto-complete-el -autoconf -autoconf2.13 -autoconf2.59 -autoconf2.64 -autoconf-archive -autoconf-dickey -autoconf-gl-macros -autocutsel -autodia -autodir -autodns-dhcp -autodocksuite -autodock-vina -autofill-forms -autofs -autogen -auto-install-el -autojump -autokey -autolog -automake -automake1.10 -automake1.11 -automake1.9 -automatic-save-folder -automaton -automoc -auto-multiple-choice -automysqlbackup -autopkgtest -autopostgresqlbackup -autoproject -autopsy -autorenamer -autorun4linuxcd -autossh -autotalent -autotools-dev -autotrace -autotrash -autounit -avahi -avahi-sharp -avalon-framework -avarice -avbin -avce00 -avfs -aview -avifile -avinfo -avogadro -avra -avrdude -avr-evtd -avr-libc -avrp -avrprog -awardeco -away -aweather -awesfx -awesome -awesome-extra -awffull -awl -awstats -ax25-tools -axel -axiom -axis -ayaspell-dic -aylet -ayttm -azr3-jack -azureus -b43-fwcutter -babel -babeld -babiloo -babl -backbone -backintime -backport-util-concurrent -backup2l -backup-manager -backupninja -backuppc -bacula -bacula-doc -balance -balazar3 -balazarbrothers -balder2d -ball -ballz -balsa -bam -bamf -bandwidthcalc -bandwidthd -bangarang -banshee -banshee-community-extensions -baobab -bar -barada-pam -barcode -bareftp -barnowl -barrage -barry -base-files -base-installer -basemap -basenji -base-passwd -basex -bash -bashburn -bash-completion -bashdb -basic256 -basilisk2 -basket -bastet -batctl -batik -batmand -batmon.app -battery-stats -battleball -bauble -baycomepp -baycomusb -bb -bbdb -bbe -bbmail -bbpager -bbrun -bbtime -bc -bcel -bcfg2 -bchunk -bcpp -bcron -bdfresize -beaker -beancounter -beansbinding -beanstalkd -beast -beautifulsoup -beautifulsoup4 -beav -bedtools -beecrypt -beef -beep -beets -belier -beneath-a-steel-sky -berusky -berusky-data -bespin -betaradio -between -bfbtester -bfm -bf-utf -bglibs -bgoffice -bgoffice-computer-terms -bgoffice-dict-downloader -bhl -biabam -bibclean -bibcursed -biber -biblatex -biblatex-dw -bibledit-bibletime -bibledit-gtk -bibledit-xiphos -bible-kjv -bibletime -bibtex2html -bibtexconv -bibtool -bibus -bibutils -bicyclerepair -bidentd -bidiui -bidiv -biff -big-cursor -billard-gl -biloba -binclock -bind9 -bindex -bindfs -bindgraph -binfmtc -binfmt-support -bing -biniax2 -biniou -binkd -bino -bin-prot -bins -binstats -binutils -binutils-avr -binutils-h8300-hms -binutils-m68hc1x -binutils-mingw-w64 -binutils-msp430 -binutils-z80 -bio2jack -biococoa -biofox -biogenesis -biojava3-live -biojava-live -biomaj -biomaj-watcher -bioperl -bioperl-run -biosig4c++ -biosquid -bip -bird -birthday -bisho -bison -bison++ -bisonc++ -bist -bitlbee -bitmap-mule -bitmeter -bitops -bitpim -bitstormlite -bitstream -bittornado -bittorrent -bjsonrpc -bkchem -bkhive -blackbox -black-box -blackbox-themes -blacs-mpi -blacs-pvm -blahtexml -blam -blas -blazeblogger -blcr -bld -bleachbit -blender -blends -blepvco -bless -bley -blhc -blinken -bliss -blist -blitz++ -blktap -blktap-dkms -blktool -blktrace -blobandconquer -blobby -bloboats -blobwars -blockattack -blockdiag -blockout2 -blocks-of-the-undead -blop -blosxom -blt -bluedevil -bluefish -blueman -bluemindo -bluemon -blueproximity -bluetile -bluewho -bluez -bluez-hcidump -bluez-tools -bmagic -bmf -bml -bmon -bnd -bnfc -boa -boa-constructor -boats -bobcat -bobo -bobot++ -bochs -bodr -bogl -bognor-regis -bogofilter -boinc -bokken -bombardier -bomberclone -bomstrip -bonnie++ -boo -bookletimposer -bookview -boolector -boolstuff -boost1.49 -boost-defaults -boot -bootcd -bootchart -bootchart2 -booth -boot-info-script -bootp -bootpc -bopm -bordeaux-threads -bosh -boswars -botan1.10 -bottlerocket -bouncy -bouncycastle -bowtie -bowtie2 -box2d -boxbackup -boxes -boxshade -bozohttpd -bplay -bppphyview -bppsuite -bpython -brag -brailleutils -brandy -brasero -brewtarget -brian -brickos -bridge-method-injector -bridge-utils -brightside -briquolo -br.ispell -bristol -brltty -browser-history -brp-pacu -brutalchess -brutefir -bs2b-ladspa -bsaf -bsd-finger -bsdgames -bsdiff -bsd-mailx -bsdmainutils -bsfilter -bsh -bsl -bsnes -btag -btanks -bterm-unifont -bti -btrfs-tools -btscanner -btyacc -bubbros -bucardo -buddy -buffer -buffy -buffycli -bugsquish -bugz -buici-clock -buildapp -buildbot -buildbot-slave -build-essential -build-helper-maven-plugin -buildtorrent -bulletml -bum -bumprace -bundler -bup -burgerspace -burn -burp -busybox -buthead -buxon -buzztard -bvi -bwa -bwbar -bwbasic -bwidget -bwm-ng -byacc -byacc-j -bygfoot -byobu -bytecode -byzanz -bzflag -bzip2 -bzr -bzr-builddeb -bzr-cvsps-import -bzr-dbus -bzr-email -bzr-explorer -bzr-fastimport -bzr-git -bzr-grep -bzr-gtk -bzr-loom -bzr-pipeline -bzr-rewrite -bzr-search -bzr-stats -bzr-svn -bzrtools -bzr-upload -bzr-xmloutput -c2050 -c2esp -c2hs -c3p0 -cabal-debian -cabextract -cableswig -ca-certificates -ca-certificates-java -cachefilesd -cacti -cacti-spine -cadabra -cadaver -cadencii -cadubi -cain -cairo -cairo-5c -cairo-clock -cairodevice -cairo-dock -cairo-dock-plug-ins -cairomm -cairo-ocaml -cairosvg -cakephp -cakephp-instaweb -cal -cal3d -calabash -calamaris -calcoo -calcurse -calendar -calendarserver -calf -calibre -calife -calligra -calligra-l10n -calligra-transitional -cam -cameleon -camera.app -cameramonitor -caml2html -camlbz2 -camlidl -camlidl-doc -camlimages -camljava -camlmix -camlp5 -camltemplate -camlzip -camomile -camorama -camping -canlock -canna -canna-shion -c++-annotations -canto -cantor -capi4hylafax -capistrano -cappuccino -caps -car -cardstories -c-ares -caret -carettah -caribou -carmetal -carton -caspar -castle-combat -castor -catcodec -catdoc -catdvi -catfish -catools -catwalk -cavezofphear -cb2bib -cba -cbedic -cbflib -cbios -cbm -cbmc -cbmplugs -cbrpager -cc1111 -ccache -ccbuild -cccc -cccd -ccd2iso -ccfits -ccid -cciss-vol-status -cclib -cclive -ccontrol -cconv -c-cpp-reference -ccrypt -ccseapps -cctools -ccze -cd5 -cdargs -cdbackup -cdbs -cdcat -cdcd -cd-circleprint -cdck -cdcover -cdde -cd-discid -cddlib -cde -cdebconf -cdebconf-entropy -cdebconf-terminal -cdebootstrap -cdecl -cd-hit -cdi-api -cdk -cdlabelgen -cdo -cdparanoia -cdpr -cdrdao -cdrkit -cdrom-checker -cdrom-detect -cdrom-retriever -cdtool -cduce -cdw -cecil -cecil-flowanalysis -cecilia -cedar-backup2 -ceferino -cegui-mk2 -celery -celestia -cellwriter -cenon.app -centerim -cereal -cerealizer -cernlib -certificatepatrol -certmonger -ceve -cfengine2 -cfengine3 -cffi -cfflib -cfget -cfi -cfingerd -cfitsio3 -cflow -cfortran -cfourcc -cfv -cgal -cgdb -cgiemail -cgi-extratags-perl -cgilib -cglib -cgoban -cgsi-gsoap -cgvg -chaksem -chalow -chameleon-cursor-theme -changetrack -chaosreader -charactermanaj -chardet -charls -charmap.app -charybdis -chase -chasen -check -checkbot -checkgmail -checkinstall -check-mk -checkpolicy -check-postgres -checkpw -checksecurity -checkstyle -cheese -cheetah -chef -chef-expander -chef-server-api -chef-solr -chemeq -chemfp -chemical-mime-data -chemical-structures -chemtool -cherrypy3 -cherrytree -chewmail -chiark-tcl -chiark-utils -chicken -childsplay -childsplay-alphabet-sounds-bg -childsplay-alphabet-sounds-ca -childsplay-alphabet-sounds-de -childsplay-alphabet-sounds-el -childsplay-alphabet-sounds-en-gb -childsplay-alphabet-sounds-es -childsplay-alphabet-sounds-fr -childsplay-alphabet-sounds-it -childsplay-alphabet-sounds-nb -childsplay-alphabet-sounds-nl -childsplay-alphabet-sounds-pt -childsplay-alphabet-sounds-ro -childsplay-alphabet-sounds-ru -childsplay-alphabet-sounds-sl -childsplay-alphabet-sounds-sv -chimera2 -chipmunk -chipw -chirp -chise-base -chkconfig -chkrootkit -chktex -chm2pdf -chmlib -chmsee -chntpw -chocolate-doom -choose-mirror -choosewm -choqok -chordii -chromaprint -chromium-browser -chromium-bsu -chron -chronicle -chrony -chrootuid -chrpath -chuck -cia-clients -c-icap -c-icap-modules -cicero -ciderwebmail -cifs-utils -cil -cimg -cinfony -ciphersaber -cipux -cipux-cat-web -cipux-dog -cipux-object -cipux-passwd -cipux-rbac-simple -cipux-rpc -cipux-rpc-client -cipux-storage -cipux-task -circos -circos-tools -circuits -circuslinux -citadel -cjet -cjk -ckanclient -ckeditor -ckermit -ckport -cksfv -cl-alexandria -clalsadrv -clam -clamassassin -clamav -clamav-unofficial-sigs -clam-chordata -clam-networkeditor -clamsmtp -clamtk -clamz -clang -clanlib -cl-asdf -clasp -classworlds -cl-awk -clawsker -claws-mail -claws-mail-extra-plugins -claws-mail-themes -cl-babel -cl-base64 -clc-intercal -cl-closer-mop -cl-cluck -cl-clx-sbcl -cl-contextl -cldump -clean-crypto -clearlooks-phenix-theme -clearsilver -clementine -clex -cl-fftw3 -cl-flexichain -clfswm -cl-ftp -cl-getopt -clhep -cl-hyperobject -cli-common -clif -clinica -cliofetion -clipf -clipit -clippoly -clips -clips-doc -cliquer -cl-irc -cl-irc-logger -clirr -clirr-maven-plugin -clisp -clive -cl-kmrcl -cl-launch -cl-lexer -cl-lml -cl-lml2 -cl-lw-compat -cl-mcclim -cl-md5 -cl-modlisp -cln -cloc -clock-setup -clojure1.2 -clojure1.4 -clojure-contrib -clojure-maven-plugin -clonalframe -cloog -cloog-ppl -cloop -clp -cl-pg -cl-photo -cl-pipes -cl-plplot -cl-portable-aserve -cl-postoffice -cl-ppcre -cl-ptester -cl-pubmed -cl-puri -cl-regex -cl-reversi -cl-rlc -cl-rsm-mod -cl-rss -cl-rt -cl-salza -cl-spatial-trees -cl-split-sequence -cl-sql -clthreads -cltl -clucene-core -clucy -cl-uffi -cl-umlisp -cl-umlisp-orf -cl-usocket -clustalo -clustalw -clustalx -cluster -cluster-agents -cluster-glue -clustershell -clusterssh -clutter-1.0 -clutter-gesture -clutter-gst -clutter-gtk -clutter-imcontext -clutter-sharp -clxclient -cl-xlunit -cl-xmls -cl-xptest -clzip -cmake -cmatrix -cmd2 -cmdpack -cmdtest -cmigemo -cmigrep -cminpack -cmip5-cmor-tables -cmor -cmospwd -cmph -cm-super -cmt -cmtk -cmucl -cmus -cnf -cntlm -coala -cobertura -cobertura-maven-plugin -coccinella -coccinelle -coco-cpp -coco-cs -coco-doc -coco-java -code2html -codeblocks -codecgraph -codegroup -codemirror-js -codenarc -coderay -code-saturne -codespeak-lib -codetools -codeville -codfis -cogl -coherence -coils -coin3 -coinor-cbc -coinor-cgl -coinor-csdp -coinor-dylp -coinor-flopc++ -coinor-ipopt -coinor-osi -coinor-symphony -coinor-vol -coinst -coinutils -coldfire -colibri -collabtive -collatinus -collectd -collections15 -collectl -collectl-utils -colorblind -colorchooser -colorcode -colord -colordiff -colorgcc -colorhug-client -colormake -colorname -colorpicker -colortail -colortest -colortest-python -colrconv -combat -comedilib -comgt -comix -comixcursors -command-not-found -commando -command-runner-applet -commit-patch -common-lisp-controller -commons-beanutils -commons-configuration -commons-csv -commons-daemon -commons-exec -commons-httpclient -commons-io -commons-javaflow -commons-jci -commons-math -commons-parent -commons-pool -commons-vfs -compactheader -comparepdf -compartment -compass-fancy-buttons-plugin -compass-h5bp-plugin -compass-layoutgala-plugin -compass-slickmap-plugin -compass-susy-plugin -compass-yui-plugin -compiz-fusion-bcop -composite -comprez -concalc -concordance -concurrent-dfsg -condor -conduit -cone -confclerk -confget -config-manager -configobj -config-package-dev -configshell -configure-debian -confluence -confuse -congruity -conkeror -conky -conky-all -connectagram -connectomeviewer -connect-proxy -connman -conntrack -conque -cons -console-braille -console-common -console-cyrillic -console-data -consolekit -console-log -console-setup -console-tools -conspy -contacts -context -contextfree -context-modules -controlaula -convertall -convlit -convmv -cook -cookie-monster -cookietool -coolkey -coolmail -copyfs -copyright-update -coq -coq-float -coreutils -coriander -corkscrew -corosync -cortado -cortina -cothreads -couchdb -courier -courier-authlib -courier-filter-perl -couriergraph -couriergrey -courierpassd -covered -cowbell -cowdancer -cowsay -cp2k -cpan-listchanges -cpanminus -cpio -cpipe -cpl -cplay -cpm -cpmtools -cppcheck -cpphs -cppo -cpptasks -cppunit -cpputest -cpqarrayd -cproto -cpu -cpuburn -cpufreqd -cpufrequtils -cpuid -cpulimit -cpuset -cpushare -cqrlib -cqrlog -crack -crack-attack -cracklib2 -crafty-bitmaps -crafty-books-medium -crafty-books-medtosmall -crafty-books-small -cramfs -cramfsswap -crash -crashmail -crashme -crasm -crawl -crda -cream -createrepo -create-resources -creepy -creoleparser -c-repl -cricket -crimson -crip -criticalmass -critterding -crm114 -cron -cron-apt -cron-deja-vu -cronolog -cronometer -cronutils -crossfire -crossfire-client -crossfire-client-images -crossfire-client-sounds -crossfire-maps -crossfire-maps-small -crosshurd -crossroads -crtmpserver -cruft -cryptcat -crypt++el -cryptgps -cryptkeeper -cryptmount -cryptokit -cryptsetup -crystalcursors -crystalhd -cscope -csh -c-sig -csmash -csmash-demosong -csound -csound-manual -cssc -cssed -css-mode -cssparser -csstidy -cssutils -cstocs -cstream -csv2latex -csync2 -ctapi -ctdb -ctemplate -cthumb -ctioga2 -ctn -ctn-doc -ctorrent -ctpl -ctsim -ctwm -cuba -cube2font -cubictemp -cucumber -cudf -cue2toc -cuetools -culmus -culmus-fancy -cultivation -cunit -cup -cups -cups-filters -cups-pdf -cups-pk-helper -cupt -curl -curlftpfs -curtain -curves -customdeb -custom-tab-width -cutecom -cutesdr -cutils -cutter -cutter-testing-framework -cutycapt -cuyo -cvc3 -cvector -cvm -cvs -cvs2cl -cvs2html -cvs2svn -cvs-autoreleasedeb -cvs-buildpackage -cvschangelogbuilder -cvsconnect -cvsd -cvsdelta -cvsgraph -cvs-mailcommit -cvsps -cvssuck -cvs-syncmail -cvstrac -cvsutils -cvsweb -cvxopt -cwdaemon -cweb-latex -cwebx -cwidget -cwiid -cwirc -cxref -cxxtest -cxxtools -cycfx2prog -cyclades-serial-client -cycle -cynthiune.app -cyrus-imapd-2.4 -cyrus-imspd -cyrus-sasl2 -cytadela -cython -d2to1 -d52 -daa2iso -dacco -dacs -dact -dactyl -dadadodo -daemon -daemonfs -daemonlogger -daemontools -dahdi-linux -dahdi-tools -dailystrips -daisy-player -dajaxice -dancer-ircd -dancer-xml -dangen -dans-gdal-scripts -dansguardian -dante -dapl -daptup -daq -dar -darcs -darcsum -darcsweb -dares -darkice -darkplaces -darksnow -darkstat -darktable -darnwdl -darts -dash -dasher -das-watchdog -datapm -date -datefudge -dates -davfs2 -davical -dav-text -dawgdic -db -db1-compat -db4.7 -db4.8 -db4o -dbacl -dballe -dbar -dbconfig-common -db-defaults -dbeacon -dbench -dbf -dbf2mysql -dbi -dbix-easy-perl -dblatex -dbmix -dbs -dbskkd-cdb -dbtoepub -dbus -dbusada -dbus-c++ -dbus-glib -dbus-java -dbus-python -dbus-sharp -dbus-sharp-glib -dbview -dc3dd -dcap -dcfldd -dclock -dcmtk -d-conf -dc-qt -dcraw -dctrl2xml -dctrl-tools -dd2 -ddccontrol -ddccontrol-db -ddclient -ddd -ddir -ddns3-client -ddpt -dds -dds2tar -ddskk -ddtc -deal -dealer -deap -debarchiver -debaux -debbugs -debconf -debconf-kde -debdelta -debfoster -debget -deb-gview -debhelper -debian-archive-keyring -debian-builder -debianbuttons -debian-cd -debiandoc-sgml -debiandoc-sgml-doc -debiandoc-sgml-doc-pt-br -debian-edu -debian-edu-archive-keyring -debian-edu-artwork -debian-edu-config -debian-edu-doc -debian-edu-install -debian-faq -debian-gis -debian-goodies -debian-handbook -debian-history -debian-installer -debian-installer-launcher -debian-installer-netboot-images -debian-installer-utils -debian-junior -debian-keyring -debian-med -debian-policy -debian-ports-archive-keyring -debian-reference -debian-science -debian-timeline -debianutils -debian-xcontrol -debian-zh-faq -debichem -debirf -debmirror -debnest -debomatic -debootstrap -deborphan -debpartial-mirror -debpear -debram -debroster -debsecan -debsig-verify -debsums -debtags -debtorrent -debtree -decibel-audio-player -decoratortools -dee -deejayd -deets -defendguin -deja-dup -dejagnu -deliciousapi -delimmatch -delta -deluge -denemo -deng -denyhosts -depqbf -deps -derivations -desklaunch -deskmenu -desktop-base -desktop-file-utils -desktopnova -desktop-profiles -desmume -desproxy -detox -deutex -devede -develock-el -developers-reference -devhelp -device3dfx -device-tree-compiler -devil -devilspie -devilspie2 -devio -devscripts -devtodo -dfc -d-feet -dff -dfo -dfu-programmer -dfu-util -dh-ada-library -dh-autoreconf -dh-buildinfo -dhcpcd -dhcpcd5 -dhcpcd-dbus -dhcpcd-ui -dhcpdump -dhcp-helper -dhcping -dhcp-probe -dh-di -dhelp -dhex -dh-exec -dhis-client -dhis-dns-engine -dhis-mx-sendmail-engine -dhis-server -dhis-tools-dns -dh-kpatches -dh-linktree -dh-lisp -dh-lua -dh-make -dh-make-drupal -dh-make-perl -dh-make-php -dh-ocaml -di -dia -dia2code -diagnostics -diakonos -dialign -dialign-t -dialog -dia-newcanvas -dia-shapes -dibbler -dicelab -dico -dicom3tools -dicomnifti -dicompyler -dicomscope -dict-bouvier -dictclient -dictconv -dictd -dict-devil -dictdlib -dict-elements -dictem -dict-foldoc -dict-gazetteer2k -dict-gcide -diction -dictionaries-common -dictionary-el -dict-jargon -dict-moby-thesaurus -didiwiki -didjvu -dieharder -diet -dietlibc -diffmon -diffpdf -diffstat -diffuse -diffutils -diggler -digikam -digitemp -dillo -dimbl -dime -di-netboot-assistant -ding -ding-libs -dino -diod -diploma -dipy -dir2ogg -dirac -dircproxy -dirdiff -directfb -directoryassistant -directvnc -dirmngr -dirvish -dis51 -disc-cover -discount -discover -discover-data -discus -dish -disk-manager -disktype -disper -display-dhammapada -dispmua -dissy -dist -distcc -distorm64 -distribute -distro-info -distro-info-data -disulfinder -ditaa -dita-ot -d-itg -ditrack -ditz -diveintopython -diveintopython3 -diveintopython-zh -divxcomp -dizzy -djagios -django-adminaudit -django-ajax-selects -django-app-plugins -django-auth-ldap -django-authority -django-celery -django-classy-tags -django-countries -django-dajax -django-evolution -django-extra-views -django-filter -django-floppyforms -django-genshi -django-markupfield -django-nose -django-notification -django-openid-auth -django-pagination -django-picklefield -django-reversion -django-sekizai -django-tables -django-tastypie -django-threaded-multihost -djmount -djtools -djview4 -djvulibre -djvusmooth -dkg-handwriting -dkimproxy -dkimpy -dkms -dkopp -dl10n -dlint -dlocate -dlz-ldap-enum -dmake -dmalloc -dmapi -dmaths -dmg2img -dmidecode -dmitry -dmraid -dmtcp -dmucs -dmz-cursor-theme -dnprogs -dns2tcp -dns323-firmware-tools -dns-browse -dns-flood-detector -dnshistory -dnsjava -dnsmasq -dnsproxy -dnspython -dnspython3 -dnsruby -dnssec-tools -dnstop -dnstracer -dnswalk -doc-base -docbook -docbook2odf -docbook2x -docbook5-xml -docbook-defguide -docbook-dsssl -docbook-dsssl-doc -docbook-ebnf -docbook-html-forms -docbook-mathml -docbook-simple -docbook-slides -docbook-slides-demo -docbook-to-man -docbook-utils -docbook-website -docbook-xml -docbook-xsl -docbook-xsl-doc -docbook-xsl-saxon -doc-central -doc-debian -doc-debian-es -doc-debian-fr -docdiff -docker -docky -doclifter -doc-linux-fr -doc-linux-hr -doc-linux-ja -doc-linux-pl -doconce -docsis -doctorj -doctrine -docvert -docx2txt -dogtail -dojo -dokuwiki -dolfin -dom4j -donkey -doodle -dopewars -dos2unix -dosage -dosbox -doscan -doschk -dose2 -dose3 -dosemu -dosfstools -dossizola -dot2tex -dotconf -dot-forward -dotlrn -dots -dotur -douf00 -dov4l -dovecot -dovecot-antispam -downthemall -downtimed -doxia -doxia-maven-plugin -doxia-sitetools -doxygen -doxymacs -doxypy -dozzaqueux -dpatch -dphys-config -dphys-swapfile -dpkg -dpkg-awk -dpkg-cross -dpkg-repack -dpkg-sig -dpkg-www -dpsyco -d-push -dput -draai -drac -dracut -dradio -dragbox -d-rats -drawmap -drawterm -drawtiming -drawtk -drawxtl -drbd8 -drbdlinks -drbl -drc -dreamchess -dreampie -drgeo -drgeo-doc -driconf -driftnet -drivel -drizzle -drmaa -drobo-utils -dropbear -drpython -drraw -drslib -drupal7 -drush -dsbltesters -dsc-statistics -dsdo -dsdp -dsh -d-shlibs -dsniff -dspam -dssi -dssp -dstat -dsyslog -dtach -dtaus -dtc-xen -dtrx -duff -dulwich -duma -dumbster -dump -dumpasn1 -dumpet -dune-common -dune-geometry -dune-grid -dune-istl -dune-localfunctions -dunst -duo-unix -duplicity -dupload -duply -durep -dutch -dv4l -dvbackup -dvbcut -dvblast -dvbsnoop -dvbstream -dvbstreamer -dvbtune -dvcs-autosync -dvdauthor -dvdbackup -dvdisaster -dvd+rw-tools -dvdtape -dvgrab -dvhtool -dvi2dvi -dvi2ps -dvi2ps-fontdata -dvi2ps-fontdesc-morisawa5 -dvidvi -dvipng -dvipost -dvips-fontdata-n2bk -dvipsk-ja -dvorak7min -dvswitch -dvtm -dwarfutils -dwarves-dfsg -dwb -dwdiff -dwm -dwoo -dwww -dwz -dx -dxflib -dxpc -dxsamples -dynagen -dynalang -dynalogin -dynamite -dynare -dyndns -dzen2 -e00compr -e2fsprogs -e2ps -e2tools -e2undel -e2wm -e3 -eancheck -ears -easychem -easyconf -easy-format -easygit -easyh10 -easymock -easymp3gain -easypg -easyspice -easytag -easyzone -eb -eblook -ebnetd -eboard -eboard-extras-pack1 -ebook-speaker -ebook-tools -ebtables -ebumeter -ebview -ecaccess -ecasound -ecb -echolot -echoping -ecj -ecl -eclipse -eclipse-anyedit -eclipse-cdt -eclipse-cdt-pkg-config -eclipse-egit -eclipse-emf -eclipse-gef -eclipselink -eclipse-linuxtools -eclipse-mercurialeclipse -eclipse-mylyn -eclipse-rse -ecore -ecryptfs-utils -ed -ed2k-hash -edac-utils -edb -edbrowse -edbus -edenmath.app -edfbrowser -edict -edict-el -editline -editmoin -editobj -editra -edje -edos-debcheck -eeepc-acpi-scripts -eegdev -eekboek -eep24c -eet -efax -efax-gtk -effects -efibootmgr -eficas -efingerd -efi-reader -eflite -efp -efreet -efte -egenix-mx-base -egg -eggdrop -eglibc -ehcache -eiciel -eigen2 -eigen3 -eigenbase-farrago -eigenbase-resgen -eina -einstein -eiskaltdcpp -ejabberd -eject -ekeyd -ekg -ekg2 -ekiga -elastix -eldav -electric -electric-fence -electricsheep -elektra -elementary -elementtidy -elfrc -elfutils -el-get -elib -elib.intl -elida -elilo -elinks -eliom -elixir -elk -elki -elmerfem -elscreen -elserv -elvis -elvis-tiny -elyxer -elza -emacs23 -emacs-calfw -emacs-chess -emacs-defaults -emacsen-common -emacs-goodies-el -emacs-jabber -emacspeak -emacs-window-layout -email2trac -email-reminder -embassy-domainatrix -embassy-domalign -embassy-domsearch -ember -ember-media -emboss -emboss-explorer -embryo -emdebian-archive-keyring -emdebian-crush -emdebian-grip -emelfm2-svg-icons -emerillon -emesene -emma -emma-coverage -emms -emoslib -empathy -empire -empire-hub -empire-lafe -empty-expect -empy -emu8051 -enblend-enfuse -enca -encfs -enchant -enemies-of-carlotta -enemylines3 -enemylines7 -enet -engauge-digitizer -engine-pkcs11 -enigma -enigmail -enna -enscribe -enscript -ensymble -ent -entagged -enum -envstore -eog -eog-plugins -eo-spell -eot-utils -epcr -epdfview -eperl -epic4 -epic4-help -epic5 -epigrass -epiphany -epiphany-browser -epiphany-extensions -episoder -epix -epm -epoptes -epr-api -epsilon -epson-inkjet-printer-escpr -epstool -epwutil -epydoc -epylog -eq10q -eql -eqonomize -equivs -erc -eric -eris -erlang -erm -eruby -esdl -esekeyd -esix -esmtp -esniper -esorex -esound -espa-nol -espctag -espeak -espeakedit -espeak-gui -espeakup -esperanza -espresso -ess -essays1743 -estic -esys-particle -etckeeper -eterm -etherape -etherpuppet -etherwake -ethos -ethstats -ethstatus -ethtool -etk.docking -etktab -etl -etoile -etoolbox -etsf-io -etw -e-uae -euca2ools -eukleides -euler -eurephia -evas -event-dance -eventlog -eventstat -evernote-mode -evilvte -evilwm -evince -evolution -evolution-data-server -evolution-ews -evolution-exchange -evolution-mapi -evolution-rss -evolution-webcal -evolver -evolvotron -evtest -eweouz -ewipe -exabgp -exactimage -exaile -excalibur-logger -excalibur-logkit -excellent-bifurcation -exec-maven-plugin -execnet -exempi -exfat-utils -exif -exifprobe -exiftags -exim4 -eximdoc4 -exiv2 -exmh -exo -exodusii -exonerate -expat -expect -expeyes -explorercanvas -exrtools -ext3grep -extace -extlib -extplorer -extra-xdg-menus -extrema -extremetuxracer -extsmail -extundelete -exuberant-ctags -exult -eyed3 -ezgo -ez-ipupdate -ezmlm-browse -ezstream -eztrace -f2c -faad2 -facile -fact++ -facter -factory-boy -fadecut -fai -faifa -fail2ban -fair -fairymax -fake -fakechroot -fake-hwclock -fakepop -fakeroot -fakeroot-ng -faketime -falconpl -falselogin -fam -famfamfam-flag -fannj -fapg -farpd -farstream -fasianoptions -fassets -fastdep -fastdnaml -fastforward -fastjar -fastjet -fastlink -fasttree -fastx-toolkit -fatattr -fatrat -fatrat-czshare -fatrat-opensubtitles -fatresize -fatsort -faucc -fauhdlc -faulthandler -faumachine -faust -faustworks -fbasics -fbautostart -fbb -fbbdoc -fbcat -fbdesk -fbi -fb-music-high -fbonds -fbpager -fbpanel -fbreader -fbset -fbterm -fbterm-ucimf -fbxkb -fccexam -fceu -fcgiwrap -fcheck -fcitx -fcitx-chewing -fcitx-cloudpinyin -fcitx-configtool -fcitx-fbterm -fcitx-googlepinyin -fcitx-hangul -fcitx-libpinyin -fcitx-m17n -fcitx-sunpinyin -fcitx-table-extra -fcitx-table-other -fcitx-ui-light -fcitx-unikey -fckeditor -fcmp -fcode-utils -fcoe-utils -fcopulae -fcrackzip -fdclone -fdflush -fdm -fdpowermon -fdsend -fdupes -fdutils -febootstrap -feed2imap -feed2omb -feedparser -feh -felix-bundlerepository -felix-framework -felix-gogo-command -felix-gogo-runtime -felix-gogo-shell -felix-latin -felix-main -felix-osgi-obr -felix-shell -felix-shell-tui -felix-utils -fence-agents -fenics -fenix -ferari -ferm -ferret -festival -festival-czech -festival-doc -festival-freebsoft-utils -festival-hi -festival-it -festival-mr -festival-te -festlex-cmu -festlex-poslex -festvox-czech-dita -festvox-czech-krb -festvox-czech-machac -festvox-czech-ph -festvox-don -festvox-kallpc16k -festvox-kallpc8k -festvox-kdlpc16k -festvox-kdlpc8k -festvox-mbrola -festvox-rablpc16k -festvox-rablpc8k -festvox-ru -festvox-suopuhe-lj -festvox-suopuhe-mv -fet -fetch-crl -fetchmail -fetchyahoo -fexoticoptions -fextremes -feynmf -ffc -ffcall -ffdiaporama -ffe -ffindex -ffmpeg2theora -ffmpeg-php -ffmpegthumbnailer -ffms2 -ffproxy -ffrenzy -fftw -fftw3 -fgarch -fgetty -fgo -fhist -fiaif -fiat -fibranet -fieldslib -fife -fig2ps -fig2sxd -figlet -figtoipe -figtree -file -file-kanji -filelight -file-mmagic -filepp -file-rc -file-roller -fileschanged -filetea -filetraq -filezilla -filler -fillets-ng -fillets-ng-data -filo -fil-plugins -filter -filtergen -filters -fim -fimport -finance-yahooquote -findimagedupes -findlib -findutils -finish-install -fio -firebird2.5 -firebug -firecookie -firedns -firegestures -firehol -firestarter -firestring -firetray -firexpath -firmware-free -fische -fish -fishpoll -fityk -fizmo -fizsh -flac -flactag -flake -flam3 -flamerobin -flamethrower -flamingo -flann -flare -flashbake -flashblock -flashgot -flashplugin-nonfree -flashrom -flashybrid -flask -flask-wtf -flasm -flatzebra -flawfinder -fl-cow -fldiff -fldigi -flex -flexbackup -flexc++ -flexi-streams -flexloader -flexml -flex-old -flickrbackup -flickrfs -flight-of-the-amazon-queen -flim -flip -flite -floatbg -flobopuyo -flog -florence -flot -flotr -flowcanvas -flowscan -flowscan-cuflow -flow-tools -flpsed -fltk1.1 -fltk1.3 -flufl.bounce -flufl.enum -flufl.i18n -flufl.lock -flufl.password -fluid-soundfont -fluidsynth -fluidsynth-dssi -flumotion -flup -flush -flute -fluxbox -flvmeta -flvstreamer -flvtool2 -flwm -fmcs -fmit -fmtools -fmultivar -fnonlinear -fntsample -focalinux -focuswriter -fofix-dfsg -folks -fondu -fontchooser -fontconfig -fontforge -fontforge-doc -fontforge-extras -font-manager -fontmatrix -fonts-anonymous-pro -fonts-aoyagi-kouzan-t -fonts-aoyagi-soseki -fonts-arabeyes -fonts-arphic-bkai00mp -fonts-arphic-bsmi00lp -fonts-arphic-gbsn00lp -fonts-arphic-gkai00mp -fonts-arphic-ukai -fonts-arphic-uming -fonts-baekmuk -fonts-beng -fonts-beng-extra -fonts-beteckna -fonts-bpg-georgian -fonts-breip -fonts-cabin -fonts-cabinsketch -fonts-cantarell -fonts-century-catalogue -fonts-cmu -fonts-comfortaa -fonts-cwtex -fonts-dancingscript -fonts-dejima-mincho -fonts-deva -fonts-deva-extra -fonts-dosis -fonts-droid -fonts-dustin -fonts-dzongkha -fonts-ecolier-court -fonts-ecolier-lignes-court -fonts-eeyek -fonts-evertype-conakry -fonts-f500 -fonts-fanwood -fonts-farsiweb -fonts-freefarsi -fonts-freefont -fonts-gfs-artemisia -fonts-gfs-baskerville -fonts-gfs-bodoni-classic -fonts-gfs-complutum -fonts-gfs-didot -fonts-gfs-didot-classic -fonts-gfs-gazis -fonts-gfs-neohellenic -fonts-gfs-olga -fonts-gfs-porson -fonts-gfs-solomos -fonts-gfs-theokritos -fonts-gubbi -fonts-gujr -fonts-gujr-extra -fonts-guru -fonts-guru-extra -fonts-hanazono -fonts-horai-umefont -fonts-hosny-amiri -fonts-hosny-thabit -fonts-inconsolata -fonts-indic -fonts-ipaexfont -fonts-ipafont -fonts-ipamj-mincho -fonts-johnsmith-induni -fonts-junicode -fonts-jura -fonts-kacst -fonts-kacst-one -fonts-kanjistrokeorders -fonts-kaushanscript -fonts-khmeros -fonts-kiloji -fonts-knda -fonts-knda-extra -fonts-komatuna -fonts-konatu -fonts-kouzan-mouhitsu -fonts-lao -fonts-lato -fonts-levien-museum -fonts-levien-typoscript -fonts-lg-aboriginal -fonts-liberation -fonts-lindenhill -fonts-linex -fonts-linuxlibertine -fonts-lklug-sinhala -fonts-lobstertwo -fonts-lohit-beng-assamese -fonts-lohit-beng-bengali -fonts-lohit-deva -fonts-lohit-gujr -fonts-lohit-guru -fonts-lohit-knda -fonts-lohit-mlym -fonts-lohit-orya -fonts-lohit-taml -fonts-lohit-telu -fonts-manchufont -fonts-mgopen -fonts-migmix -fonts-misaki -fonts-mlym -fonts-mmcedar -fonts-monapo -fonts-motoya-l-cedar -fonts-motoya-l-maruberi -fonts-mph-2b-damase -fonts-mplus -fonts-nafees -fonts-nakula -fonts-nanum -fonts-nanum-coding -fonts-nanum-eco -fonts-nanum-gothic-light -fonts-navilu -fonts-ocr-a -fonts-oflb-asana-math -fonts-oflb-euterpe -fonts-okolaks -fonts-oldstandard -fonts-opendin -fonts-orya -fonts-orya-extra -fonts-pagul -fonts-paktype -fonts-pecita -fonts-play -fonts-prociono -fonts-quattrocento -fonts-rufscript -fonts-sahadeva -fonts-samyak -fonts-sawarabi-gothic -fonts-sawarabi-mincho -fonts-senamirmir-washra -fonts-sil-abyssinica -fonts-sil-andika -fonts-sil-charis -fonts-sil-dai-banna -fonts-sil-doulos -fonts-sil-ezra -fonts-sil-galatia -fonts-sil-gentium -fonts-sil-gentium-basic -fonts-sil-nuosusil -fonts-sil-padauk -fonts-sil-scheherazade -fonts-sil-sophia-nubian -fonts-sil-zaghawa-beria -fonts-sipa-arundina -fonts-smc -fonts-stix -fonts-takao -fonts-taml -fonts-taml-tamu -fonts-taml-tscu -fonts-telu -fonts-telu-extra -fonts-tibetan-machine -fonts-tlwg -fonts-tomsontalks -fonts-tuffy -fonts-ubuntu-title -fonts-ukij-uyghur -fonts-umeplus -fonts-unfonts-core -fonts-unfonts-extra -fonts-unikurdweb -fonts-uralic -fonts-vlgothic -fonts-vollkorn -fonts-yanone-kaffeesatz -fonts-yozvox-yozfont -fonttools -fontypython -fonty-rg -foo2zjs -foobillard -fookb -fookebox -foolscap -foomatic-db -foomatic-db-engine -foomatic-filters -foo-yc20 -fop -foptions -foreign -foremost -forg -forgethtml -forgetsql -forked-daapd -fort77 -fortune-mod -fortunes-bg -fortunes-bofh-excuses -fortunes-br -fortunes-cs -fortunes-de -fortunes-debian-hints -fortunes-eo -fortunes-es -fortunes-fr -fortunes-ga -fortunes-it -fortunes-mario -fortunes-pl -fortunes-ru -fortune-zh -fosfat -fossil -fotowall -fotoxx -foundry -fox1.6 -foxtrotgps -foxyproxy -fpc -fpconst -fped -fping -fpm2 -fportfolio -fprintd -fprint-demo -fprobe -fprobe-ulog -fqterm -fracplanet -fragmaster -frama-c -francine -fraqtive -freealchemist -freealut -freebirth -freebsd-buildutils -freebsd-glue -freebsd-libs -freebsd-manpages -freebsd-sendpr -freecdb -freecell-solver -freeciv -freecode-submit -freecol -freecraft -freedict -freedink -freedink-data -freedink-dfarc -freedoom -freedroid -freedroidrpg -freefem -freefem++ -freefem3d -freegish -freeglut -freehdl -freehep-chartableconverter-plugin -freehep-export -freehep-graphics2d -freehep-graphicsio -freehep-graphicsio-emf -freehep-graphicsio-java -freehep-graphicsio-pdf -freehep-graphicsio-ps -freehep-graphicsio-svg -freehep-graphicsio-swf -freehep-graphicsio-tests -freehep-io -freehep-swing -freehep-util -freehep-xml -freeimage -freeipmi -freemat -freemedforms-project -freemind -freepats -freeplane -freeplayer -freepops -freepwing -freeradius -freerdp -freesci -freespeak -freesweep -freetable -freetalk -freetds -freetennis -freetts -freetuxtv -freetype -freevial -freevo -freewheeling -freewnn -freexl -fregression -frei0r -freqtweak -frescobaldi -freshen -fretsonfire -fretsonfire-songs-muldjord -fretsonfire-songs-sectoid -fribidi -fritzing -frog -frogatto -frogdata -frogr -frontaccounting -frotz -frown -frozen-bubble -fruit -fsarchiver -fsgateway -fslint -fsmark -fso-datad -fso-deviced -fso-frameworkd -fso-gpsd -fso-gsm0710muxd -fso-gsmd -fso-specs -fso-usaged -fspanel -fsplib -f-spot -fsprotect -fspy -fstransform -fstrcmp -fsviewer-icons -fsvs -fswebcam -ftdi-eeprom -fte -fteqcc -ftgl -ftjam -ftnchek -ftp.app -ftpcopy -ftpgrab -ftphs -ftplib -ftpmirror -ftp-upload -ftpwatch -ftrading -fts -fullquottel -funcoeszz -funcparserlib -funitroots -funkload -funnelweb -funnelweb-doc -funnyboat -funny-manpages -funtools -furiusisomount -fuse -fuse4bsd -fuse-convmvfs -fusedav -fuse-emulator -fuse-emulator-utils -fuse-exfat -fuseiso -fuse-posixovl -fusesmb -fuse-umfuse-ext2 -fuse-umfuse-fat -fuse-umfuse-iso9660 -fusil -fusioninventory-agent -fuss-launcher -fuzz -fuzzyocr -fvwm -fvwm1 -fvwm-crystal -fvwm-icons -fwanalog -fwbuilder -fweb -fwknop -fwlogwatch -fwsnort -fxload -fxt -fyre -g15composer -g15daemon -g15macro -g15mpd -g15stats -g2 -g2clib -g2ipmsg -g2p-sk -g3data -g3dviewer -gabedit -gadap -gadfly -gadmin-bind -gadmin-openvpn-client -gadmin-openvpn-server -gadmin-proftpd -gadmin-rsync -gadmin-samba -gadmintools-meta -gaduhistory -gaffitter -gaim-librvp -gaim-themes -gajim -galax -galculator -galib -gallery -galleryremote -gallery-uploader -galleta -galternatives -gamazons -gambas3 -gambc -gambit -gameclock -game-data-packager -game-music-emu -gamera -games-thumbnails -gamgi -gamin -gamine -gammu -ganeti -ganeti-instance-debootstrap -ganglia -ganglia-modules-linux -gant -ganv -ganymed-ssh2 -ganyremote -gap -gap-ctbllib -gap-gdat -gaphas -gaphor -gap-tomlib -garcon -garden-of-coloured-lights -gargoyle-free -garlic -garlic-doc -garmin-ant-downloader -garmindev -garmin-forerunner-tools -gartoon -gastables -gatling -gauche -gauche-c-wrapper -gauche-gl -gaupol -gausssum -gav -gavl -gav-themes -gawk -gbackground -gbase -gbatnav -gbemol -gbgoffice -gbirthday -gbonds -gbrainy -gbrowse -gbsplay -gcal -gcalcli -gcalctool -gcap -gcb -gcc-3.3 -gcc-4.4 -gcc-4.6 -gcc-4.7 -gcc-avr -gcc-defaults -gcc-doc-defaults -gcc-h8300-hms -gcc-m68hc1x -gcc-mingw-w64 -gcc-msp430 -gccxml -gcin -gcipher -gcj-4.6 -gcj-4.7 -gcl -gco -gcolor2 -gcompris -gconf -gconf-editor -gconfmm2.6 -gconjugue -gcontactsync -gcp -gcpegg -gcr -gcstar -gcx -gd4o -gdal -gdata -gdata-sharp -gdb -gdb-avr -gdbm -gdb-mingw-w64 -gdb-msp430 -gdc-4.4 -gdc-4.6 -gdcm -gddrescue -gdebi -gdeskcal -gdesklets -gdevilspie -gdigi -gdis -gdisk -gdk-pixbuf -gdl -gdm3 -gdmap -gdome2 -gdpc -geant321 -geany -geany-plugins -gearhead -gearhead2 -gearmand -gearman-interface -gearman-server -gecko-mediaplayer -gecode -gecrit -geda-gaf -geda-xgsch2pcb -gedit -gedit-latex-plugin -gedit-plugins -gedit-r-plugin -gedit-source-code-browser-plugin -gedit-valencia-plugin -geekcode -geeqie -gegl -geiser -geki2 -geki3 -gelemental -gem -gem2deb -gemanx-gtk2 -gemdropx -gems -genbackupdata -genders -genetic -geneweb -genext2fs -gengetopt -genisovh -genius -genparse -genromfs -genshi -gentle -gentlyweb-utils -gentoo -genus2reduction -geoclue -geocode-glib -geogebra -geogebra-kde -geographiclib -geoip -geoip-database -geoip-database-contrib -geomview -geopy -geos -geotranz -gerbv -germinate -geronimo-activation-1.1-spec -geronimo-commonj-spec -geronimo-ejb-3.0-spec -geronimo-interceptor-3.0-spec -geronimo-j2ee-connector-1.5-spec -geronimo-jacc-1.1-spec -geronimo-javamail-1.4-provider -geronimo-javamail-1.4-spec -geronimo-jms-1.1-spec -geronimo-jpa-2.0-spec -geronimo-jpa-3.0-spec -geronimo-jta-1.1-spec -geronimo-osgi-support -geronimo-stax-1.2-spec -geronimo-validation-1.0-spec -gerstensaft -gesftpserver -geshi -gespeaker -getdata -getfem++ -get-flash-videos -get-iplayer -getmail4 -getstream -gettext -gettext-ant-tasks -gettext-lint -gexec -geximon -gexiv2 -gextractwinicons -gfan -gfarm -gfarm2fs -gfax -gff2aplot -gff2ps -gflags -gfm -gforth -gfpoken -gftp -gfxboot -gfxboot-examples -gfxboot-themes -ggcov -ggobi -ghc -ghc-mod -ghc-testsuite -ghemical -ghex -ghextris -ghostess -ghostscript -giblib -gif2apng -gif2png -giflib -gifsicle -gifticlib -giftrans -gigedit -giggle -gigolo -gimmix -gimp -gimp-data-extras -gimp-dcraw -gimp-dds -gimp-dimage-color -gimp-gap -gimp-help -gimplensfun -gimp-plugin-registry -gimp-resynthesizer -gimp-texturize -ginac -ginkgocadx -ginspector -gio-sharp -gip -girara -git -git2cl -git-annex -git-buildpackage -git-cola -git-dpm -git-extras -git-flow -git-ftp -gitg -github-backup -github-cli -gitit -gitmagic -gitolite -gitpkg -git-review -git-sh -gitstats -git-stuff -giws -gjacktransport -gjay -gjiten -gjots2 -gjs -gkdebconf -gkermit -gkeyfile-sharp -gkrellkam -gkrellm -gkrellm-gkrellmpc -gkrellmitime -gkrellm-leds -gkrellm-mailwatch -gkrellmoon -gkrellm-radio -gkrellm-reminder -gkrellm-snmp -gkrellm-thinkbat -gkrellm-volume -gkrellmwireless -gkrellm-x86info -gkrellm-xkb -gkrellshoot -gkrelltop -gkrelluim -gkrellweather -gkremldk -gksu -gl-117 -gl2ps -glabels -glade -glade-3 -glam2 -glance -glark -glassfish -glaurung -glbsp -gle -glee -gle-graphics -glew -glfer -glfw -glhack -glib2.0 -glibmm2.4 -glib-networking -glide -glipper -glitch -gliv -glm -glob2 -global -globs -globus-authz -globus-authz-callout-error -globus-callout -globus-common -globus-core -globus-ftp-client -globus-ftp-control -globus-gass-cache -globus-gass-cache-program -globus-gass-copy -globus-gass-server-ez -globus-gass-transfer -globus-gatekeeper -globus-gfork -globus-gram-audit -globus-gram-client -globus-gram-client-tools -globus-gram-job-manager -globus-gram-job-manager-callout-error -globus-gram-job-manager-condor -globus-gram-job-manager-fork -globus-gram-job-manager-pbs -globus-gram-job-manager-scripts -globus-gram-job-manager-sge -globus-gram-protocol -globus-gridftp-server -globus-gridftp-server-control -globus-gridmap-callout-error -globus-gsi-callback -globus-gsi-cert-utils -globus-gsi-credential -globus-gsi-openssl-error -globus-gsi-proxy-core -globus-gsi-proxy-ssl -globus-gsi-sysconfig -globus-gssapi-error -globus-gssapi-gsi -globus-gss-assist -globus-io -globus-openssl-module -globus-proxy-utils -globus-rls-client -globus-rls-server -globus-rsl -globus-scheduler-event-generator -globus-simple-ca -globus-usage -globus-xio -globus-xio-gsi-driver -globus-xioperf -globus-xio-pipe-driver -globus-xio-popen-driver -glogg -gloox -glosstex -glotski -glpeces -glpi -glpk -glpk-java -glrr -glrr-widgets -gltron -gluas -glue -gluegen2 -glue-schema -glui -glurp -glusterfs -glw -glx-alternatives -gmail-notify -gman -gmanedit -gmchess -gmediaserver -gmemusage -gmerlin -gmerlin-avdecoder -gmerlin-encoders -gmetadom -gmetrics -gmfsk -gmic -gmidimonitor -gmime -gmlive -gmobilemedia -gmodels -gmorgan -gmotionlive -gmp -gmpc -gmpc-plugins -gmp-ecm -gmrun -gmt -gmt-coast-low -gmt-doc-ps -gmt-gshhs -gmtk -gmtkbabel -gmt-manpages -gmtp -gmt-tutorial -gmult -gmusicbrowser -gmysqlcc -gnac -gnade -gnarwl -gnash -gnat -gnat-4.6 -gnat-gps -gnats -gnelib -gnet -gngb -gniall -gnoemoe -gnokii -gnomad2 -gnome3-emblems -gnome-activity-journal -gnome-alsamixer -gnome-applets -gnome-audio -gnome-backgrounds -gnome-blog -gnome-bluetooth -gnome-boxes -gnome-breakout -gnome-btdownload -gnomecatalog -gnome-chemistry-utils -gnome-codec-install -gnome-color-chooser -gnome-color-manager -gnome-colors -gnome-commander -gnome-common -gnome-contacts -gnome-control-center -gnome-desktop -gnome-desktop3 -gnome-desktop-sharp2 -gnome-devel-docs -gnome-dictionary -gnome-disk-utility -gnome-do -gnome-documents -gnome-doc-utils -gnome-do-plugins -gnome-dvb-daemon -gnome-extra-icons -gnome-font-viewer -gnome-games -gnome-games-extra-data -gnome-gmail -gnome-hearts -gnome-hwp-support -gnome-icon-theme -gnome-icon-theme-extras -gnome-icon-theme-nuovo -gnome-icon-theme-symbolic -gnome-icon-theme-yasis -gnome-js-common -gnome-keyring -gnome-keyring-sharp -gnomekiss -gnome-mag -gnome-mastermind -gnome-media -gnome-menus -gnome-menus2 -gnome-mime-data -gnome-mplayer -gnome-mud -gnome-nds-thumbnailer -gnome-nettool -gnome-online-accounts -gnome-orca -gnome-osd -gnome-packagekit -gnome-paint -gnome-panel -gnome-phone-manager -gnome-photo-printer -gnome-pie -gnome-pkg-tools -gnome-power-manager -gnome-ppp -gnome-python -gnome-python-desktop -gnome-python-extras -gnomeradio -gnome-rdp -gnome-schedule -gnome-screensaver -gnome-screensaver-flags -gnome-screenshot -gnome-search-tool -gnome-session -gnome-settings-daemon -gnome-sharp2 -gnome-shell -gnome-shell-extensions -gnome-shell-timer -gnome-specimen -gnome-speech -gnome-split -gnome-subtitles -gnome-sushi -gnome-system-log -gnome-system-monitor -gnome-system-tools -gnome-terminal -gnome-themes -gnome-themes-extras -gnome-themes-standard -gnome-tweak-tool -gnome-u2ps -gnome-user-docs -gnome-user-share -gnome-vfs -gnome-vfsmm2.6 -gnome-video-arcade -gnome-video-effects -gnome-xcf-thumbnailer -gnomint -gnonlin -gnote -gnotime -gns3 -gnubg -gnubiff -gnubik -gnuboy -gnucap -gnucash -gnucash-docs -gnuchess -gnuchess-book -gnudatalanguage -gnudoq -gnu-efi -gnu-fdisk -gnugk -gnugo -gnuhtml2latex -gnuift -gnuit -gnujump -gnulib -gnumach -gnumed-client -gnumed-server -gnumeric -gnunet -gnunet-fuse -gnunet-gtk -gnupg -gnupg2 -gnupg-doc -gnupginterface -gnupg-pkcs11-scd -gnuplot -gnuplot-mode -gnupod-tools -gnuradio -gnurobbo -gnurobots -gnuserv -gnushogi -gnusim8085 -gnu-smalltalk -gnu-standards -gnustep-back -gnustep-base -gnustep-dl2 -gnustep-examples -gnustep-gui -gnustep-icons -gnustep-make -gnustep-netclasses -gnutls26 -gnuvd -go2 -goaccess -goattracker -gob2 -goban -gobby -gobby-infinote -gobi-loader -gobject-introspection -goby -gocr -god -goffice -gofigure2 -gogglesmm -gogoc -golang -goldencheetah -goldendict -golly -gom -gomoku.app -gonzui -goo -goobox -goocanvas -goocanvasmm -google-bookmarks -googleearth-package -googlefontdirectory-tools -google-mock -google-perftools -google-sitemapgen -gopchop -gopher -goplay -gordon -gorm.app -gosa -gosa-perl -gosmore -gotmail -goto-common -goto-fai -goto-fai-backend -goto-fai-progress -gource -gourmet -gozer -gozerbot -gozerbot-plugins -gp2c -gpa -gpac -gpaint -gpart -gparted -gpdftext -gpe-announce -gpe-appmgr -gpe-bluetooth -gpe-calendar -gpe-clock -gpe-conf -gpe-confd -gpe-contacts -gpe-edit -gpe-expenses -gpe-filemanager -gpe-gallery -gpe-go -gpe-icons -gpe-julia -gpe-lights -gpe-login -gpe-mininet -gpe-mixer -gpe-othello -gpe-ownerinfo -gpe-question -gperf -gperiodic -gpe-screenshot -gpe-shield -gpe-soundbite -gpe-soundserver -gpe-su -gpesyncd -gpe-taskmanager -gpe-tetris -gpe-timesheet -gpe-todo -gpe-watch -gpe-what -gpgme1.0 -gphoto2 -gphotofs -gphpedit -gpick -gpicview -gpiv -gpivtools -gplanarity -gplcver -gplots -gpm -gpodder -gpointing-device-settings -gpp -gpr -gprbuild -gpredict -gprename -gprolog -gpsbabel -gpscorrelate -gpsd -gpsim -gpsim-doc -gpsk31 -gpsman -gpsmanshp -gpsprune -gpstrans -gpt -gputils -gpw -gpx2shp -gpxviewer -gquilt -grabc -grace -gradm2 -grads -grafx2 -gramadoir -gramofile -gramophone2 -gramps -grantlee -granule -grap -graphicsmagick -graphite2 -graphite-carbon -graphmonkey -graphthing -graphviz -graphy -grass -gravitation -gravitywars -grc -grcm -grcompiler -grdesktop -greasemonkey -greed -greekocr4gamera -greenwich -gregmisc -gregorio -grep -grepcidr -grepmail -gresolver -gretl -greylistd -grfcodec -grhino -gri -grib-api -gridengine -gridlock.app -grid-packaging-tools -gridsite -griffith -grig -grilo -grilo-plugins -grinder -gringo -gringotts -grisbi -grml2usb -grml-debootstrap -grml-rescueboot -groff -grok -grokevt -gromacs -gromit -groovy -groovy1.7.2 -gross -groundhog -grpn -grr.app -grsync -grub -grub2 -grub2-splashimages -grub-choose-default -grub-imageboot -grub-installer -grub-splashimages -grun -gsasl -gscan2pdf -gscanbus -gsetroot -gsettings-desktop-schemas -gsfonts -gsfonts-x11 -gshare -gsimplecal -gsl -gsm0710muxd -gsmartcontrol -gsmc -gsmlib -gsnmp -gsoap -gsoko -gsql -gss -gssdp -gst0.10-python -gst123 -gst-buzztard -gst-chromaprint -gst-fluendo-mp3 -gstm -gst-plugins-bad0.10 -gst-plugins-base0.10 -gst-plugins-good0.10 -gst-plugins-ugly0.10 -gst-qa-system -gstreamer0.10 -gstreamer0.10-dvswitch -gstreamer0.10-editing-services -gstreamer0.10-ffmpeg -gstreamer0.10-rtsp -gstreamer-hplugins -gstreamer-sharp -gsutil -gt5 -gtamsanalyzer.app -gtans -gtest -gtetrinet -gtg -gtg-trace -gthumb -gtick -gtimer -gtk+2.0 -gtk2-engines -gtk2-engines-aurora -gtk2-engines-cleanice -gtk2-engines-magicchicken -gtk2-engines-murrine -gtk2-engines-oxygen -gtk2-engines-qtcurve -gtk2-engines-wonderland -gtk2-engines-xfce -gtk2hs-buildtools -gtk+3.0 -gtk3-engines-unico -gtkam -gtkaml -gtkatlantic -gtkballs -gtkboard -gtk-chtheme -gtkcookie -gtk-doc -gtkgl2 -gtkglarea-sharp -gtkglext -gtkglextmm -gtk-gnutella -gtkguitune -gtkhash -gtkhotkey -gtkhtml3.14 -gtkhtml4.0 -gtkimageview -gtk-im-libthai -gtklick -gtklp -gtkmathview -gtkmm2.4 -gtkmm3.0 -gtkmm-documentation -gtk-nodoka-engine -gtkorphan -gtkperf -gtkpod -gtkpool -gtk-recordmydesktop -gtk-sharp2 -gtk-sharp-beans -gtksourceview2 -gtksourceview3 -gtkspell -gtkspell3 -gtk-theme-switch -gtktrain -gtk-vector-screenshot -gtk-vnc -gtkvncviewer -gtkwave -gtml -gtools -gtranslator -gtrayicon -gts -gtypist -guacamole -guacd -guake -guava -guava-libraries -guayadeque -gucharmap -gudev-sharp-1.0 -guessnet -guest-templates -gui-apt-key -guice -guichan -guidata -guifications -guile-1.6 -guile-1.8 -guile-2.0 -guile-cairo -guile-db -guile-lib -guile-pg -guilt -guiqwt -guitarix -gui-ufw -gummi -gunicorn -gunroar -gup -gupnp -gupnp-av -gupnp-dlna -gupnp-igd -gupnp-tools -gupnp-vala -gurgitate-mail -gurlchecker -gutenprint -guvcview -guymager -gv -gvb -gvfs -gvidm -gvpe -gvrng -gwaei -gwakeonlan -gwaterfall -gwc -gweled -gwenview -gw-fonts-ttf -gwhere -gwhois -gworkspace -gworldclock -g-wrap -gwrite -gwyddion -gxine -gxmessage -gxmms2 -gxneur -gxtuner -gyoto -gyp -gyrus -gzip -gzrt -h323plus -h5py -h5utils -ha -hachoir-core -hachoir-metadata -hachoir-parser -hachoir-regex -hachoir-subfile -hachoir-urwid -hachoir-wx -haci -haildb -ha-jdbc -hal -halevt -halibut -hal-info -hama-slide-mouse-control -hamexam -hamfax -haml-elisp -hamlib -hamradiomenus -hamster-applet -handlersocket -hannah -hannah-foo2zjs -hapm -happy -harden -harden-doc -hardening-wrapper -hardinfo -hardlink -harminv -hasciicam -haserl -hashalot -hashcash -haskell98-report -haskell98-tutorial -haskell-acid-state -haskell-active -haskell-adjunctions -haskell-aeson -haskell-algebra -haskell-alut -haskell-ami -haskell-ansi-terminal -haskell-ansi-wl-pprint -haskell-arrows -haskell-asn1-data -haskell-attempt -haskell-attoparsec -haskell-attoparsec-conduit -haskell-attoparsec-enumerator -haskell-augeas -haskell-authenticate -haskell-base16-bytestring -haskell-base64-bytestring -haskell-base-unicode-symbols -haskell-bifunctors -haskell-binary-shared -haskell-bindings-dsl -haskell-bindings-gpgme -haskell-bindings-libzip -haskell-bitarray -haskell-blaze-builder -haskell-blaze-builder-conduit -haskell-blaze-builder-enumerator -haskell-blaze-html -haskell-blaze-markup -haskell-blaze-textual -haskell-bloomfilter -haskell-boolean -haskell-boomerang -haskell-brainfuck -haskell-byteorder -haskell-bytestring-lexing -haskell-bytestring-mmap -haskell-bytestring-nums -haskell-bytestring-show -haskell-bzlib -haskell-cabal-file-th -haskell-cabal-install -haskell-cairo -haskell-case-insensitive -haskell-categories -haskell-cautious-file -haskell-cereal -haskell-cereal-conduit -haskell-certificate -haskell-cgi -haskell-chart -haskell-chell -haskell-citeproc-hs -haskell-clientsession -haskell-clock -haskell-cmdargs -haskell-colour -haskell-comonad -haskell-comonads-fd -haskell-comonad-transformers -haskell-conduit -haskell-configfile -haskell-configurator -haskell-contravariant -haskell-convertible -haskell-cookie -haskell-cprng-aes -haskell-cpu -haskell-criterion -haskell-crypto -haskell-crypto-api -haskell-cryptocipher -haskell-crypto-conduit -haskell-cryptohash -haskell-crypto-pubkey-types -haskell-css-text -haskell-csv -haskell-csv-conduit -haskell-curl -haskell-data-accessor -haskell-data-accessor-mtl -haskell-data-accessor-template -haskell-data-binary-ieee754 -haskell-data-default -haskell-dataenc -haskell-data-inttrie -haskell-data-lens -haskell-data-memocombinators -haskell-datetime -haskelldb -haskelldb-hdbc -haskelldb-hdbc-odbc -haskelldb-hdbc-postgresql -haskelldb-hdbc-sqlite3 -haskell-dbus -haskell-debian -haskell-devscripts -haskell-diagrams -haskell-diagrams-cairo -haskell-diagrams-core -haskell-diagrams-lib -haskell-diff -haskell-digest -haskell-dimensional -haskell-directory-tree -haskell-distributive -haskell-dlist -haskell-doc -haskell-download-curl -haskell-dpkg -haskell-dummy -haskell-dyre -haskell-edison-api -haskell-edison-core -haskell-edit-distance -haskell-editline -haskell-ekg -haskell-email-validate -haskell-entropy -haskell-enumerator -haskell-erf -haskell-event-list -haskell-exception-transformers -haskell-executable-path -haskell-explicit-exception -haskell-failure -haskell-fastcgi -haskell-fast-logger -haskell-fclabels -haskell-feed -haskell-fgl -haskell-file-embed -haskell-filemanip -haskell-filestore -haskell-filesystem-conduit -haskell-free -haskell-gconf -haskell-gd -haskell-ghc-events -haskell-ghc-mtl -haskell-ghc-paths -haskell-ghc-syb-utils -haskell-gio -haskell-github -haskell-glade -haskell-glfw -haskell-glib -haskell-glut -haskell-gnuidn -haskell-gnutls -haskell-gsasl -haskell-gstreamer -haskell-gtk -haskell-gtkglext -haskell-gtksourceview2 -haskell-haddock -haskell-hakyll -haskell-hamlet -haskell-happstack -haskell-happstack-server -haskell-harp -haskell-hashable -haskell-hashed-storage -haskell-hashmap -haskell-hashtables -haskell-haskeline -haskell-haskell-src -haskell-haskore -haskell-hastache -haskell-haxr -haskell-hcard -haskell-hcwiid -haskell-hfuse -haskell-hinotify -haskell-hint -haskell-hipmunk -haskell-hjavascript -haskell-hjscript -haskell-hjsmin -haskell-hostname -haskell-hs3 -haskell-hs-bibutils -haskell-hscurses -haskell-hsemail -haskell-hsh -haskell-hsp -haskell-hspec -haskell-hsql -haskell-hsql-mysql -haskell-hsql-odbc -haskell-hsql-postgresql -haskell-hsql-sqlite3 -haskell-hssyck -haskell-hstringtemplate -haskell-hsx -haskell-html -haskell-html-conduit -haskell-http -haskell-http-conduit -haskell-http-date -haskell-http-types -haskell-hunit -haskell-hxt -haskell-hxt-cache -haskell-hxt-charproperties -haskell-hxt-curl -haskell-hxt-http -haskell-hxt-regex-xmlschema -haskell-hxt-relaxng -haskell-hxt-tagsoup -haskell-hxt-unicode -haskell-hxt-xpath -haskell-hxt-xslt -haskell-iconv -haskell-ieee754 -haskell-ifelse -haskell-io-choice -haskell-iospec -haskell-io-storage -haskell-irc -haskell-iteratee -haskell-ixset -haskell-json -haskell-keys -haskell-knob -haskell-lambdabot-utils -haskell-language-c -haskell-language-haskell-extract -haskell-language-javascript -haskell-largeword -haskell-lazysmallcheck -haskell-leksah -haskell-leksah-server -haskell-lexer -haskell-libtagc -haskell-libxml-sax -haskell-libzip -haskell-lifted-base -haskell-listlike -haskell-llvm -haskell-llvm-base -haskell-logict -haskell-ltk -haskell-maccatcher -haskell-markov-chain -haskell-math-functions -haskell-maths -haskell-maybet -haskell-mbox -haskell-memotrie -haskell-mersenne-random -haskell-midi -haskell-mime-mail -haskell-mmap -haskell-mode -haskell-monadcatchio-mtl -haskell-monadcatchio-transformers -haskell-monad-control -haskell-monadcryptorandom -haskell-monad-loops -haskell-monad-par -haskell-monadrandom -haskell-monads-tf -haskell-monoid-transformer -haskell-mtl -haskell-mtlparse -haskell-murmur-hash -haskell-mwc-random -haskell-ncurses -haskell-netwire -haskell-network -haskell-network-conduit -haskell-network-protocol-xmpp -haskell-newtype -haskell-non-negative -haskell-numbers -haskell-numeric-quest -haskell-numinstances -haskell-numtype -haskell-oeis -haskell-openal -haskell-opengl -haskell-openpgp-asciiarmor -haskell-options -haskell-pandoc-types -haskell-pango -haskell-parallel -haskell-parseargs -haskell-parsec -haskell-parsec2 -haskell-pastis -haskell-path-pieces -haskell-patience -haskell-pcre-light -haskell-pem -haskell-persistent -haskell-persistent-sqlite -haskell-persistent-template -haskell-platform -haskell-polyparse -haskell-pool-conduit -haskell-postgresql-libpq -haskell-postgresql-simple -haskell-pretty-show -haskell-primes -haskell-primitive -haskell-psqueue -haskell-puremd5 -haskell-pwstore-fast -haskell-quickcheck -haskell-quickcheck1 -haskell-random -haskell-random-shuffle -haskell-ranged-sets -haskell-ranges -haskell-reactive-banana -haskell-readline -haskell-recaptcha -haskell-regex-base -haskell-regex-compat -haskell-regex-pcre -haskell-regex-posix -haskell-regexpr -haskell-regex-tdfa -haskell-regex-tdfa-utf8 -haskell-representable-functors -haskell-representable-tries -haskell-resource-pool -haskell-resourcet -haskell-rsa -haskell-safe -haskell-safecopy -haskell-sdl -haskell-sdl-gfx -haskell-sdl-image -haskell-sdl-mixer -haskell-sdl-ttf -haskell-semigroupoids -haskell-semigroups -haskell-sendfile -haskell-sha -haskell-shakespeare -haskell-shakespeare-css -haskell-shakespeare-i18n -haskell-shakespeare-js -haskell-shakespeare-text -haskell-shellac -haskell-show -haskell-silently -haskell-simpleea -haskell-simpleirc -haskell-simple-sendfile -haskell-skein -haskell-smallcheck -haskell-smtpclient -haskell-snap-core -haskell-snap-server -haskell-socks -haskell-split -haskell-src-exts -haskell-statevar -haskell-static-hash -haskell-statistics -haskell-stm -haskell-stream -haskell-strict -haskell-strict-concurrency -haskell-strptime -haskell-svgcairo -haskell-syb -haskell-syb-with-class -haskell-syb-with-class-instances-text -haskell-system-fileio -haskell-system-filepath -haskell-tagged -haskell-tagsoup -haskell-tagstream-conduit -haskell-tar -haskell-template -haskell-temporary -haskell-terminfo -haskell-test-framework -haskell-test-framework-hunit -haskell-test-framework-quickcheck2 -haskell-test-framework-th -haskell-test-framework-th-prime -haskell-testpack -haskell-texmath -haskell-text -haskell-text-icu -haskell-tinyurl -haskell-tls -haskell-tls-extra -haskell-transformers -haskell-transformers-base -haskell-type-level -haskell-uniplate -haskell-unix-bytestring -haskell-unix-compat -haskell-unixutils -haskell-unlambda -haskell-unordered-containers -haskell-uri -haskell-url -haskell-utf8-light -haskell-utf8-string -haskell-utility-ht -haskell-uuagc-cabal -haskell-uuid -haskell-uulib -haskell-vault -haskell-vector -haskell-vector-algorithms -haskell-vector-space -haskell-vector-space-points -haskell-void -haskell-vte -haskell-vty -haskell-wai -haskell-wai-app-file-cgi -haskell-wai-app-static -haskell-wai-extra -haskell-wai-logger -haskell-wai-logger-prefork -haskell-wai-test -haskell-warp -haskell-warp-tls -haskell-webkit -haskell-web-routes -haskell-weighted-regexp -haskell-x11 -haskell-x11-xft -haskell-xdg-basedir -haskell-xhtml -haskell-xml -haskell-xml2html -haskell-xml-conduit -haskell-xml-types -haskell-xss-sanitize -haskell-yaml -haskell-yaml-light -haskell-yesod -haskell-yesod-auth -haskell-yesod-core -haskell-yesod-default -haskell-yesod-form -haskell-yesod-json -haskell-yesod-markdown -haskell-yesod-persistent -haskell-yesod-routes -haskell-yesod-static -haskell-yesod-test -haskell-zip-archive -haskell-zlib -haskell-zlib-bindings -haskell-zlib-conduit -haskell-zlib-enum -hatari -hatop -haveged -hawknl -hawtjni -haxml -hdapsd -hdate-applet -hdbc -hdbc-odbc -hdbc-postgresql -hdbc-sqlite3 -hddtemp -hdf5 -hdf-eos4 -hdf-eos5 -hdparm -hdup -headache -hearse -heartbeat -hebcal -hedgewars -heimdal -heirloom-mailx -helium -hello -hello-debhelper -help2man -helpviewer.app -hepmc -herbstluftwm -hercules -herculesstudio -heroes -heroes-data -heroes-sound-effects -heroes-sound-tracks -hesiod -hessian -hevea -hex-a-hop -hexalate -hexcurse -hexec -hexedit -hexer -hexter -hexxagon -hfsplus -hfsprogs -hfsutils -hg-fast-export -hg-git -hgnested -hgsubversion -hgsvn -hgview -hhsuite -hibernate -hicolor-icon-theme -highlight -highlighting-kate -hiki -hime -hippo-canvas -hiredis -hitchhiker -hitori -hivex -hkgerman -hkl -hlbr -hlbrw -hlins -hlint -hmisc -hmmer -hnb -ho22bus -hoauth -hobbit-plugins -hocr -hodie -hoichess -hol88 -holdingnuts -hol-light -holotz-castle -homebank -horae -horgand -horizon -hostap-utils -hostname -hotkeys -hotot -hotswap -hotwire -howm -hoz -hp2xx -hp48cc -hpanel -hpcc -hping3 -hplip -hp-ppd -hp-search-mac -hpsockd -hscolour -hsetroot -hslogger -hspell -hspell-gui -hsqldb -ht -htag -htcheck -htcheck-php -htdig -html2ps -html2text -html2wml -html5lib -htmlcxx -htmldoc -htmlgen -html-helper-mode -html-template -htmlunit -htmlunit-core-js -html-xml-utils -htop -htree -htsengine -hts-voice-nitech-jp-atr503-m001 -httest -httpcode -httpcomponents-client -httpcomponents-core -httperf -httpfs2 -http-icons -httpie -httping -httptunnel -httpunit -httrack -hugin -hugs98 -hunspell -hunspell-an -hunspell-be -hunspell-dict-ko -hunspell-en-us -hunspell-gl-es -hunspell-kk -hunspell-ml -hunspell-ru -hunspell-se -hunspell-sv -hunt -hwdata -hw-detect -hwinfo -hwloc -hyantesite -hyde -hydrogen -hydrogen-drumkits -hyena -hylafax -hyperspec -hyphen -hyphen-as -hyphen-bn -hyphen-gu -hyphen-hi -hyphen-kn -hyphen-mr -hyphen-pa -hyphen-show -hyphen-ta -hyphen-te -hypre -i2c-tools -i3lock -i3status -i3-wm -i810switch -i8kutils -ia32-libs -ia32-libs-gtk -iat -iausofa-c -iaxmodem -ibam -ibid -ibod -ibsim -ibus -ibus-anthy -ibus-array -ibus-chewing -ibus-client-clutter -ibus-el -ibus-googlepinyin -ibus-hangul -ibus-input-pad -ibus-m17n -ibus-pinyin -ibus-qt -ibus-skk -ibus-sunpinyin -ibus-table -ibus-table-chinese -ibus-table-extraphrase -ibus-table-others -ibus-tegaki -ibus-unikey -ibus-xkbc -ibutils -ical2html -icc-profiles-free -iceape -icebreaker -icecast2 -icecream -icedove -icedove-l10n -icedtea-web -ices2 -iceweasel -iceweasel-linky -icewm -icheck -icicles -icinga -icinga-web -icli -icmake -icmpinfo -icmptx -icmpush -icom -icon -icon-naming-utils -icon-slicer -icoutils -icu -icu4j -icu4j-4.4 -id3 -id3lib3.8.3 -id3ren -id3tool -id3v2 -ident2 -identicurse -idesk -ideviceinstaller -idjc -idle3-tools -idl-font-lock-el -idm-console-framework -ido -id-utils -idzebra -iec16022 -ifd-gempc -ifeffit -ifenslave-2.6 -ifetch-tools -ifhp -ifile -ifmail -ifmetric -ifpgui -ifplugd -ifrench -ifrench-gut -ifrit -ifscheme -ifstat -iftop -ifupdown -ifupdown-extra -ifupdown-scripts-zg2 -ifuse -igaelic -igal2 -igerman98 -igraph -igstk -ii -ii-esu -iipimage -iirish -iisemulator -iitalian -ijs -ikarus -ike-scan -ikiwiki -ikiwiki-hosting -ikvm -ilmbase -ilohamail -im -imageindex -imagej -imagemagick -imageshack-uploader -imagetooth -imagevis3d -imagination -imanx -imap-acl-extension -imapcopy -imapfilter -imaprowl -imaptool -im-config -imdbpy -imdb-tools -imediff2 -imgsizer -imgtex -imgvtopgm -imhangul -imhangul3 -imhangul-common -iml -imlib2 -imms -impacket -importlib -impose+ -imposm -imposm-parser -impressive -imsniff -imspector -im-switch -imview-doc -imvirt -imwheel -inadyn -incron -indent -indicator-applet -indicator-application -indicator-messages -indicator-session -indigo -inetutils -infernal -infiniband-diags -info2man -info2www -infon -infon-devel -inform-mode -ini4j -initramfs-tools -initz -ink-generator -inkscape -inn -inn2 -innfeed -innoextract -inosync -inotail -inoticoming -inotify-tools -inotifyx -inputlirc -input-pad -input-utils -insighttoolkit -inspircd -insserv -installation-guide -installation-locale -installation-report -instant -instead -integrit -intel2gas -intel-gpu-tools -inteltool -intel-vaapi-driver -intercal -interchange -intlfonts -intltool -intltool-debian -intone -invada-studio-plugins -invada-studio-plugins-lv2 -invaders -inventor -iodine -iog -iok -ion -ioping -ioquake3 -io-stringy -iotop -ip2host -ip4r -ipadic -ipband -ipcalc -ipcheck -ipdb -ipe -ipe5toxml -iperf -ipfm -ipgrab -ipheth -ipip -ipkungfu -ipmitool -ipolish -ippl -iprelay -iprint -iproute -ips -ipsec-tools -ipset -ipsvd -iptables -iptables-persistent -iptotal -iptraf -iptstate -iptux -iputils -ipv6calc -ipvsadm -ipwatchd -ipwatchd-gnotify -ipxe -ipy -ipython -ircd-hybrid -ircd-irc2 -ircd-ircu -ircd-ratbox -ircii -ircmarkers -ircp-tray -irda-utils -iripdb -ir.lv2 -iroffer -irqbalance -irrlicht -irsim -irssi -irssi-plugin-xmpp -irssi-scripts -isakmpd -isatapd -isc-dhcp -iscsitarget -isdnactivecards -isdnutils -iselect -isight-firmware-tools -isl -islamic-menus -isns -iso-codes -isodate -isomaster -isomd5sum -isoqlog -isoquery -isorelax -iso-scan -ispell -ispell-czech -ispell-et -ispell-fi -ispell-fo -ispell-gl -ispell-lt -ispell.pt -ispell-tl -ispell-uk -istanbul -istgt -isync -italc -itcl3 -itk3 -itksnap -itools -itop -its -itsalltext -itsol -itstool -iucode-tool -iverilog -ivtools -ivtv-utils -ivy -ivykis -iw -iwatch -iwidgets4 -jaaa -jabberbot -jabber-irc -jabber.py -jabber-querybot -jablicator -jabref -jabref-plugin-oo -jacal -jack -jack-audio-connection-kit -jack-capture -jackd2 -jackd-defaults -jackeq -jack-keyboard -jackmeter -jack-mixer -jackrabbit -jack-rack -jack-stdio -jacksum -jack-tools -jacktrip -jade -jadetex -jaffl -jags -jailer -jailtool -jajuk -jakarta-ecs -jakarta-jmeter -jakarta-taglibs-standard -jalv -jalview -jam -jama -jamin -jaminid -jam-lib -jana -janest-core -janino -jansi -jansi-native -jansson -japa -japi-compliance-checker -japitools -jardiff -jargon -jargon-text -jargs -jarjar -jarjar-maven-plugin -jas -jasmin-sable -jasper -jasperreports -jasperreports3.7 -jas-plotter -jasypt -jaula -java2html -java3d -java3ds-fileloader -java-access-bridge -java-atk-wrapper -javacc -javacc-maven-plugin -java-common -javadap -java-gnome -javahelp2 -java-imaging-utilities -javamorph -java-package -javascript-common -javassist -javatools -java-wrappers -java-xmlbuilder -jaxe -jaxme -jaxml -jazip -jbig2dec -jbigkit -jblas -jbofihe -jbossas4 -jcal -jcc -jcharts -jcifs -jclassinfo -jclic -jclicmoodle -jcm -jcodings -jcommander -jconvolver -jcsp -jd -jdresolve -jebl2 -jed -jed-extra -jedit -jeex -jekyll -jellydoc -jellyfish -jemalloc -jenkins-commons-jelly -jenkins-commons-jexl -jenkins-crypto-util -jenkins-dom4j -jenkins-executable-war -jenkins-htmlunit -jenkins-htmlunit-core-js -jenkins-json -jenkins-memory-monitor -jenkins-remoting -jenkins-task-reactor -jenkins-test-annotations -jenkins-trilead-ssh2 -jenkins-winstone -jenkins-xstream -jericho-html -jesd -jesred -jester -jetring -jets3t -jetty -jetty8 -jeuclid -jexcelapi -jffi -jffnms -jflex -jfractionlab -jfsutils -jftp -jfugue -jgit -jgraph -jgromacs -jhbuild -jhdf -jhead -jifty -jigdo -jigit -jigl -jigzo -jiipview -jimtcl -jing-trang -jinja2 -jinput -jirc -jkmeter -jlapack -jless -jlex -jlha-utils -jlibeps -jline -jlint -jmagick -jmdns -jmeters -jmock -jmock2 -jmol -jnettop -jnoise -jnoisemeter -jnr-netdb -jnr-x86asm -joblib -jocaml -joda-convert -jodconverter -jodconverter-cli -jodreports -joe -john -jokosher -joptsimple -josm -josm-plugins -josql -jove -jovie -joy2key -joystick -jp2a -jpeginfo -jpegjudge -jpegoptim -jpegpixi -jpilot -jpilot-backup -jpnevulator -jpoker -jpylyzer -jqapi -jquery -jquery-goodies -jquery-jplayer -jquery-jplayer-bluemonday -jquery-jplayer-pinkflag -jquery-mobile -jqueryui -jquery-ui-themes -jruby -jruby-joni -js2-mode -jsch -jscribble -jscropperui -jsdebugger -jsdoc-toolkit -jshash -jsilver -jsjac -jsmath -jsmath-fonts -jsmath-fonts-sprite -js-of-ocaml -jsonbot -json-c -json-glib -jsonpickle -jsonpipe -json-simple -json-spirit -json-static -json-wheel -jsoup -jsr107cache -jss -jstest-gtk -jsxgraph -jsymphonic -jta -jtb -jtex-base -jtharness -jthread -jtidy -jtreg -jts -judy -juffed -jug -jugglemaster -juke -juman -jumpnbump -jumpnbump-levels -junior-doc -junit -junit4 -junitperf -junkfilter -jupp -jutils -jvim -jvyamlb -jwchat -jwhois -jwm -jxgrabkey -jxplorer -jython -jzip -jzlib -k3b -k3d -k4dirstat -kaa-base -kaa-imlib2 -kaa-metadata -kabikaboo -kaccessible -kactivities -kadu -kaffeine -kakasi -kalgebra -kali -kalign -kalternatives -kalzium -kamera -kamerka -kamoso -kanagram -kanatest -kanif -kanjidic -kanjipad -kannel -kannel-sqlbox -kanyremote -kaptain -kasumi -kate -katoob -kawari8 -kaya -kbackup -kball -kbd -kbd-chooser -kbdd -kbibtex -kbruch -kbuild -kcalc -kcc -kcemu -kcharselect -kcheckers -kchmviewer -kcm-fcitx -kcollectd -kcolorchooser -kcometen4 -kcov -kdbg -kdc2tiff -kde4libs -kdeadmin -kdeartwork -kde-baseapps -kdegames -kdegraphics-mobipocket -kdegraphics-strigi-analyzer -kdegraphics-thumbnailers -kde-gtk-config -kde-l10n -kdemultimedia -kdenetwork -kdenlive -kdepim -kdepimlibs -kdepim-runtime -kdeplasma-addons -kde-runtime -kdesdk -kdesrc-build -kde-style-polyester -kde-style-qtcurve -kdesudo -kdesvn -kdetoys -kdevelop -kdevelop-pg-qt -kdevelop-php -kdevelop-php-docs -kdevplatform -kde-wallpapers -kdewebdev -kde-workspace -kdf -kdiff3 -kdm-gdmcompat -kdocker -kdrill -kedpm -keepalived -keepass2 -keepassx -keepnote -kelbt -kephra -kerberos-configs -kernel-handbook -kernel-package -kernel-patch-viewos -kerneltop -kernel-wedge -kernsmooth -ketchup -ketm -keurocalc -kexec-tools -keybinder -keyboards-rg -keychain -keylaunch -keymapper -key-mon -keynav -keystone -keytouch-editor -keyutils -kfloppy -kfreebsd-8 -kfreebsd-9 -kfreebsd-defaults -kftpgrabber -kgamma -kgb -kgb-bot -kgeography -kgpg -khangman -khmerconverter -khronos-opencl-headers -khronos-opengl-man4 -kicad -kickseed -kid -kid3 -kig -kiki -kiki-the-nano-bot -kildclient -kile -killer -kimwitu -kimwitu++ -kimwitu-doc -kindleclip -king -kingston-update-notifier -kino -kinput2 -kio-ftps -kio-gopher -kiten -kiwi -klatexformula -klavaro -klettres -klibc -klick -klog -klone -kluppe -klustakwik -kmag -kmess -kmetronome -kmflcomp -kmfl-keyboards-mywin -kmidimon -kmldonkey -kmod -kmousetool -kmouth -kmplayer -kmplot -kmymoney -knemo -knews -knights -knockd -knocker -knopflerfish-osgi -knowledgeroot -kobodeluxe -kolabadmin -kolourpaint -kombu -komi -komparator -kon2 -konfont -konsole -konversation -konwert -korundum -kosd -ko.tex -ko.tex-extra-hlfont -ko.tex-unfonts -koules -kover -kpartsplugin -kphotoalbum -kplayer -kradio4 -kraft -krank -kraptor -krb5 -krb5-appl -krb5-auth-dialog -krb5-sync -krecipes -kredentials -kremotecontrol -krename -kross-interpreters -kruler -krusader -ksaneplugin -kscope -ksh -kshutdown -ksnapshot -ksplice -ksshaskpass -kst -kstars -kstart -kterm -ktikz -ktimer -ktorrent -ktouch -ktp-accounts-kcm -ktp-approver -ktp-auth-handler -ktp-call-ui -ktp-common-internals -ktp-contact-list -ktp-filetransfer-handler -ktp-kded-integration-module -ktp-presence-applet -ktp-send-file -ktp-text-ui -kturtle -kumofs -kunststoff -kup -kupfer -kuvert -kvirc -kvkbd -kvpm -kvpnc -kwalify -kwallet -kwalletcli -kwave -kwin-style-crystal -kwin-style-dekorator -kwordquiz -kwstyle -kwwidgets -kxl -kxml2 -l2tp-ipsec-vpn -l2tp-ipsec-vpn-daemon -l2tpns -l7-filter-userspace -l7-protocols -lablgl -lablgtk2 -lablgtk-extras -lablgtkmathview -labrea -laby -lacheck -ladder -ladish -laditools -ladr -ladspa-sdk -ladvd -lakai -lam -lambdabot -lame -lammps -landell -landslide -langdrill -langscan -lapack -laptop-detect -laptop-mode-tools -larswm -lasi -lasso -last-align -lastfm -lastfmsubmitd -lat -latd -late -latencytop -latex209 -latex2html -latex2rtf -latex-beamer -latex-cjk-chinese-arphic -latex-cjk-japanese-wadalab -latexdiff -latexdraw -latexila -latex-make -latexmk -latex-mk -latexml -latex-sanskrit -latex-xcolor -latrace -lattice -latticeextra -launchtool -launchy -lazarus -lazr.restfulclient -lazr.uri -lazyarray -lazygal -lbcd -lbdb -lbreakout2 -lbt -lcab -lcalc -lcd4linux -lcdf-typetools -lcdproc -lcgdm -lcms -lcms2 -lcov -lcrack -lcrt -ldap2dns -ldap2zone -ldap-account-manager -ldap-haskell -ldapjdk -ldapscripts -ldaptor -ldapvi -ldb -ldm -ldm-themes -ldns -ldp-docbook-stylesheets -ldtp -le -leafnode -leafpad -leaktracer -leave -lebiniou -lebiniou-data -ledger -ledgersmb -le-dico-de-rene-cougnenc -ledit -ledmon -leds-alix -legit -lein-clojars -leiningen -lekhonee-gnome -lemonldap-ng -lensfun -leptonlib -less -lesstif2 -letodms -letterize -levee -leveldb -lfhex -lfm -lft -lftp -lhapdf -lhasa -lhs2tex -lib3ds -libaacs -libaal -libabstract-ruby -libaccessors-perl -libace-perl -libacme-bleach-perl -libacme-brainfck-perl -libacme-damn-perl -libacme-eyedrops-perl -libacme-poe-knee-perl -libacpi -libai-fann-perl -libaio -libajaxtags-java -libalberta2 -libalgorithm-c3-perl -libalgorithm-checkdigits-perl -libalgorithm-combinatorics-perl -libalgorithm-dependency-perl -libalgorithm-diff-perl -libalgorithm-diff-xs-perl -libalgorithm-merge-perl -libalgorithm-munkres-perl -libalgorithm-numerical-sample-perl -libalgorithm-permute-perl -libaliased-perl -libalias-perl -libalien-sdl-perl -libalien-wxwidgets-perl -libalkimia -libalog -libalzabo-perl -libamazon-sqs-simple-perl -libantlr3c -libanydata-perl -libanyevent-aggressiveidle-perl -libanyevent-callback-perl -libanyevent-dbd-pg-perl -libanyevent-dbi-perl -libanyevent-forkobject-perl -libanyevent-httpd-perl -libanyevent-http-perl -libanyevent-i3-perl -libanyevent-irc-perl -libanyevent-perl -libanyevent-redis-perl -libanyevent-serialize-perl -libanyevent-tools-perl -libanyevent-xmpp-perl -libany-moose-perl -libany-template-processdir-perl -libao -libaopalliance-java -libaosd -libapache2-authcassimple-perl -libapache2-authcookie-perl -libapache2-authenntlm-perl -libapache2-mod-auth-cas -libapache2-mod-auth-memcookie -libapache2-mod-authn-sasl -libapache2-mod-authn-yubikey -libapache2-mod-authnz-external -libapache2-mod-auth-openid -libapache2-mod-auth-pam -libapache2-mod-auth-pgsql -libapache2-mod-auth-plain -libapache2-mod-auth-pubtkt -libapache2-mod-auth-tkt -libapache2-mod-authz-unixgroup -libapache2-mod-bw -libapache2-mod-defensible -libapache2-mod-encoding -libapache2-mod-fcgid -libapache2-mod-geoip -libapache2-mod-ldap-userdir -libapache2-mod-lisp -libapache2-mod-macro -libapache2-mod-nss -libapache2-mod-perl2 -libapache2-mod-python -libapache2-mod-qos -libapache2-mod-rivet -libapache2-mod-rpaf -libapache2-mod-ruid2 -libapache2-mod-xsendfile -libapache2-reload-perl -libapache2-sitecontrol-perl -libapache-admin-config-perl -libapache-asp-perl -libapache-authenhook-perl -libapache-authznetldap-perl -libapache-dbilogger-perl -libapache-dbi-perl -libapache-db-perl -libapache-gallery-perl -libapache-htgroup-perl -libapache-htpasswd-perl -libapache-mod-auth-kerb -libapache-mod-auth-radius -libapache-mod-encoding -libapache-mod-evasive -libapache-mod-jk -libapache-mod-layout -libapache-mod-log-sql -libapache-mod-musicindex -libapache-mod-random -libapache-mod-removeip -libapache-poi-java -libapache-session-browseable-perl -libapache-session-ldap-perl -libapache-session-perl -libapache-session-wrapper-perl -libapache-sessionx-perl -libapache-singleton-perl -libapp-cache-perl -libapp-cli-perl -libapp-cmd-perl -libapp-control-perl -libapp-daemon-perl -libappindicator -libapp-info-perl -libapp-nopaste-perl -libapp-options-perl -libapp-rad-perl -libapp-repl-perl -libapp-termcast-perl -libapreq2 -libapr-memcache -libapt-pkg-perl -libaqbanking -libarchive -libarchive-any-perl -libarchive-ar-perl -libarchive-peek-perl -libarchive-tar-wrapper-perl -libarchive-zip-perl -libarch-perl -libarray-compare-perl -libarray-diff-perl -libarray-printcols-perl -libarray-refelem-perl -libarray-unique-perl -libart-lgpl -libasa-perl -libaspect-perl -libass -libassa -libassuan -libast -libasterisk-agi-perl -libastro-fits-cfitsio-perl -libastro-fits-header-perl -libasync-interrupt-perl -libasync-mergepoint-perl -libasyncns -libatasmart -libatombus-perl -libatomic-ops -libatompub-perl -libaudio-cd-perl -libaudio-ecasound-perl -libaudio-file-perl -libaudio-flac-decoder-perl -libaudio-flac-header-perl -libaudiomask -libaudio-mixer-perl -libaudio-moosic-perl -libaudio-mpd-common-perl -libaudio-mpd-perl -libaudio-musepack-perl -libaudio-rpld-perl -libaudio-scan-perl -libaudio-scrobbler-perl -libaudio-wav-perl -libaudio-wma-perl -libaugeas-ruby -libaunit -libauthcas-perl -libauthen-bitcard-perl -libauthen-captcha-perl -libauthen-cas-client-perl -libauthen-dechpwd-perl -libauthen-krb5-admin-perl -libauthen-krb5-perl -libauthen-krb5-simple-perl -libauthen-ntlm-perl -libauthen-oath-perl -libauthen-pam-perl -libauthen-passphrase-perl -libauthen-radius-perl -libauthen-sasl-cyrus-perl -libauthen-sasl-perl -libauthen-simple-cdbi-perl -libauthen-simple-dbi-perl -libauthen-simple-dbm-perl -libauthen-simple-http-perl -libauthen-simple-kerberos-perl -libauthen-simple-ldap-perl -libauthen-simple-net-perl -libauthen-simple-pam-perl -libauthen-simple-passwd-perl -libauthen-simple-perl -libauthen-simple-radius-perl -libauthen-simple-smb-perl -libauthen-smb-perl -libauthen-tacacsplus-perl -libauthority-shared-perl -libauth-yubikey-decrypter-perl -libauth-yubikey-webclient-perl -libautobox-core-perl -libautobox-dump-perl -libautobox-list-util-perl -libautobox-perl -libautodie-perl -libautovivification-perl -libav -libavc1394 -libavg -libavl -libaws -libax25 -libaxiom-java -libbarcode-code128-perl -libbareword-filehandles-perl -libbase -libbash -libbasicplayer-java -libbenchmark-apps-perl -libbenchmark-progressbar-perl -libbenchmark-timer-perl -libbencode-perl -libberkeleydb-perl -libbest-perl -libb-hooks-endofscope-perl -libb-hooks-op-annotation-perl -libb-hooks-op-check-entersubforcv-perl -libb-hooks-op-check-perl -libb-hooks-op-ppaddr-perl -libb-hooks-parser-perl -libbiblio-citation-parser-perl -libbiblio-endnotestyle-perl -libbiblio-isis-perl -libbind -libbind-config-parser-perl -libbind-confparser-perl -libbinio -libbio-asn1-entrezgene-perl -libbio-chado-schema-perl -libbio-das-lite-perl -libbio-graphics-perl -libbio-mage-perl -libbio-mage-utils-perl -libbio-primerdesigner-perl -libbio-samtools-perl -libbio-scf-perl -libbitmask -libbit-vector-minimal-perl -libbit-vector-perl -libb-keywords-perl -libblocksruntime -libbloom-filter-perl -libbluedevil -libbluray -libbonobo -libbonoboui -libboolean-perl -libbot-basicbot-perl -libbot-training-perl -libboulder-perl -libb-perlreq-perl -libbpp-core -libbpp-phyl -libbpp-popgen -libbpp-qt -libbpp-raa -libbpp-seq -libbrahe -libbrowser-open-perl -libbs2b -libbsd -libbsd-arc4random-perl -libbsd-resource-perl -libbsf-java -libbtm-java -libbuffy -libbuffy-bindings -libburn -libbusiness-creditcard-perl -libbusiness-edi-perl -libbusiness-isbn-data-perl -libbusiness-isbn-perl -libbusiness-issn-perl -libbusiness-onlinepayment-authorizenet-perl -libbusiness-onlinepayment-ippay-perl -libbusiness-onlinepayment-openecho-perl -libbusiness-onlinepayment-payconnect-perl -libbusiness-onlinepayment-payflowpro-perl -libbusiness-onlinepayment-paymentech-perl -libbusiness-onlinepayment-perl -libbusiness-onlinepayment-tclink-perl -libbusiness-onlinepayment-transactioncentral-perl -libbusiness-onlinepayment-viaklix-perl -libbusiness-paypal-api-perl -libbusiness-tax-vat-validation-perl -libbusiness-us-usps-webtools-perl -libb-utils-perl -libbytelist-java -libbz2-ruby -libcaca -libcache-cache-perl -libcache-fastmmap-perl -libcache-historical-perl -libcache-memcached-fast-perl -libcache-memcached-managed-perl -libcache-memcached-perl -libcache-mmap-perl -libcache-perl -libcache-ref-perl -libcache-simple-timedexpiry-perl -libcairo-gobject-perl -libcairo-perl -libcal-dav-perl -libcalendar-simple-perl -libcam-pdf-perl -libcanberra -libcap2 -libcap-ng -libcapsinetwork -libcaptcha-recaptcha-perl -libcapture-tiny-perl -libcarp-always-perl -libcarp-assert-more-perl -libcarp-assert-perl -libcarp-clan-perl -libcarp-clan-share-perl -libcarp-datum-perl -libcatalyst-action-rest-perl -libcatalyst-actionrole-acl-perl -libcatalyst-authentication-credential-http-perl -libcatalyst-controller-actionrole-perl -libcatalyst-devel-perl -libcatalyst-engine-apache-perl -libcatalyst-engine-psgi-perl -libcatalyst-manual-perl -libcatalyst-model-cdbi-perl -libcatalyst-modules-extra-perl -libcatalyst-modules-perl -libcatalyst-perl -libcatalyst-plugin-log-dispatch-perl -libcatalyst-plugin-scheduler-perl -libcatalyst-plugin-smarturi-perl -libcatalyst-plugin-unicode-encoding-perl -libcatalyst-view-petal-perl -libcatalyst-view-tt-perl -libcatalystx-injectcomponent-perl -libcatalystx-leakchecker-perl -libcatalystx-simplelogin-perl -libccaudio2 -libccrtp -libccscript3 -libccss -libcdaudio -libcdb-file-perl -libcddb -libcddb-file-perl -libcddb-get-perl -libcddb-perl -libcdio -libcdk5 -libcdk-perl -libcec -libcgi-ajax-perl -libcgi-application-basic-plugin-bundle-perl -libcgi-application-dispatch-perl -libcgi-application-extra-plugin-bundle-perl -libcgi-application-perl -libcgi-application-plugin-actiondispatch-perl -libcgi-application-plugin-ajaxupload-perl -libcgi-application-plugin-anytemplate-perl -libcgi-application-plugin-authentication-perl -libcgi-application-plugin-authorization-perl -libcgi-application-plugin-autorunmode-perl -libcgi-application-plugin-captcha-perl -libcgi-application-plugin-configauto-perl -libcgi-application-plugin-config-simple-perl -libcgi-application-plugin-dbh-perl -libcgi-application-plugin-dbiprofile-perl -libcgi-application-plugin-devpopup-perl -libcgi-application-plugin-fillinform-perl -libcgi-application-plugin-formstate-perl -libcgi-application-plugin-forward-perl -libcgi-application-plugin-json-perl -libcgi-application-plugin-linkintegrity-perl -libcgi-application-plugin-logdispatch-perl -libcgi-application-plugin-messagestack-perl -libcgi-application-plugin-protectcsrf-perl -libcgi-application-plugin-ratelimit-perl -libcgi-application-plugin-requiressl-perl -libcgi-application-plugin-session-perl -libcgi-application-plugin-stream-perl -libcgi-application-plugin-tt-perl -libcgi-application-plugin-validaterm-perl -libcgi-application-plugin-viewcode-perl -libcgi-application-server-perl -libcgic -libcgicc -libcgi-compile-perl -libcgi-cookie-splitter-perl -libcgi-emulate-psgi-perl -libcgi-formalware-perl -libcgi-formbuilder-perl -libcgi-formbuilder-source-yaml-perl -libcgi-pm-perl -libcgi-psgi-perl -libcgi-session-driver-memcached-perl -libcgi-session-expiresessions-perl -libcgi-session-perl -libcgi-session-serialize-yaml-perl -libcgi-simple-perl -libcgi-ssi-parser-perl -libcgi-ssi-perl -libcgi-untaint-date-perl -libcgi-untaint-email-perl -libcgi-untaint-perl -libcgi-uploader-perl -libcgi-validop-perl -libcgi-xmlapplication-perl -libcgi-xmlform-perl -libcgi-xml-perl -libcgns -libcgroup -libchado-perl -libchamplain -libchart-clicker-perl -libchart-gnuplot-perl -libchart-perl -libchart-strip-perl -libcheck-isa-perl -libchemistry-elements-perl -libchemistry-formula-perl -libchewing -libchi-driver-memcached-perl -libchild-perl -libchipcard -libchi-perl -libcitadel -libcitygml -libclamav-client-perl -libclass-accessor-chained-perl -libclass-accessor-children-perl -libclass-accessor-class-perl -libclass-accessor-classy-perl -libclass-accessor-grouped-perl -libclass-accessor-lvalue-perl -libclass-accessor-named-perl -libclass-accessor-perl -libclass-adapter-perl -libclass-autouse-perl -libclass-base-perl -libclass-c3-adopt-next-perl -libclass-c3-componentised-perl -libclass-c3-perl -libclass-c3-xs-perl -libclass-container-perl -libclass-contract-perl -libclass-csv-perl -libclass-data-accessor-perl -libclass-data-inheritable-perl -libclass-date-perl -libclass-dbi-abstractsearch-perl -libclass-dbi-asform-perl -libclass-dbi-fromcgi-perl -libclass-dbi-fromform-perl -libclass-dbi-loader-perl -libclass-dbi-loader-relationship-perl -libclass-dbi-mysql-perl -libclass-dbi-pager-perl -libclass-dbi-perl -libclass-dbi-pg-perl -libclass-dbi-plugin-abstractcount-perl -libclass-dbi-plugin-pager-perl -libclass-dbi-plugin-perl -libclass-dbi-plugin-retrieveall-perl -libclass-dbi-plugin-type-perl -libclass-dbi-sqlite-perl -libclass-dbi-sweet-perl -libclass-default-perl -libclass-delegator-perl -libclass-errorhandler-perl -libclass-factory-perl -libclass-factory-util-perl -libclass-field-perl -libclass-gomor-perl -libclass-handle-perl -libclass-inner-perl -libclass-insideout-perl -libclass-inspector-perl -libclass-isa-perl -libclass-loader-perl -libclass-load-perl -libclass-load-xs-perl -libclass-makemethods-perl -libclass-meta-perl -libclass-methodmaker-perl -libclass-method-modifiers-perl -libclass-mixinfactory-perl -libclass-mix-perl -libclass-multimethods-perl -libclass-objecttemplate-perl -libclass-ooorno-perl -libclass-perl -libclass-pluggable-perl -libclass-prototyped-perl -libclass-returnvalue-perl -libclass-singleton-perl -libclass-spiffy-perl -libclass-std-fast-perl -libclass-std-perl -libclass-std-utils-perl -libclass-throwable-perl -libclass-trait-perl -libclass-trigger-perl -libclass-unload-perl -libclass-virtual-perl -libclass-whitehole-perl -libclass-xsaccessor-perl -libclaw -libcli -libclone-fast-perl -libclone-perl -libclone-pp-perl -libcloud -libclutter-perl -libcmis -libcobra-java -libcodemodel-java -libcolor-calc-perl -libcolor-library-perl -libcolor-palette-perl -libcolor-scheme-perl -libcommoncpp2 -libcommons-attributes-java -libcommons-cli-java -libcommons-codec-java -libcommons-collections3-java -libcommons-collections-java -libcommons-compress-java -libcommons-dbcp-java -libcommons-digester-java -libcommons-discovery-java -libcommons-el-java -libcommon-sense-perl -libcommons-fileupload-java -libcommons-jexl-java -libcommons-jxpath-java -libcommons-lang3-java -libcommons-lang-java -libcommons-launcher-java -libcommons-logging-java -libcommons-modeler-java -libcommons-net1-java -libcommons-net2-java -libcommons-openpgp-java -libcommons-validator-java -libcompface -libcompress-bzip2-perl -libcompress-raw-bzip2-perl -libcompress-raw-zlib-perl -libconcurrentlinkedhashmap-java -libconfig -libconfig-any-perl -libconfig-apacheformat-perl -libconfig-augeas-perl -libconfig-autoconf-perl -libconfig-auto-perl -libconfig-file-perl -libconfig-general-perl -libconfig-gitlike-perl -libconfig-grammar-perl -libconfig-inifiles-perl -libconfig-inihash-perl -libconfig-ini-perl -libconfig-jfdi-perl -libconfig-json-perl -libconfig-merge-perl -libconfig-model-approx-perl -libconfig-model-backend-augeas-perl -libconfig-model-cursesui-perl -libconfig-model-itself-perl -libconfig-model-openssh-perl -libconfig-model-perl -libconfig-model-tkui-perl -libconfig-mvp-perl -libconfig-mvp-reader-ini-perl -libconfig-pit-perl -libconfigreader-perl -libconfigreader-simple-perl -libconfig-record-perl -libconfig-scoped-perl -libconfig-simple-perl -libconfig-std-perl -libconfig-tiny-perl -libconfig-yaml-perl -libconstantine-java -libconst-fast-perl -libcontactsdb -libcontext-preserve-perl -libcontextual-return-perl -libconvert-ascii-armour-perl -libconvert-asn1-perl -libconvert-base32-perl -libconvert-ber-perl -libconvert-binary-c-perl -libconvert-binhex-perl -libconvert-color-perl -libconvert-nls-date-format-perl -libconvert-pem-perl -libconvert-tnef-perl -libconvert-units-perl -libconvert-uulib-perl -libconvert-ytext-perl -libcorelinux -libcoro-perl -libcourriel-perl -libcoyotl -libcoy-perl -libcpan-changes-perl -libcpan-checksums-perl -libcpandb-perl -libcpan-distnameinfo-perl -libcpan-inject-perl -libcpan-meta-check-perl -libcpan-meta-perl -libcpan-meta-requirements-perl -libcpan-meta-yaml-perl -libcpan-mini-perl -libcpan-perl-releases-perl -libcpan-uploader-perl -libcps-perl -libcpuset -libcql-parser-perl -libcriticism-perl -libcroco -libcrypt-blowfish-perl -libcrypt-cast5-perl -libcrypt-cbc-perl -libcrypt-des-ede3-perl -libcrypt-des-perl -libcrypt-dh-gmp-perl -libcrypt-dh-perl -libcrypt-dsa-perl -libcrypt-ecb-perl -libcrypt-eksblowfish-perl -libcrypt-gcrypt-perl -libcrypt-generatepassword-perl -libcrypt-gpg-perl -libcrypt-hcesha-perl -libcrypt-mysql-perl -libcrypto++ -libcrypt-openssl-bignum-perl -libcrypt-openssl-dsa-perl -libcrypt-openssl-random-perl -libcrypt-openssl-rsa-perl -libcrypt-openssl-x509-perl -libcrypt-passwdmd5-perl -libcrypt-random-source-perl -libcrypt-rc4-perl -libcrypt-rijndael-perl -libcrypt-saltedhash-perl -libcrypt-simple-perl -libcrypt-smbhash-perl -libcrypt-smime-perl -libcrypt-ssleay-perl -libcrypt-twofish-perl -libcryptui -libcrypt-unixcrypt-perl -libcrypt-unixcrypt-xs-perl -libcrypt-util-perl -libcrypt-x509-perl -libcsfml -libcsoap -libcss-dom-perl -libcss-minifier-perl -libcss-minifier-xs-perl -libcss-packer-perl -libcss-perl -libcss-squish-perl -libcss-tiny-perl -libcsv-java -libctapimkt -libctl -libcue -libcurses-perl -libcurses-ui-perl -libcurses-widgets-perl -libcvs-perl -libcxgb3 -libdaemon -libdaemon-control-perl -libdancer-logger-psgi-perl -libdancer-perl -libdancer-plugin-database-perl -libdancer-plugin-dbic-perl -libdancer-plugin-flashmessage-perl -libdancer-plugin-rest-perl -libdancer-session-cookie-perl -libdancer-session-memcached-perl -libdanga-socket-perl -libdansguardian-perl -libdap -libdata-alias-perl -libdata-amf-perl -libdata-buffer-perl -libdata-clone-perl -libdata-compare-perl -libdata-dumper-concise-perl -libdata-dumper-simple-perl -libdata-dump-perl -libdata-dump-streamer-perl -libdata-dumpxml-perl -libdata-entropy-perl -libdata-faker-perl -libdata-float-perl -libdata-flow-perl -libdata-format-html-perl -libdata-formvalidator-constraints-datetime-perl -libdata-formvalidator-perl -libdata-guid-perl -libdata-hexdumper-perl -libdata-ical-perl -libdata-integer-perl -libdata-javascript-anon-perl -libdata-javascript-perl -libdata-miscellany-perl -libdata-munge-perl -libdata-objectdriver-perl -libdata-optlist-perl -libdata-page-perl -libdatapager-perl -libdata-pageset-perl -libdata-parsebinary-perl -libdata-password-perl -libdata-peek-perl -libdata-phrasebook-loader-yaml-perl -libdata-phrasebook-perl -libdata-printer-perl -libdata-random-perl -libdata-report-perl -libdata-rmap-perl -libdata-section-perl -libdata-section-simple-perl -libdata-serializer-perl -libdata-show-perl -libdata-showtable-perl -libdata-sorting-perl -libdata-stag-perl -libdata-stream-bulk-perl -libdata-streamdeserializer-perl -libdata-streamserializer-perl -libdata-structure-util-perl -libdata-transformer-perl -libdata-treedumper-perl -libdata-treedumper-renderer-dhtml-perl -libdata-treedumper-renderer-gtk-perl -libdata-types-perl -libdata-util-perl -libdata-uuid-libuuid-perl -libdata-validate-domain-perl -libdata-validate-email-perl -libdata-validate-ip-perl -libdata-validate-uri-perl -libdata-visitor-perl -libdata-walk-perl -libdata-yaml-perl -libdate-calc-perl -libdate-calc-xs-perl -libdate-convert-perl -libdate-hijri-perl -libdate-iso8601-perl -libdate-jd-perl -libdate-leapyear-perl -libdate-manip-perl -libdate-pcalc-perl -libdate-simple-perl -libdatetime-astro-sunrise-perl -libdatetime-calendar-discordian-perl -libdatetime-event-cron-perl -libdatetime-event-ical-perl -libdatetime-event-recurrence-perl -libdatetime-event-sunrise-perl -libdatetime-format-builder-perl -libdatetime-format-dateparse-perl -libdatetime-format-db2-perl -libdatetime-format-dbi-perl -libdatetime-format-duration-perl -libdatetime-format-epoch-perl -libdatetime-format-flexible-perl -libdatetime-format-http-perl -libdatetime-format-ical-perl -libdatetime-format-iso8601-perl -libdatetime-format-mail-perl -libdatetime-format-mysql-perl -libdatetime-format-natural-perl -libdatetime-format-oracle-perl -libdatetime-format-pg-perl -libdatetime-format-sqlite-perl -libdatetime-format-strptime-perl -libdatetime-format-w3cdtf-perl -libdatetime-format-xsd-perl -libdatetime-locale-perl -libdatetime-perl -libdatetime-set-perl -libdatetime-timezone-perl -libdatetime-timezone-systemv-perl -libdatetime-timezone-tzfile-perl -libdatetimex-easy-perl -libdatrie -libdbd-anydata-perl -libdbd-csv-perl -libdbd-excel-perl -libdbd-firebird-perl -libdbd-ldap-perl -libdbd-mock-perl -libdbd-mysql-perl -libdbd-odbc-perl -libdbd-oracle-perl -libdbd-pg-perl -libdbd-sqlite2-perl -libdbd-sqlite3-perl -libdbd-sybase-perl -libdbd-xbase-perl -libdb-file-lock-perl -libdbi -libdbicx-testdatabase-perl -libdbi-drivers -libdbi-perl -libdbix-abstract-perl -libdbix-class-candy-perl -libdbix-class-cursor-cached-perl -libdbix-class-datetime-epoch-perl -libdbix-class-dynamicdefault-perl -libdbix-class-encodedcolumn-perl -libdbix-class-helpers-perl -libdbix-class-htmlwidget-perl -libdbix-class-inflatecolumn-ip-perl -libdbix-class-introspectablem2m-perl -libdbix-class-perl -libdbix-class-resultset-recursiveupdate-perl -libdbix-class-schema-loader-perl -libdbix-class-timestamp-perl -libdbix-class-tree-nestedset-perl -libdbix-connector-perl -libdbix-contextualfetch-perl -libdbix-datasource-perl -libdbix-dbschema-perl -libdbix-dbstag-perl -libdbix-dr-perl -libdbix-fulltextsearch-perl -libdbix-oo-perl -libdbix-password-perl -libdbix-profile-perl -libdbix-recordset-perl -libdbix-safe-perl -libdbix-searchbuilder-perl -libdbix-sequence-perl -libdbix-simple-perl -libdbix-xmlmessage-perl -libdbix-xml-rdb-perl -libdb-je-java -libdbm-deep-perl -libdbusmenu -libdbusmenu-qt -libdc0 -libdc1394-22 -libdca -libdebian-copyright-perl -libdebian-installer -libdebian-package-html-perl -libdebug -libdebug-client-perl -libdebug-trace-perl -libdecodeqr -libdesktop-agnostic -libdesktop-notify-perl -libdessert0.87 -libdevel-argnames-perl -libdevel-backtrace-perl -libdevel-beginlift-perl -libdevel-bt-perl -libdevel-caller-ignorenamespaces-perl -libdevel-caller-perl -libdevel-calltrace-perl -libdevel-checklib-perl -libdevel-cover-perl -libdevel-cycle-perl -libdevel-declare-perl -libdevel-dprof-perl -libdevel-dumpvar-perl -libdevel-ebug-perl -libdevel-findref-perl -libdevel-gdb-perl -libdevel-globaldestruction-perl -libdevel-hide-perl -libdevel-leak-perl -libdevel-lexalias-perl -libdevel-nytprof-perl -libdevel-partialdump-perl -libdevel-patchperl-perl -libdevel-pragma-perl -libdevel-profile-perl -libdevel-ptkdb-perl -libdevel-refactor-perl -libdevel-refcount-perl -libdevel-repl-perl -libdevel-simpletrace-perl -libdevel-size-perl -libdevel-stacktrace-ashtml-perl -libdevel-stacktrace-perl -libdevel-stacktrace-withlexicals-perl -libdevel-symdump-perl -libdevel-trace-perl -libdevice-cdio-perl -libdevice-gsm-perl -libdevice-modem-perl -libdevice-serialport-perl -libdevice-usb-pcsensor-hidtemper-perl -libdevice-usb-perl -libdigest-bubblebabble-perl -libdigest-crc-perl -libdigest-hmac-perl -libdigest-jhash-perl -libdigest-md2-perl -libdigest-md4-perl -libdigest-md5-file-perl -libdigest-perl -libdigest-sha-perl -libdigest-whirlpool-perl -libdirectory-scratch-perl -libdirectory-scratch-structured-perl -libdir-purge-perl -libdir-self-perl -libdisasm -libdiscid -libdispatch -libdisplaymigration -libdist-metadata-perl -libdist-zilla-perl -libdist-zilla-plugin-changelogfromgit-perl -libdist-zilla-plugin-git-perl -libdist-zilla-plugin-podspellingtests-perl -libdist-zilla-plugin-podweaver-perl -libdist-zilla-plugin-prepender-perl -libdist-zilla-plugin-run-perl -libdist-zilla-plugins-cjm-perl -libdivecomputer -libdjconsole -libdkim -libdmapsharing -libdmtx -libdmx -libdns-zoneparse-perl -libdockapp -libdpkg-log-perl -libdrm -libdr-tarantool-perl -libdrumstick -libdshconfig -libdssialsacompat -libdtdparser-java -libdublincore-record-perl -libdumb -libdumbnet -libdv -libdvb -libdvbcsa -libdvbpsi -libdvdnav -libdvdread -libeatmydata -libebml -libebook-tools-perl -libechonest -libedit -libee -libelf -libelixirfm-perl -libemail-abstract-perl -libemail-address-perl -libemail-date-format-perl -libemail-date-perl -libemail-filter-perl -libemail-find-perl -libemail-folder-perl -libemail-foldertype-perl -libemail-localdelivery-perl -libemail-messageid-perl -libemail-mime-contenttype-perl -libemail-mime-createhtml-perl -libemail-mime-encodings-perl -libemail-mime-perl -libemail-outlook-message-perl -libemail-received-perl -libemail-sender-perl -libemail-sender-transport-smtp-tls-perl -libemail-send-io-perl -libemail-send-perl -libemail-simple-perl -libemail-thread-perl -libemail-valid-loose-perl -libemail-valid-perl -libencode-arabic-perl -libencode-detect-perl -libencode-eucjpms-perl -libencode-hanextra-perl -libencode-imaputf7-perl -libencode-jis2k-perl -libencode-locale-perl -libencode-perl -libend-perl -libenv-path-perl -libenv-ps1-perl -libenv-sanctify-perl -libepc -libepsilon -libept -liberror-perl -libescape-ruby -libesmtp -libestr -libetpan -libev -libeval-closure-perl -libeval-context-perl -libevent -libeventdb -libevent-perl -libevent-rpc-perl -libevocosm -libev-perl -libewf -libexcel-template-perl -libexcel-template-plus-perl -libexcel-writer-xlsx-perl -libexception-class-dbi-perl -libexception-class-perl -libexception-class-trycatch-perl -libexception-handler-perl -libexif -libexif-gtk -libexml-java -libexosip2 -libexpect-perl -libexpect-php5 -libexpect-simple-perl -libexplain -libexporter-easy-perl -libexporter-lite-perl -libexporter-renaming-perl -libexporter-tidy-perl -libextractor -libextractor-java -libextractor-python -libexttextcat -libextutils-autoinstall-perl -libextutils-cbuilder-perl -libextutils-cchecker-perl -libextutils-depends-perl -libextutils-f77-perl -libextutils-libbuilder-perl -libextutils-parsexs-perl -libextutils-pkgconfig-perl -libextutils-xsbuilder-perl -libextutils-xspp-perl -libezmorph-java -libf2c2 -libfakekey -libfam-ruby -libfann -libfax-hylafax-client-perl -libfcgi -libfcgi-perl -libfcgi-procmanager-perl -libfcgi-ruby -libfeed-find-perl -libffado -libffi -libfile-basedir-perl -libfile-bom-perl -libfile-cache-perl -libfile-changenotify-perl -libfile-chdir-perl -libfile-chmod-perl -libfile-copy-link-perl -libfile-copy-recursive-perl -libfile-counterfile-perl -libfile-countlines-perl -libfile-desktopentry-perl -libfile-dircompare-perl -libfile-fcntllock-perl -libfile-finder-perl -libfile-find-object-perl -libfile-find-object-rule-perl -libfile-find-rule-perl -libfile-find-rule-perl-perl -libfile-find-rule-vcs-perl -libfile-find-wanted-perl -libfile-flat-perl -libfile-flock-perl -libfile-fnmatch-perl -libfile-fu-perl -libfilehandle-fmode-perl -libfilehandle-unget-perl -libfile-homedir-perl -libfile-inplace-perl -libfile-keepass-perl -libfile-libmagic-perl -libfile-listing-perl -libfile-localizenewlines-perl -libfile-mimeinfo-perl -libfile-mmagic-xs-perl -libfile-modified-perl -libfile-ncopy-perl -libfile-next-perl -libfile-nfslock-perl -libfile-path-expand-perl -libfile-path-tiny-perl -libfile-pid-perl -libfile-policy-perl -libfile-pushd-perl -libfile-queue-perl -libfile-readbackwards-perl -libfile-read-perl -libfile-remove-perl -libfile-rsync-perl -libfile-rsyncp-perl -libfile-scan-perl -libfile-searchpath-perl -libfile-sharedir-install-perl -libfile-sharedir-par-perl -libfile-sharedir-perl -libfile-slurp-perl -libfile-slurp-unicode-perl -libfile-spec-native-perl -libfile-spec-perl -libfile-sync-perl -libfilesys-df-perl -libfilesys-diskspace-perl -libfilesys-notify-simple-perl -libfilesys-smbclient-perl -libfilesys-statvfs-perl -libfilesystem-ruby -libfile-tail-perl -libfile-touch-perl -libfile-type-perl -libfile-type-webimages-perl -libfile-userconfig-perl -libfile-util-perl -libfile-which-perl -libfile-wildcard-perl -libfilter-eof-perl -libfilter-perl -libfilter-template-perl -libfinance-bank-ie-permanenttsb-perl -libfinance-qif-perl -libfinance-quotehist-perl -libfinance-quote-perl -libfinance-streamer-perl -libfindbin-libs-perl -libfind-lib-perl -libfishsound -libfiu -libfixposix -libflexdock-java -libflickr-api-perl -libflickrnet -libflickr-upload-perl -libflorist -libfm -libfolia -libfont-afm-perl -libfontenc -libfont-freetype-perl -libfonts-java -libfont-ttf-perl -libforest-perl -libforks-perl -libformat-human-bytes-perl -libforms -libformula -libformvalidator-simple-perl -libfortune-perl -libfpdf-tpl-php -libfpdi-php -libfprint -libfreemarker-java -libfreenect -libfreezethaw-perl -libfrontier-rpc-perl -libfs -libfsobasics -libfsoframework -libfso-glib -libfsoresource -libfsosystem -libfsotransport -libftdi -libfuse-perl -libfusioninventory-agent-task-deploy-perl -libfusioninventory-agent-task-esx-perl -libg15 -libg15render -libg3d -libgadu -libgarmin -libgc -libgcal -libgcgi -libgconf-bridge -libgcr410 -libgcrypt11 -libgctp -libgd2 -libgda5 -libgdal-grass -libgdata -libgd-barcode-perl -libgdchart-gd2 -libgdf -libgd-gd2-noxpm-perl -libgd-gd2-perl -libgd-graph3d-perl -libgd-graph-perl -libgdiplus -libgd-securityimage-perl -libgd-svg-perl -libgd-text-perl -libgearman-client-perl -libgedcom-perl -libgee -libgeier -libgenome -libgeo-coder-googlev3-perl -libgeo-coordinates-itm-perl -libgeo-coordinates-utm-perl -libgeo-distance-perl -libgeo-distance-xs-perl -libgeo-googleearth-pluggable-perl -libgeo-google-mapobject-perl -libgeography-countries-perl -libgeography-nationalgrid-perl -libgeo-helmerttransform-perl -libgeo-ipfree-perl -libgeo-ip-perl -libgeo-metar-perl -libgeometry-primitive-perl -libgeo-osm-tiles-perl -libgeo-point-perl -libgeo-postcode-perl -libgeo-proj4-perl -libgeotiff-dfsg -libgetargs-long-perl -libgetdata -libgetopt++ -libgetopt-argvfile-perl -libgetopt-declare-perl -libgetopt-euclid-perl -libgetopt-java -libgetopt-long-descriptive-perl -libgetopt-lucid-perl -libgetopt-mixed-perl -libgetopt-simple-perl -libgetopt-tabular-perl -libgetopt-usaginator-perl -libgettext-commons-java -libgfshare -libghemical -libgig -libgii -libgit-pure-perl -libgit-repository-perl -libgit-wrapper-perl -libgksu -libglade2 -libglademm2.4 -libglazedlists-java -libglib-object-introspection-perl -libglib-perl -libgmpada -libgnome -libgnome2-canvas-perl -libgnome2-gconf-perl -libgnome2-perl -libgnome2-vfs-perl -libgnome2-wnck-perl -libgnomecanvas -libgnomecanvasmm2.6 -libgnomecups -libgnomekbd -libgnome-keyring -libgnome-media-profiles -libgnomemm2.6 -libgnomeprint -libgnomeprintui -libgnomeui -libgnomeuimm2.6 -libgnuinet-java -libgnujaf-java -libgnumail-java -libgnupg-interface-perl -libgnupg-perl -libgnu-regexp-java -libgoo-canvas-perl -libgoogle-collections-java -libgoogle-gson-java -libgooglepinyin -libgo-perl -libgpars-groovy-java -libgpelaunch -libgpepimc -libgpeschedule -libgpevtype -libgpewidget -libgpg-error -libgphoto2 -libgpiv -libgpod -libgps-point-perl -libgraph-easy-as-svg-perl -libgraph-easy-perl -libgraphics-colornames-perl -libgraphics-colornames-www-perl -libgraphics-colorobject-perl -libgraphics-color-perl -libgraphics-gnuplotif-perl -libgraphics-libplot-perl -libgraphics-primitive-driver-cairo-perl -libgraphics-primitive-perl -libgraph-perl -libgraph-readwrite-perl -libgraphviz-perl -libgraph-writer-graphviz-perl -libgravatar-url-perl -libgrits -libgroboutils-java -libgrss -libgsecuredelete -libgsf -libgsm -libgsm0710 -libgsm0710mux -libgssapi-perl -libgssglue -libgstreamer-interfaces-perl -libgstreamer-perl -libgtextutils -libgtk2-ex-entry-pango-perl -libgtk2-ex-podviewer-perl -libgtk2-ex-printdialog-perl -libgtk2-ex-simple-list-perl -libgtk2-ex-volumebutton-perl -libgtk2-gladexml-perl -libgtk2-gladexml-simple-perl -libgtk2-imageview-perl -libgtk2-notify-perl -libgtk2-perl -libgtk2-sourceview2-perl -libgtk2-spell-perl -libgtk2-trayicon-perl -libgtk2-traymanager-perl -libgtk2-unique-perl -libgtk3-perl -libgtkada -libgtkdatabox -libgtksourceviewmm -libgtkstylus -libgtop2 -libguac -libguac-client-rdp -libguac-client-vnc -libguard-perl -libguess -libguestfs -libgusb -libguytools2 -libgweather -libgwenhywfar -libgxps -libhamcrest-java -libhandoff -libhangul -libharu -libhash-asobject-perl -libhash-case-perl -libhash-fieldhash-perl -libhash-flatten-perl -libhash-merge-perl -libhash-merge-simple-perl -libhash-moreutils-perl -libhash-multivalue-perl -libhash-util-fieldhash-compat-perl -libhash-withdefaults-perl -libhbaapi -libhbalinux -libhdate -libhdf4 -libhdhomerun -libheap-perl -libheimdal-kadm5-perl -libhibernate3-java -libhibernate-commons-annotations-java -libhibernate-jbosscache-java -libhibernate-validator-java -libhmsbeagle -libhook-lexwrap-perl -libhook-wrapsub-perl -libhtml-autopagerize-perl -libhtml-auto-perl -libhtml-calendarmonth-perl -libhtml-calendarmonthsimple-perl -libhtml-clean-perl -libhtml-copy-perl -libhtml-defang-perl -libhtml-diff-perl -libhtml-display-perl -libhtml-element-extended-perl -libhtml-embedded-turtle-perl -libhtml-encoding-perl -libhtml-entities-numbered-perl -libhtml-fillinform-perl -libhtml-format-perl -libhtml-formattext-withlinks-andtables-perl -libhtml-formattext-withlinks-perl -libhtml-formfu-model-dbic-perl -libhtml-formfu-perl -libhtml-formhandler-perl -libhtml-form-perl -libhtml-fromtext-perl -libhtml-highlight-perl -libhtml-html5-entities-perl -libhtml-html5-microdata-parser-perl -libhtml-html5-outline-perl -libhtml-html5-parser-perl -libhtml-html5-sanity-perl -libhtml-html5-writer-perl -libhtml-htmltokenizer-ruby -libhtml-linkextractor-perl -libhtml-lint-perl -libhtml-mason-perl -libhtml-mason-psgihandler-perl -libhtml-microformats-perl -libhtml-packer-perl -libhtmlparser-java -libhtml-parser-perl -libhtml-popuptreeselect-perl -libhtml-prototype-perl -libhtml-quoted-perl -libhtml-rewriteattributes-perl -libhtml-scrubber-perl -libhtml-selector-xpath-perl -libhtml-simpleparse-perl -libhtml-stream-perl -libhtml-strip-perl -libhtml-stripscripts-parser-perl -libhtml-stripscripts-perl -libhtml-tableextract-perl -libhtml-tableparser-perl -libhtml-table-perl -libhtml-tagcloud-perl -libhtml-tagfilter-perl -libhtml-tagset-perl -libhtml-template-compiled-perl -libhtml-template-dumper-perl -libhtml-template-expr-perl -libhtml-template-perl -libhtml-template-pluggable-perl -libhtml-template-pro-perl -libhtml-tidy-perl -libhtml-tiny-perl -libhtml-toc-perl -libhtml-tokeparser-simple-perl -libhtml-treebuilder-libxml-perl -libhtml-treebuilder-xpath-perl -libhtml-tree-perl -libhtml-widget-perl -libhtml-widgets-navmenu-perl -libhtml-widgets-selectlayers-perl -libhtml-wikiconverter-dokuwiki-perl -libhtml-wikiconverter-kwiki-perl -libhtml-wikiconverter-markdown-perl -libhtml-wikiconverter-mediawiki-perl -libhtml-wikiconverter-moinmoin-perl -libhtml-wikiconverter-oddmuse-perl -libhtml-wikiconverter-perl -libhtml-wikiconverter-phpwiki-perl -libhtml-wikiconverter-pmwiki-perl -libhtml-wikiconverter-snipsnap-perl -libhtml-wikiconverter-tikiwiki-perl -libhtml-wikiconverter-usemod-perl -libhtml-wikiconverter-wakkawiki-perl -libhtml-wikiconverter-wikkawiki-perl -libhtp -libhttp-async-perl -libhttp-body-perl -libhttp-browserdetect-perl -libhttp-cache-transparent-perl -libhttp-cookies-perl -libhttp-daemon-perl -libhttp-daemon-ssl-perl -libhttp-date-perl -libhttp-dav-perl -libhttp-exception-perl -libhttp-link-parser-perl -libhttp-lite-perl -libhttp-lrdd-perl -libhttp-message-perl -libhttp-negotiate-perl -libhttp-oai-perl -libhttp-parser-perl -libhttp-parser-xs-perl -libhttp-proxy-perl -libhttp-recorder-perl -libhttp-request-ascgi-perl -libhttp-request-params-perl -libhttp-response-encoding-perl -libhttp-server-simple-authen-perl -libhttp-server-simple-mason-perl -libhttp-server-simple-perl -libhttp-server-simple-psgi-perl -libhttp-server-simple-recorder-perl -libhttp-server-simple-static-perl -libhttp-tiny-perl -libhx -libi18n-acceptlanguage-perl -libi18n-charset-perl -libibatis-java -libibcm -libibcommon -libibmad -libibtk -libibumad -libibverbs -libical -libical-parser-html-perl -libical-parser-perl -libical-parser-sax-perl -libice -libicns -libicon-famfamfam-silk-perl -libics -libid3tag -libident -libidl -libidn -libidn2-0 -libidna-punycode-perl -libiec61883 -libieee1284 -libifp -libiksemel -libima-dbi-perl -libimage-base-bundle-perl -libimage-exif-perl -libimage-exiftool-perl -libimage-imlib2-perl -libimage-info-perl -libimage-librsvg-perl -libimage-math-constrain-perl -libimage-metadata-jpeg-perl -libimager-perl -libimager-qrcode-perl -libimage-seek-perl -libimage-size-perl -libimap-admin-perl -libimlib2-ruby -libimobiledevice -libindi -libindicate -libindicate-qt -libindicator -libindirect-perl -libinfinity -libinline-files-perl -libinline-perl -libinnodb -libinstpatch -libint -libinternals-perl -libintl-perl -libio-aio-perl -libio-all-lwp-perl -libio-all-perl -libio-async-loop-epoll-perl -libio-async-loop-glib-perl -libio-async-perl -libio-bufferedselect-perl -libio-captureoutput-perl -libio-capture-perl -libio-compress-perl -libiodbc2 -libio-digest-perl -libio-dirent-perl -libio-epoll-perl -libio-file-withpath-perl -libio-handle-util-perl -libio-html-perl -libio-interactive-perl -libio-interface-perl -libio-lcdproc-perl -libio-lockedfile-perl -libio-multiplex-perl -libio-prompter-perl -libio-prompt-perl -libio-pty-easy-perl -libio-pty-perl -libio-socket-inet6-perl -libio-socket-ip-perl -libio-socket-multicast6-perl -libio-socket-multicast-perl -libio-socket-socks-perl -libio-socket-ssl-perl -libio-string-perl -libio-stty-perl -libio-tee-perl -libio-tiecombine-perl -libipathverbs -libipc-pubsub-perl -libipc-run3-perl -libipc-run-perl -libipc-run-safehandles-perl -libipc-shareable-perl -libipc-sharedcache-perl -libipc-sharelite-perl -libipc-signal-perl -libipc-system-simple-perl -libiptables-chainmgr-perl -libiptables-parse-perl -libiptcdata -libircclient -libirc-formatting-html-perl -libirclib-java -libirc-utils-perl -libirman -libiscsi -libiscwt-java -libisfreetype-java -libisnativec-java -libisoburn -libisofs -libisrt-java -libitext1-java -libitext5-java -libitext-java -libitl -libitl-gobject -libitpp -libixp -libj2ssh-java -libjaba-client-java -libjackson-json-java -libjama -libjamon-java -libjaudiotagger-java -libjava-jdbc-clojure -libjavascript-beautifier-perl -libjavascript-minifier-perl -libjavascript-minifier-xs-perl -libjavascript-packer-perl -libjavascript-rpc-perl -libjaxen-java -libjaxp1.3-java -libjazzy-java -libjbcrypt-java -libjboss-aop-java -libjboss-cache1-java -libjboss-cache2-java -libjboss-cache3-java -libjboss-classloader-java -libjboss-common-java -libjboss-deployers-java -libjboss-integration-java -libjboss-managed-java -libjboss-marshalling-java -libjboss-metadata-java -libjboss-microcontainer-java -libjboss-profiler-java -libjboss-reflect-java -libjboss-remoting-java -libjboss-serialization-java -libjboss-vfs-java -libjboss-web-services-java -libjboss-xml-binding-java -libjbzip2-java -libjcalendar-java -libjcip-annotations-java -libjcode-perl -libjcode-pm-perl -libjcommon-java -libjconv -libjdbm-java -libjdepend-java -libjdo-api-java -libjdom1-java -libjemmy2-java -libjena-iri-java -libje-perl -libjettison-java -libjfreechart-java -libjgoodies-animation-java -libjgoodies-binding-java -libjgoodies-common-java -libjgoodies-forms-java -libjgoodies-looks-java -libjgraph-java -libjgrapht0.6-java -libjgrapht0.8-java -libjgraphx-java -libjgroups2.6-java -libjgroups-java -libjhlabs-filters-java -libjibx1.1-java -libjibx1.2-java -libjifty-dbi-perl -libjifty-plugin-authentication-bitcard-perl -libjifty-plugin-authentication-cas-perl -libjifty-plugin-authentication-facebook-perl -libjifty-plugin-authentication-ldap-perl -libjifty-plugin-authzldap-perl -libjifty-plugin-chart-perl -libjifty-plugin-comment-perl -libjifty-plugin-googlemap-perl -libjifty-plugin-oauth-perl -libjifty-plugin-openid-perl -libjifty-plugin-sitenews-perl -libjifty-plugin-userpic-perl -libjifty-plugin-wikitoolbar-perl -libjira-client-perl -libjlatexmath-java -libjlayer-java -libjlha-java -libjmac-java -libjna-java -libjna-posix-java -libjnr-posix-java -libjoda-time-java -libjogl2-java -libjogl-java -libjorbis-java -libjpedal-jbig2-java -libjpeg6b -libjpeg8 -libjpfcodegen-java -libjpf-java -libjrosetta-java -libjs-edit-area -libjs-extjs -libjson-any-perl -libjsoncpp -libjson-java -libjson-perl -libjson-pp-perl -libjson-rpc-perl -libjson-xs-perl -libjspeex-java -libjsr166y-java -libjsr305-java -libjsr311-api-java -libjs-swfobject -libjs-swfupload -libjswingreader-java -libjsyntaxpane-java -libjtds-java -libjtype-java -libjxp-java -libkal -libkarma -libkate -libkdcraw -libkdeedu -libkdtree++ -libkexiv2 -libkibi -libkinosearch1-perl -libkiokudb-backend-dbi-perl -libkiokudb-perl -libkipi -libkmfl -libkml -libkmlframework-java -libkohana2-php -libkohana3.1-php -libkohana3.2-php -libkqueue -libksane -libksba -libktoblzcheck -libktorrent -libkwargs-perl -libkwiki-cache-perl -libkwiki-perl -liblaf-plugin-java -liblaf-widget-java -liblarch -liblarch-gtk -liblas -liblastfm -liblastfm-java -liblatex-decode-perl -liblatex-driver-perl -liblatex-encode-perl -liblatex-table-perl -liblatex-tom-perl -liblayout -liblayout-manager-perl -liblchown-perl -liblexical-persistence-perl -liblexical-sealrequirehints-perl -liblib-abs-perl -liblibrary-callnumber-lc-perl -liblicense -liblinear -liblinebreak2 -liblingua-de-ascii-perl -liblingua-en-inflect-number-perl -liblingua-en-inflect-perl -liblingua-en-inflect-phrase-perl -liblingua-en-namecase-perl -liblingua-en-nameparse-perl -liblingua-en-numbers-ordinate-perl -liblingua-en-tagger-perl -liblingua-en-words2nums-perl -liblingua-es-numeros-perl -liblingua-identify-perl -liblingua-ispell-perl -liblingua-preferred-perl -liblingua-pt-stemmer-perl -liblingua-stem-perl -liblingua-stem-snowball-da-perl -liblingua-stem-snowball-perl -liblingua-stopwords-perl -liblinux-distribution-packages-perl -liblinux-distribution-perl -liblinux-dvb-perl -liblinux-inotify2-perl -liblinux-kernelsort-perl -liblinux-lvm-perl -liblinux-usermod-perl -liblip -liblist-allutils-perl -liblist-compare-perl -liblist-maker-perl -liblist-moreutils-perl -liblist-utilsby-perl -liblivejournal-perl -liblivemedia -liblo -libloader -libload-perl -liblocale-currency-format-perl -liblocale-gettext-perl -liblocale-hebrew-perl -liblocale-maketext-fuzzy-perl -liblocale-maketext-gettext-perl -liblocale-maketext-lexicon-perl -liblocale-msgfmt-perl -liblocale-po-perl -liblocales-perl -liblocale-subcountry-perl -liblocale-us-perl -liblocal-lib-perl -liblockfile -liblockfile-simple-perl -liblog4ada -liblog-agent-logger-perl -liblog-agent-perl -liblog-agent-rotate-perl -liblog-any-adapter-dispatch-perl -liblog-any-adapter-perl -liblog-any-perl -liblog-contextual-perl -liblog-dispatch-array-perl -liblog-dispatch-config-perl -liblog-dispatch-configurator-any-perl -liblog-dispatch-filerotate-perl -liblog-dispatchouli-perl -liblog-dispatch-perl -liblogfile-rotate-perl -liblogger-syslog-perl -liblog-handler-perl -liblog-log4perl-perl -liblog-loglite-perl -liblognorm -liblog-report-perl -liblog-tracemessages-perl -liblog-trace-perl -libloki -liblouis -liblouisutdml -liblouisxml -liblqr -liblrdf -liblscp -libltcsmpte -liblucene-queryparser-perl -liblunar -liblwp-authen-negotiate-perl -liblwp-authen-oauth-perl -liblwp-authen-wsse-perl -liblwp-mediatypes-perl -liblwp-online-perl -liblwp-protocol-http-socketunix-perl -liblwp-protocol-https-perl -liblwp-protocol-psgi-perl -liblwp-protocol-socks-perl -liblwp-useragent-determined-perl -liblwpx-paranoidagent-perl -libm4ri -libmaa -libmad -libmail-box-perl -libmail-bulkmail-perl -libmail-cclient-perl -libmail-checkuser-perl -libmail-deliverystatus-bounceparser-perl -libmail-dkim-perl -libmail-field-received-perl -libmail-gnupg-perl -libmail-imapclient-perl -libmail-imaptalk-perl -libmail-listdetector-perl -libmail-mbox-messageparser-perl -libmail-mboxparser-perl -libmail-milter-perl -libmail-pop3client-perl -libmail-rfc822-address-perl -libmail-sendeasy-perl -libmail-sendmail-perl -libmail-srs-perl -libmail-thread-perl -libmailtools-perl -libmail-verify-perl -libmail-verp-perl -libmakefile-dom-perl -libmakefile-parser-perl -libmarc-charset-perl -libmarc-crosswalk-dublincore-perl -libmarc-lint-perl -libmarc-perl -libmarc-record-perl -libmarc-xml-perl -libmarkdown-php -libmason-perl -libmason-plugin-cache-perl -libmason-plugin-htmlfilters-perl -libmason-plugin-routersimple-perl -libmasonx-interp-withcallbacks-perl -libmasonx-processdir-perl -libmasonx-request-withapachesession-perl -libmatchbox -libmath++ -libmath-algebra-symbols-perl -libmath-base36-perl -libmath-base85-perl -libmath-basecalc-perl -libmath-basecnv-perl -libmath-bezier-perl -libmath-bigint-gmp-perl -libmath-bigint-perl -libmath-calculus-differentiate-perl -libmath-calculus-expression-perl -libmath-calculus-newtonraphson-perl -libmath-calc-units-perl -libmath-combinatorics-perl -libmath-complex-perl -libmath-derivative-perl -libmatheval -libmath-fibonacci-perl -libmath-gmp-perl -libmath-gradient-perl -libmath-nocarry-perl -libmath-numbercruncher-perl -libmath-polygon-perl -libmath-random-isaac-perl -libmath-random-isaac-xs-perl -libmath-random-mt-perl -libmath-random-oo-perl -libmath-randomorg-perl -libmath-random-tt800-perl -libmath-round-perl -libmath-sparsematrix-perl -libmath-sparsevector-perl -libmath-spline-perl -libmath-symbolic-perl -libmath-tamuanova-perl -libmath-vec-perl -libmath-vecstat-perl -libmath-vector-real-kdtree-perl -libmath-vector-real-perl -libmatio -libmatroska -libmatthew-java -libmcrypt -libmdsp -libmecab-java -libmecab-perl -libmediainfo -libmediawiki-api-perl -libmemcache -libmemcached -libmemoize-expirelru-perl -libmemoize-memcached-perl -libmetadata-extractor-java -libmethod-alias-perl -libmethod-autoload-perl -libmethod-signatures-perl -libmethod-signatures-simple-perl -libmicroba-java -libmicrohttpd -libmidi-perl -libmiglayout-java -libmikmod -libmime-base32-perl -libmime-base64-urlsafe-perl -libmime-charset-perl -libmimedir -libmimedir-gnome -libmime-encwords-perl -libmime-explode-perl -libmime-lite-html-perl -libmime-lite-perl -libmime-tools-perl -libmime-types-perl -libmimic -libmixin-extrafields-param-perl -libmixin-extrafields-perl -libmixin-linewise-perl -libmkdoc-xml-perl -libmkv -libmldbm-perl -libmldbm-sync-perl -libmlx4 -libmms -libmng -libmnl -libmocked-perl -libmodbus -libmodelfile -libmodem-vgetty-perl -libmodern-perl-perl -libmodplug -libmodule-build-perl -libmodule-corelist-perl -libmodule-cpanfile-perl -libmodule-cpants-analyse-perl -libmodule-depends-perl -libmodule-extract-perl -libmodule-extract-use-perl -libmodule-extractuse-perl -libmodule-find-perl -libmodule-implementation-perl -libmodule-info-perl -libmodule-inspector-perl -libmodule-install-authorrequires-perl -libmodule-install-autolicense-perl -libmodule-install-automanifest-perl -libmodule-install-doapchangesets-perl -libmodule-install-doap-perl -libmodule-install-manifestskip-perl -libmodule-install-perl -libmodule-install-rdf-perl -libmodule-install-readmefrompod-perl -libmodule-install-trustmetayml-perl -libmodule-install-xsutil-perl -libmodule-load-conditional-perl -libmodule-manifest-perl -libmodule-manifest-skip-perl -libmodule-math-depends-perl -libmodule-metadata-perl -libmodule-optional-perl -libmodule-packaged-perl -libmodule-package-perl -libmodule-pluggable-fast-perl -libmodule-pluggable-ordered-perl -libmodule-refresh-perl -libmodule-runtime-perl -libmodule-scandeps-perl -libmodule-signature-perl -libmodule-starter-pbp-perl -libmodule-starter-perl -libmodule-starter-plugin-cgiapp-perl -libmodule-starter-plugin-simplestore-perl -libmodule-starter-plugin-tt2-perl -libmodule-starter-smart-perl -libmodule-used-perl -libmodule-util-perl -libmodule-versions-report-perl -libmoe -libmojolicious-perl -libmojolicious-plugin-basicauth-perl -libmojomojo-perl -libmojo-server-fastcgi-perl -libmongo-client -libmongodb-perl -libmonitoring-availability-perl -libmonitoring-livestatus-perl -libmonkey-patch-perl -libmoo-perl -libmoose-autobox-perl -libmoose-perl -libmoosex-aliases-perl -libmoosex-app-cmd-perl -libmoosex-async-perl -libmoosex-attribute-chained-perl -libmoosex-attributehelpers-perl -libmoosex-attributeshortcuts-perl -libmoosex-blessed-reconstruct-perl -libmoosex-clone-perl -libmoosex-compiletime-traits-perl -libmoosex-configfromfile-perl -libmoosex-daemonize-perl -libmoosex-declare-perl -libmoosex-emulate-class-accessor-fast-perl -libmoosex-followpbp-perl -libmoosex-getopt-perl -libmoosex-hasdefaults-perl -libmoosex-has-sugar-perl -libmoosex-insideout-perl -libmoosex-lazyrequire-perl -libmoosex-log-log4perl-perl -libmoosex-markasmethods-perl -libmoosex-meta-typeconstraint-forcecoercion-perl -libmoosex-methodattributes-perl -libmoosex-method-signatures-perl -libmoosex-multiinitarg-perl -libmoosex-multimethods-perl -libmoosex-nonmoose-perl -libmoosex-object-pluggable-perl -libmoosex-oneargnew-perl -libmoosex-param-perl -libmoosex-params-validate-perl -libmoosex-poe-perl -libmoosex-relatedclassroles-perl -libmoosex-role-parameterized-perl -libmoosex-role-timer-perl -libmoosex-role-withoverloading-perl -libmoosex-semiaffordanceaccessor-perl -libmoosex-setonce-perl -libmoosex-simpleconfig-perl -libmoosex-singleton-perl -libmoosex-storage-perl -libmoosex-strictconstructor-perl -libmoosex-traits-perl -libmoosex-traits-pluggable-perl -libmoosex-types-common-perl -libmoosex-types-datetime-morecoercions-perl -libmoosex-types-datetime-perl -libmoosex-types-iso8601-perl -libmoosex-types-json-perl -libmoosex-types-loadableclass-perl -libmoosex-types-netaddr-ip-perl -libmoosex-types-path-class-perl -libmoosex-types-perl -libmoosex-types-perl-perl -libmoosex-types-set-object-perl -libmoosex-types-structured-perl -libmoosex-types-varianttable-perl -libmoosex-undeftolerant-perl -libmoosex-yaml-perl -libmouse-perl -libmousex-getopt-perl -libmousex-nativetraits-perl -libmousex-strictconstructor-perl -libmousex-types-path-class-perl -libmousex-types-perl -libmowgli -libmozilla-ldap-perl -libmp3-info-perl -libmp3spi-java -libmp3splt -libmp3-tag-perl -libmp4-info-perl -libmpc -libmpd -libmpdclient -libmpeg3 -libmpikmeans -libmqdb-perl -libmro-compat-perl -libmrss -libmr-tarantool-perl -libmsgcat-perl -libmsn -libmsoffice-word-html-writer-perl -libmsv -libmthca -libmtp -libmultidimensional-perl -libmusicbrainz3 -libmusicbrainz5 -libmusicbrainz-discid-perl -libmx4j-java -libmysql-diff-perl -libnagios-object-perl -libnagios-plugin-perl -libnamespace-autoclean-perl -libnamespace-clean-perl -libnanoxml2-java -libnatpmp -libnbio -libnb-javaparser-java -libncursesada -libneedle-extras-ruby -libneedle-ruby -libnes -libnet -libnet-address-ip-local-perl -libnetaddr-ip-perl -libnet-akamai-perl -libnet-akismet-perl -libnet-amazon-ec2-perl -libnet-amazon-perl -libnet-amazon-s3-perl -libnet-amazon-s3-tools-perl -libnet-appliance-session-perl -libnetapp-perl -libnet-arp-perl -libnet-bluetooth-perl -libnet-bonjour-perl -libnet-cidr-lite-perl -libnet-cidr-perl -libnet-citadel-perl -libnet-cli-interact-perl -libnet-cups-perl -libnet-daap-dmap-perl -libnet-daemon-perl -libnet-dbus-glib-perl -libnet-dbus-perl -libnet-dhcp-perl -libnet-dns-async-perl -libnet-dns-perl -libnet-dns-resolver-programmable-perl -libnet-dns-sec-perl -libnet-domain-tld-perl -libnetdot-client-rest-perl -libnet-dpap-client-perl -libnet-dri-perl -libnet-dropbox-api-perl -libnet-easytcp-perl -libnet-epp-perl -libnetfilter-conntrack -libnetfilter-cttimeout -libnetfilter-log -libnetfilter-queue -libnet-finger-perl -libnet-frame-perl -libnet-freedb-perl -libnet-github-perl -libnet-google-authsub-perl -libnet-google-code-perl -libnet-gpsd3-perl -libnet-hiveminder-perl -libnet-hotline-perl -libnet-http-perl -libnet-https-any-perl -libnet-httpserver-perl -libnet-https-nb-perl -libnet-ident-perl -libnet-ifconfig-wrapper-perl -libnet-imap-client-perl -libnet-imap-simple-perl -libnet-imap-simple-ssl-perl -libnet-inet6glue-perl -libnet-ip-minimal-perl -libnet-ip-perl -libnet-iptrie-perl -libnet-ipv6addr-perl -libnet-irc-perl -libnet-irc-ruby -libnet-irr-perl -libnet-jabber-bot-perl -libnet-jabber-loudmouth-perl -libnet-jabber-perl -libnet-jifty-perl -libnet-ldapapi-perl -libnet-ldap-filterbuilder-perl -libnet-ldap-perl -libnet-ldap-server-perl -libnet-libdnet-perl -libnet-libidn-perl -libnet-mac-perl -libnet-mac-vendor-perl -libnet-managesieve-perl -libnet-nbname-perl -libnet-netmask-perl -libnet-netrc-ruby -libnet-nis-perl -libnet-nslookup-perl -libnet-ntp-perl -libnet-oauth-perl -libnet-openid-common-perl -libnet-openid-consumer-perl -libnet-openid-server-perl -libnet-opensrs-perl -libnet-openssh-compat-perl -libnet-openssh-perl -libnetpacket-perl -libnet-patricia-perl -libnet-pcap-perl -libnet-ph-perl -libnet-ping-external-perl -libnet-proxy-perl -libnet-rawip-perl -libnet-rblclient-perl -libnet-rendezvous-publish-backend-avahi-perl -libnet-rendezvous-publish-perl -libnet-scp-expect-perl -libnet-scp-perl -libnetsds-kannel-perl -libnetsds-perl -libnetsds-util-perl -libnet-server-mail-perl -libnet-server-perl -libnet-sftp-foreign-perl -libnet-sieve-perl -libnet-sieve-script-perl -libnet-sip-perl -libnet-smpp-perl -libnet-smtpauth-perl -libnet-smtp-server-perl -libnet-smtp-ssl-perl -libnet-smtp-tls-butmaintained-perl -libnet-smtp-tls-perl -libnet-snmp-perl -libnet-snpp-perl -libnet-socks-perl -libnet-ssh2-perl -libnet-ssh-perl -libnet-ssleay-perl -libnet-sslglue-perl -libnet-stomp-perl -libnet-subnets-perl -libnet-tclink-perl -libnet-telnet-perl -libnet-tftpd-perl -libnet-tftp-perl -libnet-traceroute-perl -libnet-traceroute-pureperl-perl -libnet-trac-perl -libnet-upnp-perl -libnet-vnc-perl -libnet-whois-parser-perl -libnet-whois-raw-perl -libnet-whois-ripe-perl -libnetwork-ipv4addr-perl -libnet-write-perl -libnetxap-perl -libnetx-java -libnet-xmpp-perl -libnet-xwhois-perl -libnet-z3950-simple2zoom-perl -libnet-z3950-simpleserver-perl -libnet-z3950-zoom-perl -libnews-article-nocem-perl -libnews-article-perl -libnews-newsrc-perl -libnews-nntpclient-perl -libnews-scan-perl -libnfnetlink -libnfo -libnfs -libnfsidmap -libnice -libnids -libnih -libnjb -libnl -libnl3 -libnmap-parser-perl -libnoise -libnotify -libnova -libnsbmp -libnsgif -libnss-cache -libnss-db -libnss-extrausers -libnss-gw-name -libnss-ldap -libnss-lwres -libnss-myhostname -libnss-mysql-bg -libnss-pgsql -libntlm -libnumber-bytes-human-perl -libnumber-compare-perl -libnumber-format-perl -libnumber-fraction-perl -libnumber-range-perl -libnumber-recordlocator-perl -libnxml -libnzb -liboauth -liboauth-php -libobject-authority-perl -libobject-declare-perl -libobject-destroyer-perl -libobject-event-perl -libobject-id-perl -libobject-insideout-perl -libobject-multitype-perl -libobject-pluggable-perl -libobject-realize-later-perl -libobject-role-perl -libobject-signature-perl -libobject-tiny-perl -libocas -libofa -libofetion -libofx -libogg -liboggplay -libogg-vorbis-decoder-perl -libogg-vorbis-header-pureperl-perl -liboggz -liboglappth -libogre-perl -liboil -libois-perl -libole-storage-lite-perl -libomxalsa -libomxcamera -libomxfbdevsink -libomxil-bellagio -libomxmad -libomxvideosrc -libomxvorbis -libomxxvideo -libonemind-commons-invoke-java -libonemind-commons-java-java -libonig -liboobs -liboop -libopengl-perl -libopengl-xscreensaver-perl -libopenobex -libopenoffice-oodoc-perl -libopenraw -libopenusb -liboping -libopkele -liboptions-java -liborigin -liborigin2 -liborlite-migrate-perl -liborlite-mirror-perl -liborlite-perl -liborlite-statistics-perl -liboro-java -libosinfo -libosip2 -libosl -libosm-gary68-perl -libotf -libotr -libouch-perl -libowfat -libowl-directsemantics-perl -liboxford-calendar-perl -libp11 -libpackage-deprecationmanager-perl -libpackage-new-perl -libpackage-pkg-perl -libpackage-stash-perl -libpackage-stash-xs-perl -libpadre-plugin-autoformat-perl -libpadre-plugin-datawalker-perl -libpadre-plugin-git-perl -libpadre-plugin-moose-perl -libpadre-plugin-parsertool-perl -libpadre-plugin-pdl-perl -libpadre-plugin-perlcritic-perl -libpadre-plugin-perltidy-perl -libpadre-plugin-snippet-perl -libpadre-plugin-spellcheck-perl -libpadre-plugin-svn-perl -libpadre-plugin-yaml-perl -libpadwalker-perl -libpal-java -libpalm-perl -libpam4j -libpam-abl -libpam-afs-session -libpam-alreadyloggedin -libpam-blue -libpam-ccreds -libpam-chroot -libpam-encfs -libpam-foreground -libpam-krb5 -libpam-ldap -libpam-mklocaluser -libpam-mount -libpam-pwdfile -libpam-radius-auth -libpam-script -libpam-ssh -libpam-tacplus -libpam-unix2 -libpam-usb -libpango-perl -libpano13 -libpaper -libpar2 -libparallel-forkmanager-perl -libparallel-iterator-perl -libparams-callbackrequest-perl -libparams-classify-perl -libparams-coerce-perl -libparams-util-perl -libparams-validate-perl -libparanoid-perl -libpar-dist-perl -libpar-packer-perl -libpar-perl -libparse-cpan-meta-perl -libparse-cpan-packages-perl -libparse-debcontrol-perl -libparse-debianchangelog-perl -libparse-debian-packages-perl -libparse-dia-sql-perl -libparse-dmidecode-perl -libparse-edid-perl -libparse-errorstring-perl-perl -libparse-exuberantctags-perl -libparse-fixedlength-perl -libparse-http-useragent-perl -libparse-mediawikidump-perl -libparse-method-signatures-perl -libparse-plainconfig-perl -libparser++ -libparse-recdescent-perl -libparse-syslog-perl -libparse-win32registry-perl -libparse-yapp-perl -libpasswd-unix-perl -libpath-class-file-stat-perl -libpath-class-perl -libpath-dispatcher-declarative-perl -libpath-dispatcher-perl -libpcap -libpcapnav -libpciaccess -libpcl1 -libpcre++ -libpdf-api2-perl -libpdf-api2-simple-perl -libpdfbox-java -libpdf-create-perl -libpdf-fdf-simple-perl -libpdfrenderer-java -libpdf-report-perl -libpdf-reuse-barcode-perl -libpdf-reuse-perl -libpdf-table-perl -libpdl-io-hdf5-perl -libpdl-netcdf-perl -libpdl-stats-perl -libpeas -libperl4-corelibs-perl -libperl5i-perl -libperl6-caller-perl -libperl6-export-attrs-perl -libperl6-export-perl -libperl6-form-perl -libperl6-junction-perl -libperl6-say-perl -libperl6-slurp-perl -libperlanet-perl -libperl-apireference-perl -libperlbal-xs-httpheaders-perl -libperl-critic-perl -libperl-destruct-level-perl -libperldoc-search-perl -libperlio-eol-perl -libperlio-gzip-perl -libperlio-via-dynamic-perl -libperlio-via-symlink-perl -libperlmenu-perl -libperl-metrics-simple-perl -libperl-minimumversion-perl -libperl-prereqscanner-perl -libperlspeak-perl -libperl-version-perl -libperlx-maybe-perl -libpetal-perl -libpetal-utils-perl -libpgjava -libpgm -libpg-perl -libpgplot-perl -libpgp-sign-perl -libphash -libphone-ui -libphone-ui-shr -libphone-utils -libphp-adodb -libphp-jabber -libphp-jpgraph -libphp-pclzip -libphp-phpmailer -libphp-serialization-perl -libphp-snoopy -libphp-swiftmailer -libphysfs -libpinyin -libpipeline -libpixels-java -libpixie-java -libplack-middleware-crossorigin-perl -libplack-middleware-deflater-perl -libplack-middleware-expires-perl -libplack-middleware-file-sass-perl -libplack-middleware-reverseproxy-perl -libplack-middleware-session-perl -libplack-middleware-status-perl -libplack-perl -libplack-test-externalserver-perl -libplayer -libplist -libplrpc-perl -libplucene-perl -libpmount -libpng -libpod2-base-perl -libpod-2-docbook-perl -libpod-abstract-perl -libpod-constants-perl -libpod-coverage-perl -libpod-coverage-trustpod-perl -libpod-elemental-perl -libpod-elemental-perlmunger-perl -libpod-eventual-perl -libpod-index-perl -libpod-markdown-perl -libpodofo -libpod-plainer-perl -libpod-pom-perl -libpod-pseudopod-perl -libpod-readme-perl -libpod-sax-perl -libpod-simple-perl -libpod-simple-wiki-perl -libpod-spell-perl -libpod-strip-perl -libpod-tests-perl -libpod-tree-perl -libpod-weaver-perl -libpod-webserver-perl -libpod-wordlist-hanekomu-perl -libpod-wsdl-perl -libpod-xhtml-perl -libpoe-api-peek-perl -libpoe-component-client-dns-perl -libpoe-component-client-http-perl -libpoe-component-client-ident-perl -libpoe-component-client-keepalive-perl -libpoe-component-client-mpd-perl -libpoe-component-client-ping-perl -libpoe-component-dbiagent-perl -libpoe-component-ikc-perl -libpoe-component-irc-perl -libpoe-component-jabber-perl -libpoe-component-jobqueue-perl -libpoe-component-pcap-perl -libpoe-component-pubsub-perl -libpoe-component-resolver-perl -libpoe-component-server-http-perl -libpoe-component-server-simplehttp-perl -libpoe-component-server-soap-perl -libpoe-component-sslify-perl -libpoe-component-syndicator-perl -libpoe-filter-http-parser-perl -libpoe-filter-ircd-perl -libpoe-filter-stomp-perl -libpoe-filter-xml-perl -libpoe-loop-event-perl -libpoe-loop-tk-perl -libpoe-perl -libpoe-test-loops-perl -libpoet-perl -libposix-strptime-perl -libpostfix-parse-mailq-perl -libpostscriptbarcode -libpostscript-file-perl -libpostscript-perl -libpostscript-simple-perl -libppd -libppi-html-perl -libppi-perl -libppix-editortools-perl -libppix-regexp-perl -libppi-xs-perl -libppix-utilities-perl -libpqxx3 -libpragmatic-perl -libprefork-perl -libprelude -libpreludedb -libpri -libprinterconf -libprintsys -libprivileges-drop-perl -libprobe-perl-perl -libproc-background-perl -libproc-daemon-perl -libproc-fork-perl -libproc-invokeeditor-perl -libproc-pid-file-perl -libproc-processtable-perl -libproc-reliable-perl -libproc-simple-perl -libproc-syncexec-perl -libproc-waitstat-perl -libproxool-java -libproxy -libprpc-perl -libpst -libpthread-stubs -libpthread-workqueue -libpuzzle -libqalculate -libqb -libqglviewer -libqt4pas -libquantum -libquantum-entanglement-perl -libquantum-superpositions-perl -libquartz-java -libquicktime -libquota-perl -libquvi -libquvi-scripts -libqxt -librabbitmq -libramaze-ruby -libranlip -librapi2 -librasterlite -libraw -libraw1394 -librcc -librcd -librcs-perl -librdf-acl-perl -librdf-closure-perl -librdf-crypt-perl -librdf-endpoint-perl -librdf-generator-void-perl -librdf-helper-perl -librdf-helper-properties-perl -librdf-icalendar-perl -librdf-kml-exporter-perl -librdf-linkeddata-perl -librdf-ns-perl -librdf-prefixes-perl -librdf-query-client-perl -librdf-query-perl -librdf-rdfa-generator-perl -librdf-rdfa-parser-perl -librdf-trin3-perl -librdf-trine-node-literal-xml-perl -librdf-trine-perl -librdf-trineshortcuts-perl -librdf-trinex-functions-perl -librdf-vcard-perl -librdmacm -libreadline-java -libreadonly-perl -libreadonly-xs-perl -librecad -libredis-perl -libregexp-assemble-perl -libregexp-common-email-address-perl -libregexp-common-net-cidr-perl -libregexp-common-perl -libregexp-common-time-perl -libregexp-grammars-perl -libregexp-ipv6-perl -libregexp-java -libregexp-optimizer-perl -libregexp-reggrp-perl -libregexp-shellish-perl -librelative-perl -librelaxng-datatype-java -librelp -libreoffice -libreoffice-voikko -librep -libreplaygain -librepository -libresample -librest -librest-application-perl -libreturn-value-perl -librg-blast-parser-perl -librg-utils-perl -librivescript-perl -librole-hasmessage-perl -librole-identifiable-perl -librole-tiny-perl -libromana-perligata-perl -libroman-perl -libropkg-perl -librose-datetime-perl -librose-db-object-perl -librose-db-perl -librose-object-perl -librose-uri-perl -librostlab -librostlab-blast -librouter-simple-perl -librpcsecgss -librpc-xml-perl -librra -librrdtool-oo-perl -librsl -librsvg -librsync -librtas -librt-client-rest-perl -librtfcomp -librtf-document-perl -librtf-writer-perl -librunapp-perl -libs3 -libsamplerate -libsane-perl -libsaxon-java -libsbsms -libscalar-defer-perl -libscalar-list-utils-perl -libscalar-number-perl -libscalar-properties-perl -libscalar-string-perl -libscalar-util-numeric-perl -libschedule-at-perl -libschedule-cron-perl -libschedule-ratelimiter-perl -libscope-guard-perl -libscope-upper-perl -libscriptalicious-perl -libsdl1.2 -libsdl-console -libsdl-perl -libsdl-sge -libsdp -libsearch-estraier-perl -libsearch-gin-perl -libsearch-queryparser-perl -libsearch-xapian-perl -libselinux -libsemanage -libsendmail-milter-perl -libsendmail-pmilter-perl -libsepol -libserializer -libset-infinite-perl -libset-intspan-perl -libset-nestedgroups-perl -libset-object-perl -libset-scalar-perl -libsexy -libsfml -libsgml-parser-opensp-perl -libsgmls-perl -libshairport -libshell-command-perl -libshell-perl -libshell-perl-perl -libshell-posix-select-perl -libshevek -libshout -libshr-glib -libsidplay -libsidplayfp -libsieve -libsigc++ -libsigc++-1.2 -libsigc++-2.0 -libsignatures-perl -libsigrok -libsigrokdecode -libsigsegv -libsimple-validation-java -libskinlf-java -libskk -libslf4j-java -libsm -libsmart-comments-perl -libsmbios -libsmf -libsmi -libsms-send-perl -libsndfile -libsnmp-extension-passpersist-perl -libsnmp-info-perl -libsnmp-mib-compiler-perl -libsnmp-multi-perl -libsnmp-ruby -libsnmp-session-perl -libsnowball-norwegian-perl -libsnowball-swedish-perl -libsoap-lite-perl -libsoap-wsdl-perl -libsocialtext-resting-perl -libsocialtext-resting-utils-perl -libsocialweb -libsocket6-perl -libsocket-getaddrinfo-perl -libsocket-linux-perl -libsocket-multicast6-perl -libsocket-perl -libsoftware-license-perl -libsoftware-release-perl -libsoil -libsort-fields-perl -libsort-key-perl -libsort-key-top-perl -libsort-naturally-perl -libsort-versions-perl -libsoundgen -libsoup2.4 -libspark-java -libspctag -libspectre -libspectrum -libspf2 -libsphinx-search-perl -libspiffy-perl -libspin-java -libspiro -libspnav -libspoon-perl -libspork-perl -libspreadsheet-parseexcel-perl -libspreadsheet-parseexcel-simple-perl -libspreadsheet-read-perl -libspreadsheet-writeexcel-perl -libspreadsheet-xlsx-perl -libspring-java -libspring-ldap-java -libspring-security-2.0-java -libspring-webflow-2.0-java -libsql-abstract-limit-perl -libsql-abstract-perl -libsql-reservedwords-perl -libsql-statement-perl -libsql-translator-perl -libsru-perl -libss7 -libssh -libssh2 -libstatgrab -libstatistics-basic-perl -libstatistics-descriptive-perl -libstatistics-distributions-perl -libstatistics-online-perl -libstatistics-r-perl -libstatistics-test-randomwalk-perl -libstatistics-test-sequence-perl -libstat-lsmode-perl -libstax2-api-java -libstax-java -libstrictures-perl -libstring-approx-perl -libstring-bufferstack-perl -libstring-camelcase-perl -libstring-crc32-perl -libstring-dirify-perl -libstring-errf-perl -libstring-escape-perl -libstring-flogger-perl -libstring-format-perl -libstring-formatter-perl -libstring-glob-permute-perl -libstring-koremutake-perl -libstring-mkpasswd-perl -libstring-parity-perl -libstring-random-perl -libstring-rewriteprefix-perl -libstring-shellquote-perl -libstring-similarity-perl -libstring-toidentifier-en-perl -libstring-tokenizer-perl -libstring-truncate-perl -libstroke -libstruct-compare-perl -libstruts1.2-java -libstxxl -libsub-current-perl -libsub-delete-perl -libsub-exporter-formethods-perl -libsub-exporter-globexporter-perl -libsub-exporter-perl -libsub-identify-perl -libsub-install-perl -libsub-name-perl -libsub-override-perl -libsub-prototype-perl -libsubtitles-perl -libsub-uplevel-perl -libsub-wrappackages-perl -libsuper-perl -libsvg-graph-perl -libsvg-perl -libsvg-tt-graph-perl -libsvm -libsvn-class-perl -libsvn-dump-perl -libsvn-hooks-perl -libsvn-look-perl -libsvn-notify-mirror-perl -libsvn-notify-perl -libsvn-svnlook-perl -libsvn-web-perl -libswarmcache-java -libswe -libswingx1-java -libswingx-java -libswish-api-common-perl -libswitch-perl -libsx -libsylph -libsynce -libsyncml -libsyntax-highlight-engine-kate-perl -libsyntax-highlight-engine-simple-languages-perl -libsyntax-highlight-engine-simple-perl -libsyntax-highlight-perl-improved-perl -libsyntax-keyword-gather-perl -libsyntax-perl -libsynthesis -libsysactivity -libsysadm-install-perl -libsys-cpuload-perl -libsys-cpu-perl -libsys-filesystem-perl -libsys-gamin-perl -libsys-hostname-long-perl -libsys-mmap-perl -libsys-sigaction-perl -libsys-statistics-linux-perl -libsys-syscall-perl -libsys-syslog-perl -libsystem-command-perl -libsys-utmp-perl -libsys-virt-perl -libtablelayout-java -libtaint-util-perl -libtangram-perl -libtap-formatter-html-perl -libtap-formatter-junit-perl -libtap-harness-archive-perl -libtap-parser-sourcehandler-pgtap-perl -libtar -libtask-weaken-perl -libtasn1-3 -libtcd -libtecla -libtelnet -libtemplate-alloy-perl -libtemplate-declare-perl -libtemplate-multilingual-perl -libtemplate-perl -libtemplate-plugin-calendar-simple-perl -libtemplate-plugin-class-perl -libtemplate-plugin-clickable-email-perl -libtemplate-plugin-clickable-perl -libtemplate-plugin-comma-perl -libtemplate-plugin-cycle-perl -libtemplate-plugin-datetime-format-perl -libtemplate-plugin-dbi-perl -libtemplate-plugin-gd-perl -libtemplate-plugin-gravatar-perl -libtemplate-plugin-javascript-perl -libtemplate-plugin-json-escape-perl -libtemplate-plugin-latex-perl -libtemplate-plugin-number-format-perl -libtemplate-plugin-textile2-perl -libtemplate-plugin-utf8decode-perl -libtemplate-plugin-xml-perl -libtemplate-plugin-yaml-perl -libtemplate-provider-encoding-perl -libtemplate-provider-fromdata-perl -libtemplates-parser -libtemplate-timer-perl -libtemplate-tiny-perl -libtenjin-perl -libterm-encoding-perl -libterm-filter-perl -libterm-progressbar-perl -libterm-prompt-perl -libterm-query-perl -libterm-readkey-perl -libterm-readline-gnu-perl -libterm-readline-perl-perl -libterm-readline-zoid-perl -libterm-readpassword-perl -libterm-shell-perl -libterm-shellui-perl -libterm-size-any-perl -libterm-size-perl -libterm-size-perl-perl -libterm-sk-perl -libterm-slang-perl -libterm-ttyrec-plus-perl -libterm-twiddle-perl -libterm-visual-perl -libterm-vt102-perl -libterralib -libtest-aggregate-perl -libtest-apocalypse-perl -libtest-assertions-perl -libtest-autoloader-perl -libtest-base-perl -libtest-bdd-cucumber-perl -libtest-block-perl -libtest-carp-perl -libtest-cgi-multipart-perl -libtest-checkchanges-perl -libtest-checkdeps-perl -libtest-checkmanifest-perl -libtest-classapi-perl -libtest-class-most-perl -libtest-class-perl -libtest-cmd-perl -libtest-command-perl -libtest-compile-perl -libtest-consistentversion-perl -libtest-corpus-audio-mpd-perl -libtest-cpan-meta-perl -libtest-cpan-meta-yaml-perl -libtest-cukes-perl -libtest-database-perl -libtest-data-perl -libtest-deep-perl -libtest-dependencies-perl -libtest-differences-perl -libtest-dir-perl -libtest-distmanifest-perl -libtest-distribution-perl -libtest-email-perl -libtest-eol-perl -libtest-exception-perl -libtest-exit-perl -libtest-expect-perl -libtest-fatal-perl -libtest-file-contents-perl -libtest-file-perl -libtest-file-sharedir-perl -libtest-fixme-perl -libtest-harness-perl -libtest-hasversion-perl -libtest-html-content-perl -libtest-html-w3c-perl -libtest-http-server-simple-perl -libtest-http-server-simple-stashwarnings-perl -libtest-identity-perl -libtest-image-gd-perl -libtest-indistdir-perl -libtest-inline-perl -libtest-inter-perl -libtest-json-perl -libtest-kwalitee-perl -libtest-leaktrace-perl -libtest-lectrotest-perl -libtest-log4perl-perl -libtest-log-dispatch-perl -libtest-longstring-perl -libtest-manifest-perl -libtest-memory-cycle-perl -libtest-minimumversion-perl -libtest-mockclass-perl -libtest-mock-lwp-perl -libtest-mockmodule-perl -libtest-mockobject-perl -libtest-mockrandom-perl -libtest-mock-redis-perl -libtest-mocktime-datecalc-perl -libtest-mocktime-perl -libtest-module-used-perl -libtest-most-perl -libtest-needsdisplay-perl -libtest-nobreakpoints-perl -libtest-notabs-perl -libtest-nowarnings-perl -libtest-number-delta-perl -libtest-object-perl -libtest-output-perl -libtest-perl-critic-perl -libtest-pod-content-perl -libtest-pod-coverage-perl -libtest-pod-no404s-perl -libtest-pod-perl -libtest-poe-client-tcp-perl -libtest-poe-server-tcp-perl -libtest-portability-files-perl -libtest-prereq-perl -libtest-rdf-doap-version-perl -libtest-rdf-perl -libtest-refcount-perl -libtest-regression-perl -libtest-reporter-perl -libtest-requires-perl -libtest-routine-perl -libtest-script-perl -libtest-script-run-perl -libtest-sharedfork-perl -libtest-signature-perl -libtest-simple-perl -libtest-simpleunit-perl -libtest-spec-perl -libtest-spelling-perl -libtest-strict-perl -libtest-subcalls-perl -libtest-synopsis-perl -libtest-taint-perl -libtest-tcp-perl -libtest-tempdir-perl -libtest-tester-perl -libtest-trap-perl -libtest-unit-perl -libtest-useallmodules-perl -libtest-use-ok-perl -libtest-utf8-perl -libtest-valgrind-perl -libtest-warn-perl -libtest-weaken-perl -libtest-without-module-perl -libtest-www-declare-perl -libtest-www-mechanize-catalyst-perl -libtest-www-mechanize-cgiapp-perl -libtest-www-mechanize-mojo-perl -libtest-www-mechanize-perl -libtest-www-mechanize-psgi-perl -libtest-www-selenium-perl -libtest-xml-perl -libtest-xml-simple-perl -libtest-xpath-perl -libtest-yaml-meta-perl -libtest-yaml-valid-perl -libtex-encode-perl -libtext-affixes-perl -libtext-aligner-perl -libtext-asciitable-perl -libtext-aspell-perl -libtext-autoformat-perl -libtext-bibtex-perl -libtext-bidi-perl -libtext-charwidth-perl -libtext-chasen-perl -libtext-context-eitherside-perl -libtext-context-perl -libtext-csv-encoded-perl -libtext-csv-perl -libtext-csv-xs-perl -libtext-dhcpleases-perl -libtext-diff-perl -libtext-findindent-perl -libtext-flow-perl -libtext-format-perl -libtext-formattable-perl -libtext-german-perl -libtext-glob-perl -libtext-greeking-perl -libtext-header-perl -libtext-hunspell-perl -libtext-iconv-perl -libtext-kakasi-perl -libtext-levenshtein-perl -libtext-levenshteinxs-perl -libtext-lorem-perl -libtext-markdown-discount-perl -libtext-markdown-perl -libtext-mecab-perl -libtext-mediawikiformat-perl -libtext-micromason-perl -libtext-microtemplate-perl -libtext-multimarkdown-perl -libtext-ngram-perl -libtext-password-pronounceable-perl -libtext-patch-perl -libtext-pdf-perl -libtext-qrcode-perl -libtext-quoted-perl -libtext-recordparser-perl -libtext-reflow-perl -libtext-reform-perl -libtext-rewriterules-perl -libtext-roman-perl -libtext-sass-perl -libtext-simpletable-perl -libtext-table-perl -libtext-tabulardisplay-perl -libtext-template-perl -libtext-textile-perl -libtext-trac-perl -libtext-trim-perl -libtext-typography-perl -libtext-unaccent-perl -libtext-unidecode-perl -libtext-vcard-perl -libtext-vfile-asdata-perl -libtext-vimcolor-perl -libtext-wikicreole-perl -libtext-wikiformat-perl -libtext-worddiff-perl -libtextwrap -libtext-wrapi18n-perl -libtext-wrapper-perl -libtfbs-perl -libtggraphlayout-java -libthai -libtheora -libtheschwartz-perl -libthread-pool-simple-perl -libthread-queue-any-perl -libthread-serialize-perl -libthreads-perl -libthreads-shared-perl -libthrowable-perl -libthrust -libticables -libticalcs -libticket-simple-perl -libticonv -libtie-array-iterable-perl -libtie-array-sorted-perl -libtie-cache-perl -libtie-cphash-perl -libtie-dbi-perl -libtie-dxhash-perl -libtie-encryptedhash-perl -libtie-hash-regex-perl -libtie-ical-perl -libtie-ixhash-perl -libtie-persistent-perl -libtie-refhash-weak-perl -libtie-shadowhash-perl -libtie-simple-perl -libtie-toobject-perl -libtifiles -libtime-clock-perl -libtimedate-perl -libtime-duration-parse-perl -libtime-duration-perl -libtime-fake-perl -libtime-format-perl -libtime-human-perl -libtime-modules-perl -libtime-period-perl -libtime-piece-mysql-perl -libtime-progress-perl -libtime-stopwatch-perl -libtime-warp-perl -libtime-y2038-perl -libtirpc -libtitanium-perl -libtk-dirselect-perl -libtk-filedialog-perl -libtk-gbarr-perl -libtk-histentry-perl -libtk-img -libtk-objscanner-perl -libtk-pod-perl -libtk-splashscreen-perl -libtk-tablematrix-perl -libtm-perl -libtnt -libtododb -libtokyocabinet-perl -libtomcrypt -libtommath -libtool -libtoolkit-perl -libtools-logging-clojure -libtorrent -libtorrent-rasterbar -libtpclient-py -libtpl -libtpproto-py -libtrace3 -libtrain -libtravel-routing-de-vrr-perl -libtree-dagnode-perl -libtree-multinode-perl -libtree-redblack-perl -libtree-simple-perl -libtree-simple-visitorfactory-perl -libtritonus-java -libtrue-perl -libtrycatch-perl -libtry-tiny-perl -libtut -libtuxcap -libtwin -libucimf -libui-dialog-perl -libunicode-collate-perl -libunicode-escape-perl -libunicode-japanese-perl -libunicode-linebreak-perl -libunicode-map8-perl -libunicode-map-perl -libunicode-maputf8-perl -libunicode-string-perl -libunicode-stringprep-perl -libuninameslist -libuninum -libunique -libunique3 -libunistring -libuniversal-can-perl -libuniversal-exports-perl -libuniversal-isa-perl -libuniversal-moniker-perl -libuniversal-require-perl -libunix-mknod-perl -libunix-syslog-perl -libunwind -libupnp -libupnp4 -liburcu -liburi-encode-perl -liburi-fetch-perl -liburi-find-delimited-perl -liburi-find-perl -liburi-perl -liburi-query-perl -liburi-smarturi-perl -liburi-template-perl -liburi-todisk-perl -libusb -libusbtc08 -libusbx -libuser -libuser-identity-perl -libuser-perl -libuser-simple-perl -libutempter -libutf8-all-perl -libuuid-perl -libuuid-tiny-perl -libv8 -libv8-i18n -libva -libvalhalla -libvalidate-net-perl -libvalidation-class-perl -libvamsas-client-java -libvariable-magic-perl -libvc -libvcs-lite-perl -libvdpau -libvendorlib-perl -libverilog-perl -libversion-next-perl -libversion-perl -libverto -libvformat -libvideo-capture-v4l-perl -libvideo-fourcc-info-perl -libvideo-ivtv-perl -libview -libvigraimpex -libvi-quickfix-perl -libvirt -libvirt-glib -libvisca -libvisio -libvisual -libvisual-plugins -libvitacilina-perl -libvldocking-java -libvncserver -libvoikko -libvorbis -libvorbisfile-ruby -libvorbisidec -libvorbisspi-java -libv-perl -libvpx -libwacom -libwant-perl -libwarnings-illegalproto-perl -libweather-com-perl -libwebapp-ruby -libwebcam -libweb-id-perl -libwebinject-perl -libwebp -libweb-scraper-perl -libwebservice-cia-perl -libwebservice-musicbrainz-perl -libwebservice-solr-perl -libwebservice-validator-css-w3c-perl -libwebservice-validator-html-w3c-perl -libwebservice-youtube-perl -libweb-simple-perl -libwfut -libwhisker2-perl -libwibble -libwiki-toolkit-formatter-usemod-perl -libwiki-toolkit-perl -libwiki-toolkit-plugin-categoriser-perl -libwiki-toolkit-plugin-diff-perl -libwiki-toolkit-plugin-json-perl -libwiki-toolkit-plugin-locator-grid-perl -libwiki-toolkit-plugin-ping-perl -libwiki-toolkit-plugin-rss-reader-perl -libwmf -libwnck -libwnck3 -libwoodstox-java -libwordnet-querydata-perl -libwpd -libwpg -libwps -libwrap-ruby -libws-commons-util-java -libwwwbrowser-perl -libwww-bugzilla-perl -libwww-cnic-perl -libwww-curl-perl -libwww-facebook-api-perl -libwww-finger-perl -libwww-freshmeat-perl -libwww-google-calculator-perl -libwww-indexparser-perl -libwww-mechanize-autopager-perl -libwww-mechanize-formfiller-perl -libwww-mechanize-gzip-perl -libwww-mechanize-perl -libwww-mechanize-shell-perl -libwww-mechanize-treebuilder-perl -libwww-mediawiki-client-perl -libwww-nicovideo-download-perl -libwww-opensearch-perl -libwww-perl -libwww-robotrules-perl -libwww-search-perl -libwww-shorten-perl -libwww-topica-perl -libwww-wikipedia-perl -libwx-perl -libwx-perl-datawalker-perl -libwx-perl-processstream-perl -libwx-scintilla-perl -libx11 -libx11-freedesktop-desktopentry-perl -libx11-guitest-perl -libx11-protocol-perl -libx500-dn-perl -libx86 -libxalan2-java -libxapool-java -libxau -libxaw -libxbase -libxbean-java -libxcb -libxcomposite -libxcrypt -libxcursor -libxdamage -libxdg-basedir -libxdmcp -libxerces2-java -libxext -libxfce4menu -libxfce4ui -libxfce4util -libxfcegui4 -libxfixes -libxfont -libxi -libxinerama -libxkbfile -libxklavier -libxml2 -libxml++2.6 -libxmlada -libxml-atom-fromowl-perl -libxml-atom-microformats-perl -libxml-atom-owl-perl -libxml-atom-perl -libxml-atom-service-perl -libxml-atom-simplefeed-perl -libxml-autowriter-perl -libxml-bare-perl -libxml-checker-perl -libxml-commonns-perl -libxml-commons-resolver1.1-java -libxml-csv-perl -libxml-dom-perl -libxml-dom-xpath-perl -libxml-dtdparser-perl -libxml-dt-perl -libxml-dumper-perl -libxml-easyobj-perl -libxml-easy-perl -libxml-encoding-perl -libxmlezout -libxml-feed-perl -libxml-feedpp-mediarss-perl -libxml-feedpp-perl -libxml-filter-buffertext-perl -libxml-filter-detectws-perl -libxml-filter-reindent-perl -libxml-filter-saxt-perl -libxml-filter-sort-perl -libxml-filter-xslt-perl -libxml-generator-perl -libxml-grddl-perl -libxml-grove-perl -libxml-handler-composer-perl -libxml-handler-printevents-perl -libxml-handler-trees-perl -libxml-handler-yawriter-perl -libxml-java -libxml-libxml-debugging-perl -libxml-libxml-iterator-perl -libxml-libxml-lazybuilder-perl -libxml-libxml-perl -libxml-libxml-simple-perl -libxml-libxslt-perl -libxml-mini-perl -libxml-namespacefactory-perl -libxml-namespace-perl -libxml-namespacesupport-perl -libxml-nodefilter-perl -libxml-node-perl -libxml-opml-perl -libxml-opml-simplegen-perl -libxml-parser-lite-tree-perl -libxml-parser-perl -libxml-perl -libxml-qofqsf-perl -libxml-quote-perl -libxml-regexp-perl -libxmlrpc3-java -libxml-rss-feed-perl -libxml-rss-libxml-perl -libxml-rsslite-perl -libxml-rss-perl -libxml-rss-simplegen-perl -libxml-sax-base-perl -libxml-sax-expat-incremental-perl -libxml-sax-expat-perl -libxml-sax-expatxs-perl -libxml-sax-machines-perl -libxml-sax-perl -libxml-sax-writer-perl -libxml-security-java -libxml-semanticdiff-perl -libxml-simpleobject-perl -libxml-simple-perl -libxml-smart-perl -libxml-stream-perl -libxml-tidy-perl -libxml-tmx-perl -libxmltok -libxml-tokeparser-perl -libxml-treebuilder-perl -libxml-treepp-perl -libxml-twig-perl -libxml-um-perl -libxml-validate-perl -libxml-validator-schema-perl -libxml-writer-perl -libxml-writer-simple-perl -libxml-writer-string-perl -libxml-xerces-perl -libxml-xpathengine-perl -libxml-xpath-perl -libxml-xql-perl -libxml-xslt-perl -libxml-xupdate-libxml-perl -libxmu -libxp -libxpm -libxpp2-java -libxpp3-java -libxr -libxrandr -libxray-absorption-perl -libxray-scattering-perl -libxray-spacegroup-perl -libxrd-parser-perl -libxrender -libxres -libxsettings -libxsettings-client -libxslt -libxss -libxstream-java -libxt -libxtst -libxv -libxvmc -libxxf86dga -libxxf86vm -libyahoo2 -libyaml -libyaml-appconfig-perl -libyaml-libyaml-perl -libyaml-perl -libyaml-shell-perl -libyaml-syck-perl -libyaml-tiny-perl -libyanfs-java -libydpdict -libytnef -libyubikey -libzeep -libzeitgeist -libzen -libzerg -libzerg-perl -libzip -libzip-ruby -libzn-poly -libzorpll -libzrtpcpp -lice -lice5 -licq -lie -liece -lifelines -lifeograph -liferea -liggghts -lightdm -lightdm-gtk-greeter -lightproof -lightspark -lightspeed -lightsquid -lighttpd -lightyears -lilo -lilo-installer -lilv -lilypond -linaro-image-tools -lincity -lincity-ng -lincredits -lingot -linkchecker -link-grammar -linklint -link-monitor-applet -links2 -linky -linphone -linpsk -linsmith -lintex -linthesia -lintian -linux -linux86 -linux-atm -linux-base -linuxdcpp -linuxdoc-tools -linux-ftpd -linux-ftpd-ssl -linux-igd -linuxinfo -linux-latest -linuxlogo -linux-ntfs -linux-patch-debianlogo -linux-patch-grsecurity2 -linux-tools -linuxtv-dvb-apps -linux-wlan-ng -lio-utils -liquidsoap -liquidwar -lirc -lire -lisaac -listadmin -listaller -literki -littler -littlewizard -live-boot -live-build -live-config -live-f1 -livehttpheaders -live-installer -live-manual -lives -live-tools -livetribe-jsr223 -liwc -lksctp-tools -lldpad -lldpd -llgal -ll-scope -lltag -llvm-2.9 -llvm-3.0 -llvm-3.1 -llvm-defaults -llvm-py -lmarbles -lme4 -lmemory -lmms -lmodern -lm-sensors -lmtest -lnpd -loadlin -loadmeter -loadwatch -localechooser -localepurge -localization-config -localizer -lockdev -lockfile-progs -lockout -log4c -log4cplus -log4cpp -log4cpp-doc -log4cxx -log4net -log4shib -logapp -logback -logcheck -logfs-tools -loggerhead -logidee-tools -logilab-astng -logilab-common -logilab-constraint -logisim -logjam -logreq -logrotate -logservice -logstalgia -logtool -logtools -logtop -logwatch -lojban-common -loki -londonlaw -longomatch -lookup -lookup-el -looptools -loqui -lordsawar -lostirc -lottanzb -loudmouth -louie -lout -love -lowmem -lowpan-tools -lpe -lpr -lprng -lprng-doc -lp-solve -lptools -lrslib -lrzip -lrzsz -lsat -lsb -lsdb -lsdvd -lshell -lsh-utils -lshw -lsmbox -lsof -lsscsi -lsyncd -ltpanel -ltrace -ltris -ltsp -ltsp-docs -ltspfs -ltt-control -lttoolbox -lttv -lua50 -lua5.1 -lua5.1-policy -lua5.2 -lua-apr -luabind -lua-bitop -lua-cgi -lua-copas -lua-cosmo -lua-coxpcall -lua-curl -lua-cyrussasl -lua-dbi -lua-doc -lua-event -lua-expat -lua-filesystem -lua-iconv -lua-json -luakit -lua-ldap -lua-leg -lua-lgi -lua-logging -lua-lpeg -lua-markdown -lua-md5 -lua-mode -lua-orbit -lua-penlight -lua-posix -lua-rexlib -lua-rings -luarocks -lua-sec -lua-soap -luasocket -lua-sql -luasseq -lua-svn -luatex -lua-wsapi -lua-xmlrpc -lua-zip -lua-zlib -lucene2 -lucene-solr -luckybackup -ludevit -lugaru -luminance-hdr -lunar -lunar-date -lunch -lunzip -luola -luola-levels -luola-nostalgy -lurker -lusernet.app -lush -lutefisk -luvcview -lv -lv2 -lv2core -lv2-c++-tools -lv2dynparam1 -lv2fil -lv2file -lv2proc -lv2vocoder -lvm2 -lvmcfg -lwatch -lwipv6 -lwjgl -lwm -lwt -lxappearance -lxappearance-obconf -lxc -lxctl -lxde-common -lxde-icon-theme -lxde-metapackages -lx-gdb -lxinput -lxlauncher -lxmenu-data -lxml -lxmms2 -lxmusic -lxpanel -lxpolkit -lxrandr -lxsession -lxsession-edit -lxshortcut -lxtask -lxterminal -lybniz -lynis -lynkeos.app -lynx-cur -lyskom-elisp-client -lyskom-server -lyx -lzip -lziprecover -lzlib -lzma -lzo2 -lzop -m16c-flash -m17n-contrib -m17n-db -m17n-docs -m17n-im-config -m17n-lib -m2300w -m2crypto -m2vrequantiser -m4 -macchanger -macchanger-gtk -mach -macopix -mactelnet -macutils -mac-widgets -madbomber -madison-lite -madlib -madplay -madwimax -maelstrom -mafft -magic -magicfilter -magic-haskell -magicmaze -magicor -magicrescue -magics++ -magit -magpierss -magyarispell -mah-jong -mailagent -mailavenger -mailcheck -mailcrypt -maildir-filter -maildirsync -maildir-utils -maildrop -mail-expire -mailfilter -mailfront -mailgraph -mailman -mail-notification -mailping -mailplate -mail-spf-perl -mailsync -mailtextbody -mailto -mailutils -main-menu -maint-guide -mairix -maitreya -makebootfat -makedev -make-dfsg -makedumpfile -makefs -makejail -makejvf -makepasswd -makepatch -makeself -makexvpics -mako -malaga -maloc -man2html -mana -mancala -man-db -mandelbulber -manderlbot -mandos -mangler -mango-lassi -manpages -manpages-de -manpages-es -manpages-es-extra -manpages-fr -manpages-fr-extra -manpages-hu -man-pages-it -manpages-ja -manpages-pl -manpages-pt -manpages-ru -manpages-tr -manpages-zh -mantis -mapivi -mapnik -mapserver -maptransfer -maq -maqview -maradns -marble -maria -markdown -markupsafe -mason -masqmail -massxpert -mat -matanza -matchbox -matchbox-common -matchbox-desktop -matchbox-keyboard -matchbox-panel -matchbox-panel-manager -matchbox-themes-extra -matchbox-window-manager -matchit -mathematica-fonts -mathgl -mathjax -mathomatic -mathpartir -mathpiper -mathtex -mathwar -matita -matlab-support -matplotlib -matrixssl -matroxset -maude -mauve -maven -maven2 -maven2-core -maven-ant-helper -maven-antrun-extended-plugin -maven-antrun-plugin -maven-ant-tasks -maven-archiver -maven-assembly-plugin -maven-bundle-plugin -maven-clean-plugin -maven-common-artifact-filters -maven-compiler-plugin -maven-debian-helper -maven-dependency-analyzer -maven-dependency-plugin -maven-dependency-tree -maven-docck-plugin -maven-doxia-tools -maven-ear-plugin -maven-ejb-plugin -maven-embedder -maven-enforcer -maven-file-management -maven-filtering -maven-hpi-plugin -maven-install-plugin -maven-invoker -maven-invoker-plugin -maven-jar-plugin -maven-javadoc-plugin -maven-parent -maven-plugin-testing -maven-plugin-tools -maven-project-info-reports-plugin -maven-repo-helper -maven-reporting-impl -maven-repository-builder -maven-resources-plugin -maven-scm -maven-shade-plugin -maven-shared-io -maven-shared-jar -maven-site-plugin -maven-stapler-plugin -maven-verifier -maven-war-plugin -mawk -maxima -maximus -mayavi2 -mazeofgalious -mb2md -mbot -mboxcheck -mboxgrep -mbr -mbt -mbtserver -mbuffer -mbw -mc -mcabber -mccs -mcdp -mcelog -mcl -mclibs -mcmcpack -mcollective -mcomix -mcpp -mcp-plugins -mcrl2 -mcron -mcrypt -mcs -mcu8051ide -md5deep -mdadm -mda-lv2 -mdbtools -mdbus -mdcfg -mdds -mdetect -mdf2iso -mdk -mdm -mdns-scan -mdp -meanwhile -mecab -mecab-ipadic -mecab-jumandic -mecab-naist-jdic -med-fichier -mediainfo -media-player-info -media-retriever -mediatomb -mediawiki -mediawiki-extensions -mediawiki-math -medicalterms -medit -mednafen -medusa -meep -meep-lam4 -meep-mpich2 -meep-mpi-default -meep-openmpi -megaglest -megaglest-data -melange -meld -meliae -melting -members -memcached -memcachedb -memchan -memdump -memlockd -memphis -memstat -memtest86 -memtest86+ -memtester -mencal -mendexk -menhir -mensis -menu -menu-cache -menu-l10n -menu-xdg -mercator -mercurial -mercurial-server -mergelog -merkaartor -mesa -mesa-demos -meschach -meshlab -mess-desktop-entries -metacam -metacity -metacity-themes -metaconfig -meta-gnome3 -meta-gnustep -metainf-services -metainit -meta-kde -meta-kde-telepathy -metalink -meta-ocaml -metapixel -metar -metastore -metatheme-gilouche -meta-unison -metche -meterbridge -meterec -me-tv -mew -mew-beta -mffm-fftw -mffm-timecode -mftrace -mg -mga-vid -mgcv -mgdiff -mgen -mgetty -mgm -mgp -mgt -mha4mysql-manager -mha4mysql-node -mhash -mh-book -mhc -mhddfs -mh-e -mhonarc -mhwaveedit -mic2 -microcode.ctl -microcom -microdc2 -micro-httpd -micro-inetd -micropolis-activity -micro-proxy -midge -mididings -midish -midori -mig -migrate -migrationtools -mii-diag -mikmatch -mikmod -milkytracker -milter-greylist -mime-construct -mimedefang -mimefilter -mimelib1 -mime-support -mimetex -mimetic -mimms -min12xxw -mina -mina2 -minbar -minbif -minc -minetest -ming -mingetty -mingw32 -mingw32-binutils -mingw32-runtime -mingw-ocaml -mingw-w64 -mini18n -minicom -mini-dinstall -minidjvu -minidlna -mini-httpd -minimodem -minirok -minisapserver -minisat+ -minisat2 -minissdpd -ministat -minit -miniupnpc -minlog -minpack -mipe -mira -mirage -miredo -mirmon -miro -mirrormagic -misc3d -miscfiles -misery -missidentify -missingh -mistelix -mitmproxy -mit-scheme -miwm -mixal -mixer.app -mixmaster -mixxx -mkcue -mkelfimage -mkgmap -mkgmapgui -mklibs -mknbi -mknfonts.tool -mksh -mktorrent -mkvtoolnix -mldonkey -mlgmp -mlmmj -mlocate -mlpcap -mlpost -mlpy -mlt -mlterm -mlton -mlv-smile -mm -mm3d -mmake -mmass -mm-common -mmm-mode -mmorph -mmpong -mmv -mnemosyne -mnemosyne-blog -mnormt -moap -mobile-atlas-creator -mobile-broadband-provider-info -moblin-cursor-theme -moblin-gtk-engine -moblin-icon-theme -moblin-menus -moblin-sound-theme -mobyle -mobyle-programs -moc -mochikit -mocker -mockito -mockobjects -mod-auth-mysql -mod-authn-webid -mod-dnssd -model-builder -modello -modello1.4 -modello-maven-plugin -modello-maven-plugin1.4 -modem-cmd -modemmanager -modestmaps-py -mod-gearman -modglue -mod-gnutls -mod-mime-xattr -mod-mono -modplugtools -mod-proxy-html -mod-ruby -modsecurity-apache -modsecurity-crs -mod-spamhaus -module-assistant -module-build-cipux -modules -mod-vhost-hash-alias -mod-vhost-ldap -mod-wsgi -moin -mojarra -mokomaze -molly-guard -mon -mona -monajat -monav -mon-client -mon-contrib -mondrian -mongodb -monit -monkeysphere -monkeystudio -monkeytail -mono -mono-addins -mono-basic -monobristol -monodevelop -monodevelop-database -monodevelop-debugger-gdb -mono-fuse -monogame -monopd -mono.reflection -monotone -monotone-viz -mono-tools -mono-uia -mono-uia-atkbridge -mono-uia-winforms -mono-upnp -mono-zeroconf -monster-masher -monsterz -moodbar -moon-buggy -moon-lander -mooproxy -moosic -mootools -moovida -moovida-plugins-bad -moovida-plugins-good -moovida-plugins-ugly -mopac7 -mopd -moreutils -morfologik-stemming -moria -morla -morse -morsegen -morse-simulator -mosh -mosquitto -most -mothur -motion -mountall -mountfloppy -mountmedia -mountpy -mouseemu -mousepad -mousetrap -mousetweaks -mova -movabletype-opensource -movixmaker-2 -mozart -mozart-stdlib -mozc -mozilla-devscripts -mozilla-dom-inspector -mozilla-noscript -mozjs -mozvoikko -mp -mp3blaster -mp3burn -mp3cd -mp3check -mp3diags -mp3fs -mp3gain -mp3info -mp3rename -mp3report -mp3roaster -mp3splt -mp3splt-gtk -mp3val -mp3wrap -mp4h -mp4v2 -mpack -mpage -mpb -mpc -mpc123 -mpclib -mpd -mpdcon.app -mpdcron -mpdris -mpdscribble -mpd-sima -mpdtoys -mpeg2dec -mpegdemux -mpfi -mpfr4 -mpg123 -mpg123-el -mpg321 -mpgtx -mpi4py -mpich2 -mpi-defaults -mpj -mplayer -mplayer2 -mplayer-blue -mpmath -mpop -mppenc -mpqc -mpris-remote -mpt-status -mr -mrb -mrbayes -mrd6 -mrename -mriconvert -mricron -mrmpi -mrtg -mrtg-ping-probe -mrtg-rrd -mrtgutils -mrtrix -mrxvt -mscgen -mscompress -msgpack -msgpack-python -msmtp -msnlib -msn-pecan -msort -msp430-libc -msp430mcu -mspdebug -msrtool -msr-tools -mssh -mstflint -msttcorefonts -msv -msva-perl -mswatch -mtasc -mtbl -mtdev -mtd-utils -mtink -mtj -mtkbabel -mtools -mtpaint -mtr -mt-st -mtx -m-tx -mu-cade -mu-cite -muddleftpd -mudita24 -mudlet -mueller -mule -multcomp -multex-base -multiboot -multicat -multiget -multimail -multimon -multipartposthandler -multipath-tools -multistrap -multitail -multitee -multiwatch -mumble -mumble-django -mummer -mummy -mumps -mumudvb -munge -munge-maven-plugin -munin -munin-libvirt-plugins -munin-plugins-openstack -munkres -muparser -mupdf -mupen64plus -mupen64plus-audio-sdl -mupen64plus-core -mupen64plus-input-sdl -mupen64plus-rsp-hle -mupen64plus-rsp-z64 -mupen64plus-ui-console -mupen64plus-video-arachnoid -mupen64plus-video-glide64 -mupen64plus-video-rice -mupen64plus-video-z64 -muroar -muroard -murrine-themes -muscle -muse -museek+ -muse-el -musescore -music -music123 -musicbrainzngs -musiclibrarian -musique -musixtex -mussh -mustang -mustang-plug -mutagen -mutextrace -mutrace -mutt -mutter -muttprint -muttprofile -mvel -mvtnorm -mwrap -mx -mxallowd -mxml -mydumper -myghty -myghtyutils -mygpoclient -mylvmbackup -myodbc -mypaint -myproxy -myrescue -myspell -myspell-el-gr -myspell-fa -myspell-hr -myspell-hy -myspell-ku -myspell-lv -myspell.pt -myspell-pt-br -myspell-sk -myspell-sl -mysql++ -mysql-5.5 -mysql-connector-c++ -mysql-connector-java -mysql-connector-net -mysql-connector-python -mysql-mmm -mysql-ocaml -mysql-proxy -mysqltcl -mysqltuner -mysql-utilities -mysql-workbench -mysqmail -mythes -mythes-it -mythtvfs-fuse -mythtv-status -mytop -mz -n2n -nabi -nacl -nadoka -naga -nagios3 -nagiosgrapher -nagios-images -nagios-nrpe -nagios-plugin-check-multi -nagios-plugins -nagios-plugins-contrib -nagios-plugins-openstack -nagios-snmp-plugins -nagircbot -nagstamon -nagvis -nagzilla -nailgun -naist-jdic -nam -nama -namazu2 -namebench -nana -nano -nanoblogger -nanoblogger-extra -nant -nap -nas -nasm -naspro-bridge-it -naspro-bridges -naspro-core -nast -nasty -nat -natbraille -naturaldocs -nautilus -nautilus-actions -nautilus-compare -nautilus-filename-repairer -nautilus-image-converter -nautilus-image-manipulator -nautilus-open-terminal -nautilus-pastebin -nautilus-python -nautilus-scripts-manager -nautilus-sendto -nautilus-share -nautilus-wipe -navi2ch -navit -nbd -nbibtex -nbtscan -nc6 -ncap -ncbi-blast+ -ncbi-tools6 -ncc -ncdt -ncdu -ncftp -ncmpc -ncmpcpp -nco -ncompress -ncpfs -ncurses -ncurses-hexedit -ncview -nd -ndesk-dbus -ndesk-dbus-glib -ndisc6 -ndisgtk -ndiswrapper -ndoutils -ndpmon -ne -neartree -nec -nec2c -necpp -nedit -neko -nekobee -nekohtml -nemiver -neo -neobio -neon27 -net6 -net-acct -netanim -netatalk -netbase -netbeans -netbeans-cvsclient -netcat -netcat-openbsd -netcdf -netcf -netcfg -netdiag -netdisco -netdisco-mibs-installer -netdiscover -net-dns-fingerprint -netemul -netenv -netexpect -nethack -nethack-el -nethack-spoilers -nethogs -netifaces -netio230a -netkit-bootparamd -netkit-ftp -netkit-ftp-ssl -netkit-ntalk -netkit-rsh -netkit-rusers -netkit-rwall -netkit-rwho -netkit-telnet -netkit-telnet-ssl -netkit-tftp -netlib-java -net-luminis-build-plugin -netmask -netmaze -netmrg -netpanzer -netpbm-free -netperfmeter -netpipe -netpipes -netplug -netqmail -netrek-client-cow -net-retriever -netrik -netris -netrw -netscript-2.4 -netsed -netselect -netsend -netsniff-ng -net-snmp -netspeed -netstat-nat -netsurf -net-telnet-cisco -nettle -nettoe -net-tools -netty -netty3.1 -netw-ib-ox-ag -network-config -network-console -networkmanagement -network-manager -network-manager-applet -network-manager-iodine -network-manager-openconnect -network-manager-openvpn -network-manager-pptp -network-manager-strongswan -network-manager-vpnc -neverball -nevow -newbiedoc -newlib -newmail -newmat -newsbeuter -newt -newtonsoft-json -nexuiz -nexuiz-data -nexus -nfdump -nflog-bindings -nfoview -nfqueue-bindings -nfs4-acl-tools -nfs-utils -nfswatch -ng -nget -ngetty -nginx -ngircd -nglister -ngorca -ngraph-gtk -ngrep -ng-utils -nibabel -nickle -nicotine -nicovideo-dl -nictools-pci -nifticlib -nikwi -nilfs-tools -nini -ninix-aya -ninja -ninvaders -nip2 -nipype -nis -nitime -nitpic -nitrogen -njam -njplot -nkf -nlkt -nlme -nload -nlpsolver -nmap -nmapsi4 -nmh -nml -nmon -nmzmail -nn -nobootloader -nodau -node -nodebox-web -nodm -noiz2sa -nomarch -nomnom -nordugrid-arc-doc -normalize-audio -norwegian -nose -nosexcover -nosquint -nostalgy -note -notebook -notification-daemon -notify-osd -notify-python -notify-sharp -notmuch -nova -novnc -noweb -npapi-vlc -npth -nqc -nqp -nrg2iso -nrss -ns2 -nsca -nsd3 -nsis -nslint -nspr -nss -nsscache -nss-mdns -nss-pam-ldapd -nss-passwords -nss-updatedb -nstreams -nted -ntfs-3g -ntfs-config -ntfsdoc -ntl -ntlmaps -ntop -ntp -ntrack -nuapplet -nufw -nukeimage -nullidentd -nullmailer -nulog -numactl -numdiff -numexpr -numlockx -numm -numptyphysics -num-utils -nunit -nurpawiki -nusoap -nut -nut-nutrition -nuttcp -nvclock -nvi -nvidia-settings -nvidia-settings-legacy-173xx -nvidia-support -nvidia-texture-tools -nvidia-xconfig -nvramtool -nvram-wakeup -nvtv -nwall -nwchem -nwdiag -nwrite -nwsclient -nwsserver -nxcl -nx-libs-lite -nxt-python -nyancat -nyquist -nzb -nzbget -oaklisp -oar -oasis -oasis3 -oath-toolkit -oauth-signpost -obby -obconf -obdgpslogger -obexd -obex-data-server -obexfs -obexftp -obexpushd -obfsproxy -objcryst-fox -objenesis -objgraph -obmenu -obnam -oboinus -obrowser -obus -ocaml -ocamlagrep -ocaml-alsa -ocaml-ao -ocaml-atd -ocaml-batteries -ocaml-benchmark -ocaml-bitstring -ocaml-bjack -ocamlbricks -ocaml-config-file -ocamlcreal -ocaml-cry -ocaml-csv -ocaml-curses -ocamldap -ocaml-data-notation -ocaml-dbus -ocaml-deriving -ocaml-deriving-ocsigen -ocamldsort -ocaml-dssi -ocaml-dtools -ocamlduce -ocaml-duppy -ocaml-expat -ocaml-expect -ocaml-extunix -ocaml-faad -ocaml-fileutils -ocaml-flac -ocaml-gavl -ocaml-getopt -ocaml-gettext -ocaml-gnuplot -ocamlgraph -ocamlgsl -ocaml-gstreamer -ocaml-http -ocamlify -ocaml-inifiles -ocaml-inotify -ocaml-ladspa -ocaml-lame -ocaml-lastfm -ocaml-libvirt -ocaml-lo -ocaml-mad -ocaml-magic -ocamlmakefile -ocaml-melt -ocaml-mm -ocamlmod -ocamlnet -ocamlodbc -ocaml-ogg -ocamlpam -ocaml-portaudio -ocaml-pulseaudio -ocaml-reins -ocaml-res -ocaml-samplerate -ocaml-schroedinger -ocamlsdl -ocaml-sha -ocaml-shout -ocaml-soundtouch -ocaml-speex -ocaml-sqlexpr -ocaml-sqlite3 -ocaml-ssl -ocaml-taglib -ocaml-text -ocaml-theora -ocaml-tools -ocaml-usb -ocamlviz -ocaml-voaacenc -ocaml-vorbis -ocamlwc -ocamlweb -ocaml-xmlplaylist -ocaml-zarith -oce -ocfs2-tools -ocl-icd -ocp -ocr4gamera -ocrad -ocrfeeder -ocrodjvu -ocsigen -ocsigenserver -ocsinventory-agent -ocsinventory-server -octave -octave-audio -octave-benchmark -octave-communications -octave-control -octave-dataframe -octave-data-smoothing -octave-econometrics -octave-epstk -octave-financial -octave-fixed -octave-fpl -octave-ga -octave-general -octave-geometry -octave-gsl -octave-image -octave-io -octave-java -octave-linear-algebra -octave-mapping -octave-miscellaneous -octave-missing-functions -octave-nan -octave-nnet -octave-nurbs -octave-ocs -octave-octcdf -octave-octgpr -octave-odepkg -octave-openmpi-ext -octave-optim -octave-optiminterp -octave-pkg-dev -octave-plot -octave-quaternion -octave-secs1d -octave-secs2d -octave-signal -octave-sockets -octave-specfun -octave-splines -octave-statistics -octave-strings -octave-struct -octave-symbolic -octave-tsa -octave-vrml -octave-zenity -ocurl -ode -odin -odot -odt2txt -ofed-docs -offlineimap -oflib -ofono -ofono-phonesim -ogamesim -ogdi-dfsg -oggconvert -oggfwd -oggvideotools -ogmtools -ognl -ogre -ogre-1.8 -ohai -ohcount -oidentd -oidua -oinkmaster -ois -okular -olap4j -oldsys-preseed -olive -olpc-kbdshim -olpc-powerd -olpc-xo1 -olsrd -omake -omega-rpg -omegat -omegat-plugin-tokenizer -omhacks -omins -omnievents -omniorb-dfsg -omt -onak -oneisenough -oneko -oneliner-el -onesixtyone -onetime -onioncat -onscripter -ontv -oocairo -oolite -ooo2dbk -ooolib-perl -ooolib-python -ooo-thumbnailer -oopango -opal -opalmod -opari -openafs -openais -openal-soft -openam -openarena -openarena-085-data -openarena-088-data -openarena-data -openarena-maps -openarena-misc -openarena-players -openarena-players-mature -openarena-textures -open-axiom -openbabel -openbios-ppc -openbios-sparc -openblas -openbmap-logger -openbox -openbox-themes -openbsd-inetd -openbve -openbve-data -opencc -openchange -opencity -openclipart -openclipart2 -open-cobol -openconnect -opencore-amr -opencryptoki -opencsg -openct -opencv -opendict -opendict-lingvosoft -opendkim -opendnssec -openexr -openexr-viewers -openfetion -open-font-design-toolkit -open-gram -openguides -openhackware -openhpi -openid4java -openigtlink -openimageio -openinbrowser -open-invaders -openipmi -open-iscsi -openjade -openjade1.3 -openjdk-6 -openjdk-7 -openjpa -openjpeg -open-jtalk -openlayers -openldap -openload -openlp -openmcdf -openmeeg -openmpi -openmsx -openmsx-catapult -openmsx-debugger -openmx -opennebula -openntpd -openocd -openoffice.org -openoffice.org-dictionaries -openoffice.org-en-au -openoffice.org-hyphenation-pl -openoffice.org-thesaurus-pl -openoffice-python -openopt -openpref -openpyxl -openr2 -openresolv -openrocket -opensaml2 -opensc -openscad -openscap -openscenegraph -opense-basic -openshot -openslide -openslp-dfsg -opensm -opensp -opensrs-client -openssh -openssh-blacklist -openssl -openssl-blacklist -openssn -openstack-common -openstereogram -openstreetmap-map-icons -openstv -openswan -openteacher -openthesaurus -opentk -opentoken -openttd -openttd-opengfx -openttd-openmsx -openturns -openuniverse -openvanilla-modules -open-vm-tools -openvpn -openvpn-auth-ldap -openvpn-auth-radius -openvpn-blacklist -openvrml -openvswitch -openwalnut -openwince-include -openwince-jtag -openxenmanager -openyahtzee -ophcrack -op-panel -opsin -opt -optcomplete -optgeo -opticalraytracer -optipng -opus -opus-tools -ora2pg -orafce -orage -orange -orbit2 -orbital-eunuchs-sniper -orc -oregano -org-mode -origami -original-awk -oroborus -orpie -orville-write -osc -oscache -oscpack -osdclock -osdsh -osgearth -osgi-compendium -osgi-core -osgi-foundation-ee -osm2pgsql -osm-gps-map -osmium -osmo -osmosis -osmpbf -os-prober -osptoolkit -oss4 -oss-compat -ossim -oss-preserve -osspsa -ossp-uuid -otags -otcl -otf -otf2bdf -otp -otpw -otrs2 -otrs2-doc -ots -otter -ounit -outguess -overgod -ovito -owasp-java-html-sanitizer -owfs -owl -ow-util-ant-tasks -owx -oxref -oxygencursors -oxygen-gtk3 -oxygen-icons -p0f -p10cfgd -p11-kit -p3scan -p7zip -p910nd -p9m4 -pacemaker -pachi -packagekit -packagesearch -packaging-dev -packaging-tutorial -packeth -packit -packup -pacman -pacman4console -paco -pacparser -pacpl -padre -pads -page-crunch -pagodacf -paje.app -pal -palbart -palp -pam -paman -pam-dbus -pam-krb5-migrate -pam-mysql -pam-p11 -pam-pgsql -pam-pkcs11 -pam-python -pam-shield -pam-tmpdir -pan -pandas -pandoc -pandora-build -pandorafms-agent -pango1.0 -pango-graphite -pangomm -pangzero -pantomime1.2 -papercut -paperkey -paprass -paprefs -paps -par -par2cmdline -parallel -parallelpython -paramiko -paraview -parcellite -parchive -parcimonie -paredit-el -pari -pari-elldata -pari-extra -pari-galdata -pari-galpol -pari-seadata -paris-traceroute -parley -parole -parprouted -parrot -parsec47 -parsedatetime -parser -parser-mysql -parsewiki -partclone -partconf -parted -partimage -partimage-doc -partitionmanager -partman-auto -partman-auto-crypto -partman-auto-lvm -partman-auto-raid -partman-base -partman-basicfilesystems -partman-basicmethods -partman-btrfs -partman-crypto -partman-efi -partman-ext3 -partman-jfs -partman-lvm -partman-md -partman-multipath -partman-nbd -partman-partitioning -partman-reiserfs -partman-target -partman-ufs -partman-xfs -pasco -pasmo -passage -passepartout -passwdqc -password-gorilla -passwordmaker-cli -paste -pastebinit -pastedeploy -pastescript -pastewebkit -patch -patchage -patcher -patchutils -pathfinder -pathogen -pathological -pathological-music -pauker -paulstretch -pavucontrol -pavuk -pavumeter -paw -pax -paxctl -pax-utils -pbnj -pbs -pbs-drmaa -pbuilder -pbzip2 -pcal -pcalendar -pcaputils -pcapy -pcb -pcb2gcode -pccts -pcf2bdf -pchar -pciutils -pclock -pcmanfm -pcmanx-gtk2 -pcmciautils -pconsole -pcre3 -pcre-ocaml -pcscada -pcsc-cyberjack -pcsc-lite -pcsc-perl -pcsc-tools -pcsxr -pct-scanner-scripts -pd-arraysize -pdb2pqr -pd-bassemu -pd-beatpipe -pd-boids -pd-bsaylor -pd-comport -pd-cxc -pd-cyclone -pd-earplug -pd-ekext -pd-ext13 -pdf2djvu -pdf2svg -pdfchain -pdfcrack -pdfcube -pdfgrep -pd-flite -pdfminer -pdfmod -pdfposter -pdf-presenter-console -pd-freeverb -pdfresurrect -pdfrw -pdfsam -pdfshuffler -pdftk -pdftoipe -pd-ggee -pd-hcs -pd-hid -pd-iemambi -pd-iemmatrix -pd-iemnet -pd-jmmmp -pdl -pd-libdir -pd-list-abs -pdlzip -pd-mapping -pd-markex -pd-maxlib -pdmenu -pd-mjlib -pd-moonlib -pd-motex -pdns -pdnsd -pdns-recursor -pd-osc -pdp -pd-pan -pd-pddp -pd-pdogg -pd-plugin -pd-pmpd -pd-purepd -pd-readanysf -pdsh -pd-sigpack -pd-smlib -pd-vbap -pd-wiimote -pd-windowing -pd-zexy -pear-horde-channel -pearpc -pear-phpunit-channel -pear-symfony-project-channel -pebl -pecomato -pegasus-wms -peg-e -pegsolitaire -peg-solitaire -pekwm -pekwm-themes -pen -penguin-command -pennmush -pentaho-reporting-flow-engine -pente -pentium-builder -pentobi -pep8 -perceptualdiff -percona-toolkit -perdition -perforate -performous -perftest -perl -perl4caml -perlbal -perlbrew -perl-byacc -perlconsole -perl-depends -perl-doc-html -perlindex -perlipq -perlpanel -perlprimer -perltidy -perl-tk -permute -perroquet -personasplus -perspectives-extension -pescetti -pesto -petit -petitboot -petri-foo -petris -petsc -pev -pexec -pexpect -pfb2t1c2pfb -pflogsumm -pfm -pfqueue -pfstmo -pfstools -pgadmin3 -pgagent -pgapack -pgbouncer -pgdbf -pgf -pgfincore -pgfouine -pgloader -pgmemcache -pgn2web -pgn-extract -pgocaml -pgpdump -pgpgpg -pgpool2 -pgsnap -pgstaging -pgtap -pgtcl -pgtune -pgxnclient -phalanx -phamm -phasex -phat -phatch -phenny -phlipple -phnxdeco -phonefsod -phoneui-apps -phoneuid -phonon -phonon-backend-gstreamer -phonon-backend-vlc -phoronix-test-suite -photofilmstrip -photon -photopc -photoprint -php5 -php-adodb -php-apc -php-arc -php-auth -php-auth-http -php-auth-sasl -phpbb3 -php-cache -php-cache-lite -php-cas -php-codecoverage -php-codesniffer -php-compat -php-config -php-console-table -php-crypt-blowfish -php-crypt-cbc -php-date -php-db -php-doc -php-elisp -php-event-dispatcher -php-file -php-file-iterator -php-fpdf -php-geoip -php-getid3 -php-gettext -php-html-common -php-htmlpurifier -php-html-safe -php-html-template-it -php-http -php-http-request -php-http-upload -php-http-webdav-server -php-image-text -php-imagick -php-imlib -php-invoker -phpldapadmin -php-letodms-core -php-letodms-lucene -php-log -php-mail -php-mail-mime -php-mail-mimedecode -php-mdb2 -php-mdb2-driver-mysql -php-mdb2-driver-pgsql -php-mdb2-schema -php-memcache -php-memcached -php-mime-type -phpmyadmin -php-net-checkip -php-net-dime -php-net-dnsbl -php-net-ftp -php-net-imap -php-net-ipv4 -php-net-ipv6 -php-net-ldap -php-net-ldap2 -php-net-lmtp -php-net-nntp -php-net-portscan -php-net-sieve -php-net-smartirc -php-net-smtp -php-net-socket -php-net-url -php-net-url2 -php-net-whois -php-numbers-words -php-openid -php-pager -phppgadmin -php-ps -php-radius -phpreports -php-rrd -php-sasl -php-services-json -php-services-weather -php-soap -php-ssh2 -php-svn -php-symfony-yaml -phpsysinfo -php-text-captcha -php-text-figlet -php-text-password -php-text-template -php-text-wiki -php-timer -php-token-stream -php-tokyo-tyrant -phpunit -phpunit-mock-object -phpunit-selenium -phpunit-story -php-validate -phpwebcounter -phpwebcounter-extra -php-xajax -php-xml-dtd -php-xml-htmlsax3 -php-xml-parser -php-xml-rpc -php-xml-rpc2 -php-xml-rss -php-xml-serializer -phyml -pianobar -pianobooster -picard -picard-tools -picocom -picolisp -picosat -picprog -picviz -pida -pidentd -pidgin -pidgin-audacious -pidgin-awayonlock -pidgin-blinklight -pidgin-encryption -pidgin-extprefs -pidgin-festival -pidgin-gmchess -pidgin-hotkeys -pidgin-lastfm -pidgin-latex -pidgin-librvp -pidgin-microblog -pidgin-mpris -pidgin-mra -pidgin-musictracker -pidgin-nateon -pidgin-openfetion -pidgin-openpgp -pidgin-otr -pidgin-privacy-please -pidgin-sipe -pidgin-skype -pidgin-twitter -piespy -pigment -pigment-python -pigz -pilot-link -pilot-manager -pimd -pinball -pinentry -pinfo -pingus -pinot -pinpoint -pinta -pinyin-database -pioneers -pion-net -pipebench -pipemeter -pipenightdreams -pipewalker -pisa -pisg -pithos -pitivi -piuparts -pius -pivy -piwi -pixbros -pixelize -pixelmed -pixfrogger -pixman -pixmap -pkcs11-data -pkcs11-dump -pkcs11-helper -pkg-components -pkg-config -pkg-kde-tools -pkglab -pkg-mozilla-archive-keyring -pkg-php-tools -pkgsel -pkgsync -pkpgcounter -pktstat -plait -plan -planets -planet-venus -planner -planner-el -plasma-widget-adjustableclock -plasma-widget-cwp -plasma-widget-fastuserswitch -plasma-widget-menubar -plasma-widget-message-indicator -plasma-widget-smooth-tasks -plasma-widget-yawp -plasmidomics -plastex -plastimatch -player -playitslowly -playmidi -playonlinux -plee-the-bear -pleiades -plexus-active-collections -plexus-ant-factory -plexus-archiver -plexus-bsh-factory -plexus-build-api -plexus-cdc -plexus-cipher -plexus-classworlds -plexus-classworlds2 -plexus-cli -plexus-compiler -plexus-component-api -plexus-component-metadata -plexus-container-default -plexus-containers -plexus-containers1.5 -plexus-digest -plexus-i18n -plexus-interactivity-api -plexus-interpolation -plexus-io -plexus-maven-plugin -plexus-sec-dispatcher -plexus-utils -plexus-utils2 -plexus-velocity -plib -plib-doc -plink -ploader -plopfolio.app -plotdrop -ploticus -ploticus-doc -plotmm -plotutils -plplot -plptools -plr -plucker -plum -ply -plymouth -plywood -plzip -pmacct -pmailq -pmake -pmccabe -pmidi -pmk -pmount -pms -pmtools -pm-utils -pmw -pmx -png++ -png23d -png2html -pngcheck -pngcrush -png-definitive-guide -pnglite -pngmeta -pngnq -pngphoon -pngquant -png-sixlegs -pngtools -pnm2ppa -pnopaste -pnp4nagios -pnscan -po4a -poa -pocketpc-cab -poco -poco-doc -poc-streamer -pod2pdf -podbrowser -po-debconf -podget -podracer -poe.app -poedit -poker-eval -pokerth -polarssl -poldi -polib -policycoreutils -policyd-weight -policykit-1 -policykit-1-gnome -policyrcd-script-zg2 -polipo -polkit-kde-1 -polkit-qt-1 -polspline -polybori -polygen -polyglot -polygraph -polylib -polyml -polyorb -pommed -pondus -pong2 -pop3browser -popa3d -poppass-cgi -poppassd -poppler -poppler-data -popplerkit.framework -poppler-sharp -popt -popularity-contest -populations -pork -portabase -portaudio -portaudio19 -portlet-api-2.0-spec -portmidi -portreserve -portsentry -portslave -portsmf -posh -posixlock -posixtestsuite -postal -post-el -poster -posterazor -post-faq -postfix -postfixadmin -postfix-cluebringer -postfix-gld -postfix-policyd-spf-perl -postfwd -postgis -postgresql-8.4 -postgresql-9.1 -postgresql-autodoc -postgresql-common -postgresql-debversion -postgresql-filedump -postgresql-ocaml -postgresql-pgmp -postgresql-pljava -postgresql-pllua -postgresql-plproxy -postgresql-plsh -postgrey -postmark -postnews -postpone -postr -potool -potrace -pound -powerman -powermanga -powermgmt-base -powertop -powstatd -pperl -ppl -ppmd -ppp -pppconfig -pppoeconf -pp-popularity-contest -pps-tools -pptpd -pptp-linux -pqiv -praat -prads -prayer -prboom -prctl -predict -prefix -prelink -preload -prelude-correlator -prelude-lml -prelude-manager -prelude-notify -premail -premake -preprepare -preprocess -prerex -presage -preseed -prettytable -pretzel -preview.app -prewikka -prey -price.app -prima -primaxscan -prime -prime-dict -primer3 -primrose -printer-applet -printfilters-ppd -printing-metas -prips -prison -pristine-tar -privbind -privoxy -probalign -probcons -processing-core -procinfo -procmail -procmail-lib -procmeter3 -procps -procserv -proda -profnet -profphd -profphd-utils -proftmb -proftpd-dfsg -proftpd-mod-autohost -proftpd-mod-case -proftpd-mod-clamav -proftpd-mod-dnsbl -proftpd-mod-fsync -proftpd-mod-geoip -proftpd-mod-msg -proftpd-mod-tar -proftpd-mod-vroot -proguard -proj -projectcenter.app -projectl -projectm -proj-ps-doc -prolix -proll -prolog-el -promoe -proofgeneral -propaganda-debian -prophet -prosody -prosper -protoaculous -protobuf -protobuf-c -prototypejs -prover9-manual -proxsmtp -proxychains -proxycheck -proxy-suite -proxytunnel -ps2eps -psad -pscan -psensor -psgml -psi -psicode -psignifit -psignifit3 -psimedia -psi-plus -psi-translations -pslib -pslist -psmisc -pspp -pspresent -psqlodbc -psrip -pssh -pstack -pstoedit -pstotext -pstreams -psutils -ps-watcher -psychopy -psychtoolbox-3 -psycopg2 -ptex2tex -ptex-base -ptex-buildsupport -pth -ptlib -ptop -ptouch-driver -ptpd -ptunnel -publib -publican -publican-debian -pubtal -pudb -puddletag -puf -pugl -pulseaudio -pump -puppet -puppet-lint -puredata -puredata-import -pure-ftpd -purelibc -purifyeps -purity -purity-ng -purity-off -purple-plugin-pack -putty -pv -pvclust -pvm -pvpgn -pvrg-jpeg -pwauth -pwdhash -pwgen -pwget -pwman3 -pwrkap -pxe -pxe-kexec -pxlib -pxljr -pxp -pxsl-tools -py3cairo -py3dns -pyacidobasic -pyacoustid -pyaimt -pyalsaaudio -pyamf -pyao -pyasn1 -py-asterisk -pyatspi -pybik -pybliographer -pyblosxom -pybluez -pybridge -pybtex -pyca -pycairo -pycalendar -pycallgraph -pycaml -pycaptcha -pycha -pychecker -pychess -pychm -pyclamd -pycmail -pycocuma -pycountry -pycparser -pycryptopp -pycuda -pycurl -pycxx -pydap -pydb -pydf -pydhcplib -pydicom -pydirector -pydoctor -pydot -pyecm -pyenchant -pyentropy -pyepl -pyepr -pyevolve -pyew -pyexcelerator -pyexiv2 -pyfai -pyfiglet -pyfits -pyflakes -pyfltk -pyformex -pyfribidi -pyftpd -pyg -pygame -pygccxml -pygdchart2 -pyglet -pygments -pygmy -pygobject -pygobject-2 -pygoocanvas -pygooglechart -pygopherd -pygpgme -pygpiv -pygrace -pygresql -pygrib -pygtk -pygtkmvc -pygtksourceview -pyhamcrest -pyicqt -pyicu -pyimport-relative -pyinotify -pyip -pyjavaproperties -pyjunitxml -pykaraoke -pykcs11 -pykde4 -pyke -pykerberos -pykickstart -pylast -pyliblo -pylibmc -py-libmpdclient -pylibravatar -pylibssh2 -pylint -pylirc -pylogsparser -pylons -pylucene -pymacs -pymad -pymca -pyme -pymecavideo -pymetrics -pymilter -pymilter-milters -pymissile -pymodbus -pymol -pymongo -pymsnt -pymssql -pymtbl -pymtp -pymvpa -pymvpa2 -pynagram -pyneighborhood -pynetsnmp -pynifti -pynn -pyntor -pyodbc -pyode -pyogg -pyopencl -pyopengl -pyopenssl -pyoptical -pyorbit -pyp -pypar2 -pyparallel -pyparsing -pyparted -pype -pypibrowser -pyplusplus -pypolicyd-spf -py-postgresql -pyppd -pyprotocols -pypureomapi -pyquery -pyqwt3d -pyqwt5 -pyracerz -pyrad -py-radix -pyragua -pyramid-beaker -pyrenamer -pyrex -pyrit -pyrite-publisher -pyro -pyroman -pyroom -pyrrd -pysatellites -pyscard -pyscrabble -pyscript -py-sendfile -pyserial -pysesame -pyshp -pyside -pyside-tools -pysieved -pysmbc -pysolfc -pysolfc-cardsets -pysparse -pyspatialite -pyspf -pyspi -pyspread -pystatgrab -pystemmer -pysubnettree -pysurfer -pysvn -pysycache -pytables -pytagsfs -pytango -pytest -pytest-xdist -pyth -pythia8 -python2.6 -python2.7 -python3.2 -python3-chardet -python3-dateutil -python3-defaults -python3-stdlib-extensions -python-aalib -python-adns -python-adodb -python-aiml -python-amqplib -python-anyjson -python-application -python-apptools -python-apsw -python-apt -python-ase -python-aspects -python-async -python-augeas -python-authkit -python-avc -python-axiom -python-babel -python-bibtex -python-biggles -python-biopython -python-bitarray -python-bitbucket -python-bloomfilter -python-boto -python-bottle -python-box2d -python-bsddb3 -python-buzhug -python-byteplay -python-bzutils -pythoncad -pythoncard -python-carrot -python-cdd -python-cddb -python-central -python-chaco -python-chameleon -python-cherrypy -python-cjson -python-cl -python-clamav -python-cliapp -python-clint -python-cloudfiles -python-cloudservers -python-cluster -python-cobe -python-cogent -python-colorama -python-concurrent.futures -python-configglue -python-contract -python-couchdb -python-couchdbkit -python-coverage -python-coverage-test-runner -python-cpl -python-crypto -python-csa -python-cssselect -python-ctypeslib -python-cups -python-daap -python-daemon -python-dateutil -python-debian -python-debianbts -python-decorator -python-defaults -python-defer -python-demgengeo -python-demjson -python-dexml -python-dhm -pythondialog -python-dingus -python-distutils-extra -python-django -python-django-contact-form -python-django-debug-toolbar -python-django-djapian -python-django-extdirect -python-django-feincms -python-django-formfieldset -python-django-lint -python-django-localeurl -python-django-mptt -python-django-registration -python-django-rosetta -python-django-shorturls -python-django-social-auth -python-django-south -python-django-tagging -python-django-threadedcomments -python-django-tinymce -python-django-treebeard -python-django-voting -python-django-websocket -python-djvulibre -python-dmidecode -python-dns -python-docutils -python-dpkt -python-drizzle -python-dsv -python-easygui -python-edbus -python-elements -python-enable -python-enet -python-enthoughtbase -python-enum -python-envisage -python-envisagecore -python-envisageplugins -python-espeak -python-ethtool -python-eventlet -python-exif -python-fabio -python-facebook -python-fastimport -python-feedvalidator -python-fftw -python-fixtures -python-flexmock -python-flickrapi -python-formalchemy -python-formencode -python-fs -python-fudge -python-fuse -python-gasp -python-gd -python-gdata -python-gearman -python-geoclue -python-geohash -python-geoip -python-gevent -python-gflags -python-git -python-gitdb -python-glpk -python-gmpy -python-gnatpython -python-gnupg -python-gnuplot -python-gnutls -python-goopy -python-graph -python-greenlet -python-gtk2-tutorial -python-gtkglext1 -python-gudev -python-gvgen -python-hl7 -python-html2text -python-htmltmpl -python-httplib2 -python-http-parser -python-id3 -python-igraph -python-imaging -python-imaging-doc-handbook -python-iniparse -python-initgroups -python-iowait -python-ipaddr -python-ipcalc -python-iplib -python-irclib -python-iso8583 -python-iso8601 -python-jpype -python-jsonrpc2 -python-jsonschema -python-jswebkit -python-kajiki -python-keyczar -python-keyring -python-keystoneclient -python-kinterbasdb -python-krbv -python-lamson -python-larch -python-launchpadlib -python-ldap -python-ldap-doc -python-lepl -python-leveldb -python-levenshtein -python-liblas -python-libpcap -python-lightblue -python-llfuse -python-lockfile -python-logging-extra -python-lzma -python-lzo -python-macaron -pythonmagick -python-mailer -python-markdown -python-mecab -python-mechanize -python-medusa -python-melangeclient -python-meld3 -python-memcache -python-messaging -python-mhash -python-midiutil -python-mimeparse -python-minimock -python-mock -python-mode -python-mod-pywebsocket -python-mongoengine -python-mox -python-mpd -python-mrjob -python-musicbrainz2 -python-mysqldb -python-netaddr -python-netfilter -python-networkx -python-neuroshare -python-nids -python-nmap -python-notify2 -python-novaclient -python-nss -python-numpy -python-oauth -python-oauth2 -python-oauthlib -python-old-doctools -python-omniorb -python-openid -python-opster -python-osd -python-otr -python-pam -python-passfd -python-passlib -python-pcs -python-pdftools -python-peak.rules -python-peak.util -python-pefile -python-pgmagick -python-phoneutils -python-pika -python-pip -python-pipeline -python-plwm -python-pmw -python-popcon -python-poppler -python-poppler-qt4 -python-poster -python-pqueue -python-prctl -python-progressbar -python-protobuf.socketrpc -python-prowlpy -python-psutil -python-ptrace -python-pyalsa -python-pyaudio -python-pychart -python-pyds9 -python-pyface -python-pyftpdlib -python-pygraphviz -python-pyhsm -python-pylibacl -python-pymetar -python-pynast -python-pyo -python-pypcap -python-pypdf -python-pypm -python-pyproj -python-pyramid -python-pyramid-tm -python-pyramid-zcml -python-pyrss2gen -python-pysearch -python-pysnmp4 -python-pysnmp4-apps -python-pysnmp4-mibs -python-pysolr -python-pysqlite1.1 -python-pysqlite2 -python-pytc -python-pytils -python-pytyrant -python-pywcs -python-pyxattr -python-qrencode -pythonqt -python-qt4 -python-quantities -python-quantumclient -python-recaptcha -python-redis -python-regex -python-reportlab -python-repoze.lru -python-repoze.sphinx.autointerface -python-repoze.tm2 -python-repoze.what -python-repoze.what-plugins -python-repoze.who -python-repoze.who-plugins -python-restkit -python-scientific -python-scipy -python-scrapy -python-scriptutil -python-setproctitle -python-setupdocs -python-sfml -python-shapely -python-simpy -python-slimmer -python-smbpasswd -python-smmap -python-snappy -python-soaplib -python-soappy -python-socketpool -python-socksipy -python-sponge -python-sptest -python-sqlite -python-stdlib-extensions -python-stdnum -python-stompy -python-sunlight -python-support -python-tcpwrap -python-tempita -python-testscenarios -python-testtools -python-textile -python-tgext.admin -python-tidylib -python-torctl -python-tornado -python-toscawidgets -pythontracer -python-tracing -python-traits -python-traitsbackendqt -python-traitsbackendwx -python-traitsgui -python-traitsui -python-translationstring -python-trml2pdf -python-ttystatus -python-txosc -python-tz -python-ucltip -python-unac -python-unicodecsv -python-uniconvertor -python-unipath -python-unit -python-unshare -python-urllib3 -python-utmp -python-venusian -python-virtualenv -python-visual -python-vobject -python-vsgui -python-w3lib -python-wadllib -python-weberror -python-webflash -python-weblib -python-webob -python-webunit -python-werkzeug -python-whisper -python-whiteboard -python-whois -python-whoosh -python-wordpress-library -python-wxmpl -python-xattr -python-xklavier -python-xlib -python-xlrd -python-xmlrunner -python-xmltv -python-xmpp -python-yenc -python-yubico -pytimechart -pytone -pytools -pytracer -pytrainer -pyudev -pyusb -pyvnc2swf -pyvorbis -pyvtk -pywapi -pywavelets -pywbem -pywebdav -pywebkitgtk -pyx -pyxdg -pyxid -pyxine -pyxmpp -pyxnat -pyxpcom -pyxplot -pyyaml -pyzmq -pyzor -q4wine -qalculate-gtk -qantenna -qapt -qastools -qbankmanager -qbittorrent -qbrew -qbzr -qca2 -qca2-plugin-gnupg -qca2-plugin-ossl -qca-cyrus-sasl -qcad -qcomicbook -qconf -qct -qd -qdacco -qdbm -qdjango -qdox -qedje -qelectrotech -qemu -qemuctl -qemu-kvm -qemu-launcher -qfits -qgis -qgit -qgo -qhull -qiime -qimageblitz -qimhangul -qingy -qiv -qjackctl -qjackrcd -qjson -qlandkartegt -qla-tools -qliss3d -qlvnictools -qmail-run -qmail-tools -qmc -qmf -qmhandle -qmidiarp -qmidinet -qmidiroute -qmmp -qmpdclient -qmtest -qnapi -qoauth -qof -qonk -qpdf -qpdfview -qpid-cpp -qpid-python -qpid-qmf -qpid-tools -qprint -qpsmtpd -qpxtool -qrencode -qrfcview -qrq -qr-tools -qrupdate -qsampler -qsapecng -qscintilla2 -qsf -qsstv -qstardict -qstat -qsynth -qt4-perl -qt4-x11 -qtads -qt-assistant-compat -qt-at-spi -qtcreator -qtemu -qterm -qtexengine -qt-gstreamer -qthid-fcd-controller -qtiplot -qtl -qtm -qtmobility -qtoctave -q-tools -qtractor -qtruby -qtscriptgenerator -qtscrob -qt-sdk -qtsmbstatus -qtwebkit -qtzeitgeist -quadprog -quagga -quake -quake3 -quakespasm -quantlib -quantlib-refman-html -quantlib-swig -quantum -quarry -quassel -quelcom -quesoglc -queuegraph -quicklisp -quickml -quickplot -quicksynergy -quilt -quilt-el -quisk -quitcount -quixote -quixote1 -quodlibet -quodlibet-plugins -quota -quotatool -quotecolors -qutecom -qutecsound -qutemol -quvi -qviaggiatreno -qwbfsmanager -qwo -qwt -qwt5 -qwtplot3d -qxmlrpc -qxmpp -qxw -qzion -r5rs-doc -rabbit -rabbitmq-server -rabbitsign -rabbitvcs -rabbyt -racc -raccoon -racket -radare2 -radare2-bindings -radeontool -radiance -radicale -radioclk -radiotray -radiusclient -radiusclient-ng -radiusd-livingston -radsecproxy -radvd -rafkill -ragel -raidutils -rail -rails -rainbow -raincat -rakarrack -rake -rake-compiler -rakudo -ramond -rancid -randomize-lines -randomplay -randomsound -randtype -ranger -rant -rapid-photo-downloader -rapid-spring -rapidsvn -raptor -raptor2 -rarian -rarpd -raschsampler -rasmol -raspell -rasqal -raster3d -rastertosag-gdi -rat -ratbox-services -ratfor -ratmenu -ratpoison -ratproxy -rats -raul -rawdog -rawstudio -rawtherapee -raxml -razor -r-base -rbenv -r-bioc-biobase -r-bioc-biocgenerics -r-bioc-cummerbund -r-bioc-edger -r-bioc-hilbertvis -r-bioc-limma -r-bioc-qvalue -rblcheck -rbldnsd -rbootd -rbot -rbtools -rc -rcconf -rcmdr -rcolorbrewer -rcov -rcpp -r-cran-amelia -r-cran-amore -r-cran-bayesm -r-cran-class -r-cran-coda -r-cran-colorspace -r-cran-combinat -r-cran-deal -r-cran-diagnosismed -r-cran-digest -r-cran-domc -r-cran-dosnow -r-cran-eco -r-cran-epi -r-cran-epibasix -r-cran-epicalc -r-cran-epir -r-cran-epitools -r-cran-evd -r-cran-foreach -r-cran-gam -r-cran-g.data -r-cran-genabel -r-cran-genetics -r-cran-getopt -r-cran-ggplot2 -r-cran-gmaps -r-cran-haplo.stats -r-cran-hdf5 -r-cran-inline -r-cran-int64 -r-cran-iterators -r-cran-lpsolve -r-cran-mapdata -r-cran-mapproj -r-cran-maps -r-cran-mass -r-cran-medadherence -r-cran-mnp -r-cran-msm -r-cran-multicore -r-cran-nnet -r-cran-nws -r-cran-plotrix -r-cran-plyr -r-cran-proto -r-cran-pscl -r-cran-psy -r-cran-randomforest -r-cran-reshape -r-cran-reshape2 -r-cran-rjags -r-cran-rms -r-cran-rocr -r-cran-rsqlite -r-cran-runit -r-cran-slam -r-cran-sn -r-cran-sp -r-cran-spatial -r-cran-spc -r-cran-stabledist -r-cran-stringr -r-cran-surveillance -r-cran-teachingdemos -r-cran-timedate -r-cran-timeseries -r-cran-vcd -r-cran-vegan -r-cran-vgam -r-cran-xml -r-cran-xtable -rcs -rcs-blame -rcs-latex -rdate -rdd -rdesktop -rdfind -rdflib -rdiff-backup -rdiff-backup-fs -rdist -rdkit -rds-tools -rdtool -rdup -re -re2c -react -readahead-fedora -read-edid -readline5 -readline6 -readseq -realpath -realtimebattle -reaver -rebuildd -recite -recode -recoll -reconf-inetd -recordmydesktop -recover -recoverdm -recoverjpeg -recutils -red5 -redeclipse -redet -redhat-cluster -redir -redis -redland -redland-bindings -redmine -redmine-plugin-botsfilter -rednotebook -redshift -redsocks -ree -refcard -refcontrol -referencer -refit -refpolicy -regexxer -regina-normal -regina-rexx -regionset -reglookup -reinteract -reiser4progs -reiserfsprogs -rekonq -relational -relatorio -relimp -remake -remctl -remem -remember-el -remind -reminiscence -remmina -remotetea -remote-tty -remuco -renaissance -renameutils -renattach -reniced -renpy -renrot -rep-gtk -rephrase -reportbug -reportbug-ng -reprepro -reprof -reptyr -requestpolicy -requests -request-tracker4 -resample -rescue -resiprocate -resolvconf -resource-agents -rest2web -restartd -retext -revelation -rev-plugins -rexima -rfdump -rfkill -rfoo -rgain -rgbpaint -rggobi -rgl -rglpk -rgtk2 -rhash -rheolef -rhino -rhinote -rhn-client-tools -rhnlib -rhythmbox -ricochet -riece -rifiuti -rifiuti2 -rig -ri-li -rinetd -rinse -ripit -ripole -ripperx -ristretto -rivet -rjava -rkhunter -rkward -rlinetd -rlog -rlplot -rlpr -rlvm -rlwrap -rmagic -rman -rmatrix -rmpi -rmysql -rnahybrid -rnc-mode -rng-tools -roaraudio -roarplaylistd -robert-hooke -robocode -robocut -robojournal -robotfindskitten -robustbase -robust-http-client -rockdodger -rocksndiamonds -rocs -rodbc -roffit -rofs-fuse -rolldice -rome -rootskel -rootskel-gtk -rootstrap -root-system -root-tail -rope -ropemacs -rosegarden -r-other-bio3d -r-other-mott-happy -rotix -rott -rotter -roundcube -roundcube-plugins-extra -roundup -routeplanner -routes -routino -rovclock -rox -roxterm -rpart -rpcbind -rpl -rplay -rpm -rpm2html -rp-pppoe -rpy -rpy2 -rquantlib -rrdcollect -rrdtool -rrep -rrootage -rs -rsakeyfind -rserve -rsh-redone -rsibreak -rsnapshot -rsprng -rsrce -rss2email -rss2irc -rss-glx -rssh -rsskit -rsstail -rst2pdf -rstatd -rsymphony -rsync -rsyncrypto -rsyntaxtextarea -rsyslog -rtai -rtaudio -rt-authen-externalauth -rt-extension-assettracker -rtfilter -rtgui -rtirq -rtkit -rtmidi -rtmpdump -rtorrent -rtpg -rtpproxy -rtslib -rt-tests -rttool -rubber -rubberband -rubrica -ruby1.8 -ruby1.9.1 -ruby-actionmailer-2.3 -ruby-actionmailer-3.2 -ruby-actionpack-2.3 -ruby-actionpack-3.2 -ruby-activeldap -ruby-activemodel-3.2 -ruby-activerecord-2.3 -ruby-activerecord-3.2 -ruby-activeresource-2.3 -ruby-activeresource-3.2 -ruby-activesupport-2.3 -ruby-activesupport-3.2 -ruby-addressable -ruby-aggregate -ruby-albino -ruby-algorithm-diff -ruby-amazon -ruby-amazon-ec2 -ruby-amq-client -ruby-amqp -ruby-amq-protocol -ruby-amrita -ruby-amrita2 -ruby-archive-tar-minitar -ruby-arel -ruby-ascii85 -ruby-bacon -ruby-barby -ruby-bcrypt -ruby-bdb -ruby-bio -ruby-blankslate -ruby-bluecloth -ruby-bsearch -ruby-build -ruby-builder -ruby-bunny -ruby-cairo -ruby-capistrano-colors -ruby-cassiopee -ruby-childprocess -ruby-chronic -ruby-chunky-png -ruby-classifier -ruby-cmdparse -ruby-color-tools -ruby-commandline -ruby-compass -ruby-contest -ruby-daemons -ruby-dataobjects -ruby-dataobjects-mysql -ruby-dataobjects-postgres -ruby-dataobjects-sqlite3 -ruby-dbd-mysql -ruby-dbd-odbc -ruby-dbd-pg -ruby-dbd-sqlite3 -ruby-dbi -ruby-dbus -ruby-debian -ruby-defaults -ruby-deprecated -ruby-dep-selector -ruby-diff-lcs -ruby-directory-watcher -ruby-domain-name -ruby-dust -ruby-eb -ruby-echoe -ruby-eim-xml -ruby-em-http-request -ruby-erubis -ruby-escape-utils -ruby-event-loop -ruby-eventmachine -ruby-excon -ruby-exif -ruby-extlib -ruby-facets -ruby-fakefs -ruby-fastercsv -ruby-fast-gettext -ruby-fast-stemmer -ruby-fast-xs -ruby-feedparser -ruby-feedtools -ruby-ferret -ruby-ffi -ruby-fftw3 -ruby-file-tail -rubyfilter -ruby-flexmock -ruby-fog -ruby-formatador -ruby-fssm -ruby-fusefs -ruby-gd -ruby-gelf -rubygems -rubygems-integration -ruby-gettext -ruby-gettext-activerecord -ruby-gettext-rails -ruby-gherkin -ruby-gir-ffi -ruby-git -ruby-globalhotkeys -ruby-gnome2 -ruby-gnuplot -ruby-god -ruby-googlecharts -ruby-gpgme -ruby-graffiti -ruby-grib -ruby-gruff -ruby-gsl -ruby-haml -ruby-hdfeos5 -ruby-heckle -ruby-hiera -ruby-hiera-puppet -ruby-highline -ruby-hike -ruby-hikidoc -ruby-hmac -ruby-hoe -ruby-hpricot -ruby-htmlentities -ruby-httpclient -ruby-i18n -ruby-ihelp -ruby-image-science -ruby-imagesize -ruby-indentation -ruby-inline -ruby-innate -ruby-inotify -ruby-instantiator -ruby-introspection -ruby-ipaddress -ruby-journey -ruby-jquery-rails -ruby-json -ruby-kakasi -ruby-kgio -ruby-kramdown -ruby-krb5-auth -ruby-lapack -ruby-ldap -ruby-libvirt -ruby-libxml -ruby-liquid -ruby-locale -ruby-locale-rails -ruby-lockfile -ruby-log4r -rubyluabridge -ruby-mab -ruby-magic -ruby-mail -ruby-maruku -ruby-mathml -ruby-mecab -ruby-mechanize -ruby-memcache-client -ruby-merb-assets -ruby-merb-core -ruby-merb-haml -ruby-merb-helpers -ruby-merb-param-protection -ruby-metaclass -ruby-metaid -ruby-method-source -ruby-mime-types -ruby-minitest -ruby-mixlib-authentication -ruby-mixlib-cli -ruby-mixlib-config -ruby-mixlib-log -ruby-mixlib-shellout -ruby-mkrf -ruby-mocha -ruby-moneta -ruby-mp3info -ruby-mp3tag -ruby-msgpack -ruby-multibitnums -ruby-multi-json -ruby-mustache -ruby-mysql -ruby-narray -ruby-narray-miss -ruby-ncurses -ruby-netcdf -ruby-net-http-digest-auth -ruby-net-http-persistent -ruby-net-irc -ruby-net-ldap -ruby-net-netrc -ruby-net-scp -ruby-net-sftp -ruby-net-ssh -ruby-net-ssh-gateway -ruby-net-ssh-multi -ruby-nokogiri -ruby-nora -ruby-ntlm -ruby-oauth -ruby-odbc -ruby-ogginfo -ruby-oily-png -ruby-ole -ruby-open4 -ruby-opengl -ruby-openid -ruby-packet -ruby-parser -ruby-parsetree -ruby-passenger -ruby-password -ruby-pcap -ruby-pdf-inspector -ruby-pdf-reader -ruby-peach -ruby-pg -ruby-pgplot -ruby-pkg-config -ruby-pkg-tools -ruby-platform -ruby-polyglot -ruby-popen4 -ruby-posix-spawn -ruby-prawn -ruby-prof -ruby-progressbar -ruby-rack -ruby-rack-cache -ruby-rack-protection -ruby-rack-ssl -ruby-rack-test -ruby-rails-2.3 -ruby-rails-3.2 -ruby-railties-3.2 -ruby-raindrops -ruby-rb-inotify -ruby-rc4 -ruby-rchardet -ruby-rdiscount -ruby-redcarpet -ruby-redcloth -ruby-rest-client -ruby-revolution -ruby-rmagick -ruby-romkan -ruby-ronn -ruby-rqrcode -ruby-rr -ruby-rspec -ruby-rspec-core -ruby-rspec-expectations -ruby-rspec-mocks -ruby-ruby2ruby -ruby-rubyforge -ruby-rubymail -ruby-rubytorrent -ruby-sass -ruby-sass-rails -ruby-sdl -ruby-sequel -ruby-sequel-pg -ruby-serialport -ruby-session -ruby-setup -ruby-sexp-processor -ruby-shadow -ruby-shoulda -ruby-shoulda-context -ruby-shoulda-matchers -ruby-sigar -ruby-sinatra -ruby-slop -ruby-sourcify -ruby-spreadsheet -ruby-sprockets -ruby-sqlite3 -ruby-stomp -ruby-svg-graph -ruby-switch -ruby-systemtimer -ruby-systemu -ruby-taglib2 -ruby-term-ansicolor -ruby-termios -ruby-test-declarative -ruby-test-spec -ruby-test-unit -ruby-text -ruby-text-format -ruby-thor -ruby-tidy -ruby-tilt -ruby-tioga -ruby-tmail -ruby-tokyocabinet -ruby-transaction-simple -ruby-treetop -ruby-trollop -ruby-ttfunk -ruby-twitter4r -ruby-tzinfo -ruby-uconv -ruby-unf -ruby-unf-ext -ruby-usb -ruby-uuidtools -ruby-validatable -ruby-webrobots -ruby-whitewash -ruby-will-paginate -ruby-wirble -ruby-xmlparser -ruby-xml-simple -ruby-yajl -ruby-yard-sinatra -ruby-zoom -rudecgi -ruli -rumor -rungetty -runit -runlim -runsnakerun -rush -rus-ispell -rxp -rxtx -rxvt -rxvt-beta -rxvt-unicode -rygel -rzip -r-zoo -s2tc -s3cmd -s3d -s3ql -s5 -s51dude -sablecc -sabnzbdplus -sac -sacjava -sa-exim -safecat -safecopy -safe-hole-perl -safe-rm -sagan -sagan-rules -sagasu -sage -sage-extension -sailcut -saint -sakura -sa-learn-cyrus -salliere -sam2p -samba -samba4 -samdump2 -samhain -samidare -samizdat -sampleicc -samtools -sandboxgamemaker -sanduhr -sandwich -sane-backends -sane-backends-extras -sane-frontends -sanitizer -sanlock -saods9 -sapgui-package -sapphire -sarg -sary -sary-ruby -sash -sass-elisp -sat4j -sauce -sauerbraten -sauerbraten-wake6 -savi -sawfish -sawfish-merlin-ugliness -sawfish-themes -saxonb -saytime -sbcl -sbjson -sbnc -sbox-dtc -sbrsh -sbuild -sc -scala -scalable-cyrfonts -scala-mode-el -scalapack -scalapack-doc -scalc -scalpel -scamper -scanbuttond -scanlogd -scanmem -scanssh -scantool -scapy -scatterplot3d -scgi -schedtool -scheme2c -scheme48 -scheme9 -schism -schleuder -schroedinger -schroot -scid -scidavis -scid-rating-data -scid-spell-data -scikit-learn -scilab -scilab-ann -scilab-celestlab -scilab-jims -scilab-plotlib -scilab-scimysql -scim -scim-canna -scim-chewing -scim-kmfl-imengine -scim-m17n -scim-skk -scim-tables -scim-thai -scim-unikey -sciplot -scirenderer -sciscipy -scite -sciteproj -scitools -sclapp -scli -scm -scmail -scmxx -scolasync -scons -scons-doc -scorched3d -scotch -scottfree -scour -scowl -scrapbook -scratch -scratchbox2 -screader -screen -screenie -screenie-qt -screenlets -screen-message -screenruler -screentest -scribble -scribes -scribus -scribus-ng -scribus-template -scriptaculous -scrollz -scrot -scrounge-ntfs -scrub -scrypt -scsh-0.6 -scsh-defaults -scsh-install-lib -scsitools -scummvm -scute -scuttle -scythestat -sdate -sdcc -sdcv -sdf -sdic -sdl-ball -sdlbasic -sdlgfx -sdl-image1.2 -sdl-mixer1.2 -sdl-net1.2 -sdlpango -sdl-sound1.2 -sdl-stretch -sdl-ttf2.0 -sdo-api-java -sdop -sdpa -sdparm -sdpnetstat -seabios -seahorse -searchandrescue -searchandrescue-data -search-ccsb -search-citeseer -searchload-options -searchmonkey -sec -seccure -secpanel -secure-delete -secvpn -sed -see -seed -seesat5 -segment -seivot -select-xface -selinux-basics -semi -semweb -sendemail -sendfile -sendip -sendmail -sendpage -sendxmpp -sensible-utils -sensors-applet -sentinella -sepia -sepolgen -seq24 -seqan -seqdiag -ser2net -serd -serf -series60-remote -serp -servefile -serverstats -service-wrapper-java -setcd -set-crontab-perl -setools -setpwc -setserial -sexplib310 -sextractor -seyon -sezpoz -sfact -sfftobmp -sffview -sflphone -sfront -sfst -sg3-utils -sgf2dg -sgml2x -sgml-base -sgml-base-doc -sgml-data -sgml-spell-checker -sgmltools-lite -sgrep -sgt-puzzles -shadow -shake -shanty -shapelib -shaperd -shapetools -shared-desktop-ontologies -shared-mime-info -sharutils -shatag -shed -shedskin -shelldap -shell-fm -shellinabox -shelltestrunner -shelr -shelxle -shhmsg -shhopt -shibboleth-sp2 -shiboken -shiki-colors-murrine -shinken -shisen.app -shishi -shntool -shoes -shorewall -shorewall6 -shorewall6-lite -shorewall-core -shorewall-doc -shorewall-init -shorewall-lite -shotdetect -shotwell -showq -shrinksafe -shr-specs -shtool -shunit2 -shush -shutdown-at-night -shutdown-qapps -shutter -sibsim4 -sic -sidplay -sidplay-base -sidplayfp -sidplay-libs -siege -sieve-connect -sieve-extension -siggen -sigma-align -signify -signing-party -sigrok -sigrok-cli -sigscheme -sigviewer -sikuli -silentjack -silgraphite2.0 -silly -silo-llnl -sim4 -simage -simba -simgrid -simh -simhash -similarity-tester -simile-timeline -simple-cdd -simplegeneric -simpleid -simpleid-ldap -simple-image-reducer -simplejson -simplelist -simpleparse -simplepie -simpleproxy -simplesamlphp -simple-scan -simpletal -simple-xml -simplyhtml -simulavr -simulpic -simutrans -simutrans-pak128.britain -simutrans-pak64 -since -sineshaper -sinfo -singularity -singularity-music -sinntp -sip4 -sipcalc -sipcrack -siproxd -sipsak -sip-tester -sipwitch -sisc -siscone -sispmctl -sisu -sisu-guice -sisu-ioc -sitecopy -sitemesh -sitesummary -sitplus -six -sixpack -sjeng -sjfonts -skalibs -skanlite -sketch -skimage -skinedit -skipfish -skkdic -skksearch -skktools -skrooge -sks -sks-ecc -skstream -skyeye -skytools -sl -slack -slang2 -slashem -slashtime -slay -slbackup -slbackup-php -slcfitsio -slcurl -sleekxmpp -sleepd -sleepenh -slepc -sleuthkit -slexpat -slgdbm -slgsl -slhist -slib -slice -slides -slim -slimbox -slime -slimevolley -slimit -slimrat -slingshot -slirp -slmon -sloccount -slpvm -slrn -slrnface -slsqlite -sludge -slugimage -slurm -slurm-drmaa -slurm-llnl -slv2 -slwildcard -slxfig -sm -sma -sm-archive -smart -smartlist -smartmontools -smart-notifier -smarty3 -smarty-gettext -smartypants -smarty-validate -smb2www -smb4k -smbc -smbldap-tools -smbnetfs -smc -smcroute -smem -sml-mode -smlnj -smokegen -smokekde -smokeping -smokeqt -smooth-themes -smpeg -smplayer -smplayer-themes -smp-utils -smsclient -smstools -smtm -smuxi -sn -snacc -snack -snake4 -snakefood -snappea -snappy -snappy-java -snappy-player -snarf -snd -sndfile-tools -sndobj -sng -sniffit -snimpy -snmpkit -snmptrapfmt -snmptt -snooper -snoopy -snort -snow -snowball -snowballz -snowdrop -sntop -sobby -socat -socket -socklog -socks4-server -sockstat -socnetv -sofa-framework -sofia-sip -softcatala-spell -softflowd -softhsm -software-center -software-properties -sogo -solarpowerlog -solarwolf -solfege -solid-pop3d -sombok -sonata -songwrite -sonic -sooperlooper -sope -soprano -sopwith -soqt -sord -sorl-thumbnail -sortmail -sortsmill-tools -so-synth-lv2 -soundconverter -sound-icons -sound-juicer -soundkonverter -soundmodem -sound-theme-freedesktop -soundtouch -sourcecodegen -source-highlight -sox -soya -soya-doc -sozi -spacearyarya -spacenavd -spacezero -spamassassin -spamassassin-heatu -spamass-milter -spambayes -spamoracle -spampd -spamprobe -spandsp -spark -sparkleshare -sparkline-php -sparql-wrapper-python -sparsehash -sparskit -spass -spatialindex -spatialite -spawn-fcgi -spd -spe -speakup -speakup-tools -specimen -spectacle -spectemu -specto -spectools -spectrwm -speechd-el -speech-dispatcher -speechd-up -speech-tools -speedcrunch -speedometer -speedy-cgi-perl -speex -spek -spell -spellutils -spew -sp-gxmlcpp -spherepack -sphinx -sphinxcontrib-actdiag -sphinxcontrib-blockdiag -sphinxcontrib-nwdiag -sphinxcontrib-seqdiag -sphinxcontrib-spelling -sphinx-issuetracker -sphinxsearch -spice -spice-gtk -spice-protocol -spice-vdagent -spim -spinner -spip -spkproxy -spl -splat -splay -spline -splint -splitvt -splix -spooles -spotlighter -spotweb -spout -spring -spring-build -springlobby -springpython -sprng -sprox -sputnik -spyder -sqcwa -sqlalchemy -sqldeveloper-package -sqlgrey -sqlheavy -sqlite -sqlite3 -sqlitebrowser -sqliteodbc -sqlkit -sql-ledger -sqlline -sqlobject -sqlparse -sqsh -squaremap -squareness -squashfs-tools -squeak-plugins-scratch -squeak-vm -squeeze -squid -squid3 -squidguard -squid-langpack -squid-prefetch -squidtaild -squidview -squirrelmail -squirrelmail-compatibility -squirrelmail-decode -squirrelmail-locales -squirrelmail-lockout -squirrelmail-logger -squirrelmail-quicksave -squirrelmail-secure-login -squirrelmail-sent-confirmation -squirrelmail-spam-buttons -squirrelmail-viewashtml -squizz -sqwebmail-de -sra-sdk -sratom -src2tex -srecord -sredird -srf -srg -srptools -srtp -ssake -ssdeep -ssed -ssft -ssh-askpass -ssh-askpass-fullscreen -ssh-contact -sshfp -sshfs-fuse -sshguard -sshmenu -sshpass -sshuttle -ssl-cert -ssl-cert-check -ssldump -sslh -sslscan -sslsniff -sslstrip -ssmping -ssmtp -ssreflect -sssd -ssss -ssvnc -st -stackapplet -staden-io-lib -stalin -stalonetray -stapler -stapler-adjunct-codemirror -stapler-adjunct-timeline -stardata-common -stardict -stardict-czech -stardict-tools -stardict-xmlittre -starfighter -starlink-ast -starlink-pal -starman -starplot -starpu -starpu-contrib -starpy -startupmanager -startup-notification -starvoyager -statcvs -statnews -statserial -statsmodels -statsvn -status-4-evar -stax -stax-utils -stda -stdeb -steadyflow -stealth -steghide -stella -stellarium -step -stepbill.app -stepic -steptalk -stfl -stgit -stimfit -stk -stl-manual -stockfish -stompserver -stone -stopmotion -stops -stopwatch -storebackup -storm -stormbaancoureur -stow -strace -streamripper -streamtuner2 -stress -stressapptest -stretchplayer -strigi -stringtemplate -strongswan -strongwind -strophejs -strucchange -structure-synth -stsci.distutils -stterm -stud -stumpwm -stun -stunnel4 -stx2any -stx-btree -stylebook -stymulator -styx -subcommander -sublib -subnetcalc -substance -subsurface -subtitlecomposer -subtitleeditor -subtle -subunit -subversion -subvertpy -suck -suckless-tools -sucrack -sudo -sudoku -suds -suede -sugar-0.96 -sugar-artwork-0.84 -sugar-artwork-0.88 -sugar-artwork-0.96 -sugar-base-0.84 -sugar-base-0.88 -sugar-base-0.96 -sugar-calculate-activity -sugar-connect-activity -sugar-datastore-0.84 -sugar-datastore-0.88 -sugar-datastore-0.96 -sugar-etoys-activity -sugar-irc-activity -sugar-memorize-activity -sugar-physics-activity -sugar-pippy-activity -sugarplum -sugar-presence-service-0.84 -sugar-presence-service-0.88 -sugar-presence-service-0.90 -sugar-record-activity -sugar-terminal-activity -sugar-toolkit-0.84 -sugar-toolkit-0.88 -sugar-toolkit-0.96 -sugar-toolkit-gtk3 -suikyo -suil -suitesparse -suitesparse-metis -summain -sumo -sunclock -sundials -sunflow -sunpinyin -suomi-malaga -sup -super -supercat -supercollider -superiotool -superkaramba -superlu -supertransball2 -supertux -supertuxkart -supervisor -suphp -sup-mail -supybot -surefire -surf -surfraw -suricata -survex -survival -sushi -susv2 -susv3 -sux -svgalib -svgpart -svgsalamander -svgtoipe -svn2cl -svn-all-fast-export -svn-buildpackage -svnclientadapter -svnkit -svn-load -svnmailer -svn-workbench -svrcore -svtools -swac-explore -swac-get -swaks -swami -swaml -swapspace -swatch -swath -swedish -sweep -sweeper -sweethome3d -swe-standard-data -swfmill -swftools -swh-lv2 -swh-plugins -swift -swift-im -swig2.0 -swiginac -swing-layout -swi-prolog -swi-prolog-doc -swish++ -swish-e -swissknife -swisswatch -switchconf -switchsh -sword -sword-comm-mhcc -sword-comm-scofield -sword-comm-tdavid -sword-dict-naves -sword-dict-strongs-greek -sword-dict-strongs-hebrew -sword-text-kjv -sword-text-sparv -sword-text-web -swtcalendar -swtchart -swt-gtk -swt-paperclips -sxid -sxiv -syfi -sylpheed -sylpheed-doc -sylph-searcher -sylseg-sk -symeig -symlinks -symmetrica -sympa -sympow -sympy -synaesthesia -synapse -synaptic -synaptiks -syncache -syncbbdb -synce-gnomevfs -synce-hal -synce-serial -synce-trayicon -syncevolution -syncmaildir -syncplaces -synergy -synfig -synfigstudio -synopsis -syrep -syrthes -sysadmin-guide -sysbench -sysconftool -sysfsutils -sysinfo -syslinux -syslinux-themes-debian -syslog-ng -syslog-ocaml -syslog-summary -sysnews -sysprof -sysprofile -sysrqd -sysstat -system-config-cluster -system-config-lvm -system-config-printer -systemd -systempreferences.app -systemtap -system-tools-backends -systraq -systune -sysvbanner -sysvinit -sysv-rc-conf -t1lib -t1utils -t2html -t38modem -tabble -tabix -tableau-parm -tablix2 -tabmixplus -tacacs+ -tachyon -tack -tads2-mode -tagainijisho -tagcloud -tagcoll2 -taggrepper -taglib -taglib-extras -taglib-sharp -taglog -tagpy -tagtool -tagua -tahoe-lafs -tailor -taktuk -talksoup.app -talloc -tamil-gtk2im -tamuanova -tangerine -tanglet -tango -tango-icon-theme -taningia -taoframework -tapecalc -tap-plugins -tap-plugins-doc -tar -tarantool -tardiff -tardy -targetcli -tart -task -tasks -tasksel -task-spooler -tasque -tatan -tau -taurus -tayga -tbb -tcc -tcd-utils -tcl8.4 -tcl8.5 -tclap -tclcl -tclcurl -tclex -tclgeoip -tcllib -tclodbc -tclreadline -tcl-signal -tclthread -tcltk-defaults -tcltls -tcltrf -tcludp -tclvfs -tclx8.4 -tclxml -tcm -tcng -t-code -t-coffee -tcpdump -tcpflow -tcpick -tcpreen -tcpreplay -tcpser -tcpslice -tcpspy -tcpstat -tcptrace -tcptraceroute -tcptrack -tcputils -tcpwatch-httpproxy -tcp-wrappers -tcpxtract -tcs -tcsh -td2planet -tdb -tdc -tdfsb -tdiary -tdiary-contrib -tdl -tdom -tea -tecnoballz -teem -teeworlds -teg -tegaki-pygtk -tegaki-python -tegaki-recognize -tegaki-tools -tegaki-train -tegaki-zinnia-japanese -tegaki-zinnia-simplified-chinese -telak -telegnome -telepathy-farstream -telepathy-gabble -telepathy-glib -telepathy-haze -telepathy-idle -telepathy-logger -telepathy-logger-qt -telepathy-mission-control-5 -telepathy-python -telepathy-qt -telepathy-rakia -telepathy-salut -telepathy-spec -teleport -tellico -tempest-for-eliza -templayer -tenace -tenmado -tennix -tenshi -terminal.app -terminator -terminatorx -termit -termsaver -terraintool -teseq -tess -tessa -tesseract -tesseract-afr -tesseract-ara -tesseract-aze -tesseract-bel -tesseract-ben -tesseract-bul -tesseract-cat -tesseract-ces -tesseract-chi-sim -tesseract-chi-tra -tesseract-chr -tesseract-dan -tesseract-deu -tesseract-deu-frak -tesseract-ell -tesseract-eng -tesseract-enm -tesseract-epo -tesseract-equ -tesseract-est -tesseract-eus -tesseract-fin -tesseract-fra -tesseract-frk -tesseract-frm -tesseract-glg -tesseract-heb -tesseract-hin -tesseract-hrv -tesseract-hun -tesseract-ind -tesseract-isl -tesseract-ita -tesseract-ita-old -tesseract-jpn -tesseract-kan -tesseract-kor -tesseract-lav -tesseract-lit -tesseract-mal -tesseract-mkd -tesseract-mlt -tesseract-msa -tesseract-nld -tesseract-nor -tesseract-osd -tesseract-pol -tesseract-por -tesseract-ron -tesseract-rus -tesseract-slk -tesseract-slk-frak -tesseract-slv -tesseract-spa -tesseract-spa-old -tesseract-sqi -tesseract-srp -tesseract-swa -tesseract-swe -tesseract-tam -tesseract-tel -tesseract-tgl -tesseract-tha -tesseract-tur -tesseract-ukr -tesseract-vie -testdisk -testng -testrepository -testresources -tetex-brev -tetradraw -tetraproc -tetrinet -tetrinetx -tetzle -tevent -tex4ht -tex-common -tex-gyre -texi2html -texify -texinfo -texlive-base -texlive-bin -texlive-doc -texlive-extra -texlive-lang -texmacs -texmacs-extra-fonts -texmaker -texstudio -textdraw -textedit.app -texworks -tf -tf5 -tfdocgen -tftp-hpa -tftpy -tg.devtools -tgif -tgt -thailatex -thaixfonts -the -themole -themonospot -thepeg -therion -theseus -thewidgetfactory -thin -thinkfan -thp -threadscope -thrust -thuban -thunar -thunar-archive-plugin -thunar-media-tags-plugin -thunar-vcs-plugin -thunar-vfs -thunar-volman -ticgit -ticker -tickr -tictactoe-ng -tidy -tidy-proxy -tiemu -tiff -tiff3 -tifffile -tig -tiger -tiger-types -tightvnc -tightvnc-java -tigr-glimmer -tilda -tilecache -tiled-qt -tilelite -tiles -tilestache -tilp2 -timbl -timblserver -time -timelimit -timemachine -timemon.app -timidity -timingframework -timps -tin -tina -tinc -tint -tint2 -tintii -tintin++ -tinyca -tinycdb -tinydyndns -tinyeartrainer -tinyirc -tinymce -tinymux -tinyproxy -tinyscheme -tinywm -tinyxml -tinyxml2 -tiobench -tipa -titanion -tix -tk2 -tk5 -tk707 -tk8.4 -tk8.5 -tkabber -tkabber-plugins -tk-brief -tkcon -tkcvs -tkdesk -tkgate -tk-html3 -tkinfo -tkinspect -tklib -tkpng -tkrplot -tk-table -tktray -tktreectrl -tla -tlslite -tmake -tm-align -tmexpand -tmispell-voikko -tmpreaper -tmux -tmview -tmw -tmw-music -tnat64 -tnef -tnftp -tntdb -tntnet -tofrodos -tofu -toga2 -toggle-proxy -togl -toilet -tokyocabinet -tokyocabinet-haskell -tokyotyrant -tolua -tolua++ -tomatoes -tomboy -tomboy-latex -tomcat6 -tomcat7 -tomcatjss -tomcat-maven-plugin -tomcat-native -tomoe -tomoyo-tools -toonloop -topal -topgit -tophide -toppler -tor -tora -tor-arm -torch3 -torchat -torcs -torque -torrentflux -torrus -torsocks -tortoisehg -torus-trooper -toshset -totem -totem-pl-parser -totem-plugin-arte -tourney-manager -towitoko -tpb -tpclient-pywx -tpconfig -tpm-tools -t-prot -tp-smapi -tqsllib -trac -trac-accountmanager -trac-announcer -trac-authopenid -trac-batchmodify -trac-bitten -trac-bzr -trac-customfieldadmin -trac-datefieldplugin -trac-diavisview -traceroute -trac-git -trac-graphviz -trac-httpauth -trac-icalviewplugin -trac-ja-resource -trac-jsgantt -trackballs -trackballs-music -tracker -trac-mastertickets -trac-mercurial -trac-odtexport -trac-privateticketsplugin -trac-roadmap -trac-sensitivetickets -trac-subtickets -trac-tags -trac-virtualticketpermissions -trac-wikiprint -trac-wikitablemacro -trac-wysiwyg -trac-xmlrpc -trafficserver -tralics -transaction -transcalc -transcend -transcode -transfermii -transfig -transgui -transifex-client -translate -translate-docformat -translate-toolkit -translatoid -transmageddon -transmission -transmission-remote-cli -transmissionrpc -transtermhp -trash-cli -traverso -trayer -tre -tree -treeline -tree-puzzle -tree-style-tab -treeviewx -treil -trend -trickle -trident -triggerhappy -trigger-rally -trigger-rally-data -trilead-putty-extension -trilead-ssh2 -trimage -triplane -triplea -tripwire -tritium -trivial-features -trivial-gray-streams -troffcvt -trophy -trousers -trovacap -trove -trove3 -trscripts -trueprint -trustedqsl -tryton-client -tryton-meta -tryton-modules-account -tryton-modules-account-be -tryton-modules-account-de-skr03 -tryton-modules-account-invoice -tryton-modules-account-invoice-history -tryton-modules-account-invoice-line-standalone -tryton-modules-account-product -tryton-modules-account-statement -tryton-modules-analytic-account -tryton-modules-analytic-invoice -tryton-modules-analytic-purchase -tryton-modules-analytic-sale -tryton-modules-calendar -tryton-modules-calendar-classification -tryton-modules-calendar-scheduling -tryton-modules-calendar-todo -tryton-modules-company -tryton-modules-company-work-time -tryton-modules-country -tryton-modules-currency -tryton-modules-dashboard -tryton-modules-google-maps -tryton-modules-ldap-authentication -tryton-modules-ldap-connection -tryton-modules-party -tryton-modules-party-siret -tryton-modules-party-vcarddav -tryton-modules-product -tryton-modules-product-cost-fifo -tryton-modules-product-cost-history -tryton-modules-product-price-list -tryton-modules-project -tryton-modules-project-plan -tryton-modules-project-revenue -tryton-modules-purchase -tryton-modules-purchase-invoice-line-standalone -tryton-modules-sale -tryton-modules-sale-opportunity -tryton-modules-sale-price-list -tryton-modules-stock -tryton-modules-stock-forecast -tryton-modules-stock-inventory-location -tryton-modules-stock-location-sequence -tryton-modules-stock-product-location -tryton-modules-stock-supply -tryton-modules-stock-supply-day -tryton-modules-timesheet -tryton-neso -tryton-proteus -tryton-server -tsdecrypt -tse3 -tseries -tslib -tsocks -tstools -tsung -ttb -ttf2ufm -ttf-adf -ttf-aenigma -ttf-alee -ttf-ancient-fonts -ttf-atarismall -ttfautohint -ttf-bitstream-vera -ttf-cjk-compact -ttf-dejavu -ttf-engadget -ttf-femkeklaver -ttf-freefont -ttf-goudybookletter -ttf-indic-fonts -ttf-isabella -ttf-jsmath -ttf-kochi -ttf-lao -ttf-marvosym -ttf-radisnoir -ttf-sazanami -ttf-staypuft -ttf-summersby -ttf-tagbanwa -ttf-tiresias -ttf-wqy-microhei -ttf-wqy-zenhei -tth -tthsum -ttt -tty-clock -ttyload -ttylog -ttyrec -ttysnoop -tua -tuareg-mode -tucnak2 -tudu -tulip -tumbler -tumgreyspf -tumiki-fighters -tunapie -tunnelx -tupi -turbogears2 -turbogears2-doc -turbojson -turbokid -turnin-ng -turpial -turtleart -tuxcmd -tuxcmd-modules -tuxfootball -tuxguitar -tuxmath -tuxonice-userui -tuxpaint -tuxpaint-config -tuxpaint-stamps -tuxpuck -tuxracer-extras -tuxtype -tvdb-api -tvflash -tv-fonts -tvnamer -tvtime -twatch -twclock -tweak -tweepy -twiggy -twill -twisted -twisted-conch -twisted-lore -twisted-mail -twisted-names -twisted-news -twisted-runner -twisted-web -twisted-web2 -twisted-words -twittering-mode -twm -twms -twofish -twoftpd -twolame -tworld -twpsk -txaws -txlibravatar -txt2html -txt2man -txt2pdbdoc -txt2regex -txt2tags -txtreader -txw2 -txzookeeper -type-conv -typespeed -typo3-src -typogrify -tyxml -tzc -tzdata -tzsetup -u3-tool -uae -uanytun -uapevent -uaputl -ubiquity-extension -u-boot -ubuntu-dev-tools -ubuntulooks -ucarp -ucblogo -ucf -uchardet -ucimf-chewing -ucimf-openvanilla -ucimf-sunpinyin -ucl -uclibc -uclmmbase -ucommon -ucspi-proxy -ucspi-tcp -ucspi-unix -ucto -udav -uddi4j -udev -udftools -udisks -udisks-glue -udo -udpcast -udpkg -udptunnel -udt -udunits -ufc -ufiformat -ufl -ufraw -ufsutils -ufw -uget -uhd -uhub -uicilibris -uif -uif2iso -uim -uima-addons -uima-as -uimaj -uim-chewing -uisp -ukolovnik -ukopp -ulatencyd -ulex -ulex0.8 -uligo -ulogd -umlet -uml-utilities -umview -unac -unace -unadf -unagi -unalz -unar -unattended-upgrades -unbound -unburden-home-dir -uncertainties -unclutter -uncrustify -undbx -underscore -undertaker -unetbootin -unhide -unhide.rb -unhtml -uni2ascii -unicap -unicode -unicode-data -unicode-screensaver -unicon -unicorn -unidecode -unifdef -unifont -unionfs-fuse -unison -unison2.27.57 -unison2.32.52 -units -units-filter -unittest++ -unittest2 -uniutils -universalindentgui -unixcw -unixodbc -unixodbc-gui-qt -unknown-horizons -unmass -unmo3 -unoconv -unp -unpaper -unrar-free -unrtf -unscd -unshield -unsort -untex -unworkable -unzip -update-inetd -update-manager -update-notifier -upgrade-system -uphpmvault -up-imapproxy -upnp-inspector -upnp-router-control -upower -uppity -upse -upslug2 -upstart -uptimed -upx-ucl -uqm -uqm-russian -uqwk -urca -urfkill -urg -uriparser -urjtag -urlgrabber -urlscan -urlview -urlwatch -uruk -urwid -usb-discover -usb-modeswitch -usb-modeswitch-data -usbmount -usbmuxd -usbprog -usbredir -usbtc08-python -usbutils -usbview -usemod-wiki -usepackage -useragentswitcher -userdevfs -user-he -userinfo -usermode -user-mode-linux -user-mode-linux-doc -user-setup -userv -ussp-push -ust -ustr -uswsusp -utalk -utf8-migration-tool -uthash -utidylib -util-linux -uuagc -uucp -uucpsend -uudeview -uuidm -uvccapture -uw-imap -uwsgi -uzbek-wordlist -uzbl -v4l2loopback -v4l2ucp -v4l-utils -v86d -vacation -vagalume -vagrant -vala-0.14 -vala-0.16 -valabind -vala-dbus-binding-tool -valadoc -val-and-rick -vala-terminal -valatoys -valgrind -valknut -valkyrie -vamp-plugin-sdk -vamps -vanessa-adt -vanessa-logger -vanessa-socket -van.pydeb -varconf -varmon -varnish -vatnumber -vavoom -vbackup -vbetool -vbindiff -vblade -vblade-persist -vbrfix -vcdimager -vcftools -vcheck -vclt-tools -vco-plugins -vcsh -vde2 -vdesk -vdetelweb -vdk2 -vdk2-tutorial -vdkbuilder2 -vdk-doc -vdkxdb2 -vdmfec -vdpauinfo -vdpau-video -vdr -vdradmin-am -vdr-plugin-dvd -vdr-plugin-epgsearch -vdr-plugin-epgsync -vdr-plugin-femon -vdr-plugin-fritzbox -vdr-plugin-games -vdr-plugin-infosatepg -vdr-plugin-live -vdr-plugin-mp3 -vdr-plugin-osdserver -vdr-plugin-osdteletext -vdr-plugin-prefermenu -vdr-plugin-remote -vdr-plugin-remoteosd -vdr-plugin-skinenigmang -vdr-plugin-spider -vdr-plugin-streamdev -vdr-plugin-sudoku -vdr-plugin-svdrposd -vdr-plugin-svdrpservice -vdr-plugin-vcd -vdr-plugin-weather -vdr-plugin-xine -vdr-plugin-xineliboutput -vecmath -vectoroids -velocity -velocity-tools -velvet -vera -verbiste -verilator -veromix -verse -veusz -vflib3 -vftool -vfu -vgabios -vgrabbj -via -vice -vidalia -videocut -videogen -videolan-doc -viennacl -viewmol -viewpdf.app -viewvc -vifm -vigor -viking -vile -vilistextum -vim -vim-addon-manager -vimhelp-de -vim-latexsuite -vimoutliner -vimperator -vim-rails -vim-scripts -vim-syntax-gtk -vim-vimerl -vinagre -vinetto -vino -viper -vips -viridian -virtaal -virt-goodies -virtinst -virt-manager -virt-top -virtualbox -virtualbricks -virtualenvwrapper -virtuoso-opensource -virt-viewer -virt-what -viruskiller -visitors -visolate -vistrails -visualboyadvance -visual-regexp -vitables -vite -vkeybd -vlan -vlc -vlock -vlogger -vm -vmfs-tools -vmm -vmmlib -vmpk -vmware-manager -vmware-view-open-client -vnc4 -vnc-java -vncsnapshot -vnstat -vo-aacenc -vo-amrwbenc -vobcopy -vocproc -vodovod -volpack -volti -volumecontrol.app -volumeicon -volview -voms -voms-api-java -voms-mysql-plugin -vor -vorbisgain -vorbis-tools -vowpal-wabbit -voxbo -vpb-driver -vpim -vpnc -vpnc-scripts -vrb -vrfy -vrms -vrrpd -vsdump -vsftpd -v-sim -vstream-client -vte -vte3 -vtgrab -vtk -vtkdata -vtkedge -vtprint -vttest -vtun -vtwm -vusb-analyzer -vxl -vym -vzctl -vzdump -vzquota -w2do -w3af -w3cam -w3c-dtd-xhtml -w3c-linkchecker -w3c-markup-validator -w3c-sgml-lib -w3-dtd-mathml -w3m -w3m-el -w3m-el-snapshot -w9wm -wacomtablet -wader -wagon -wagon2 -wah-plugins -waili -wajig -wakeonlan -wammu -wapiti -wapua -warmux -watchdog -wav2cdr -wavbreaker -wavemon -wavesurfer -wavpack -wayland -wayv -wbar -wbox -wbxml2 -wcalc -wcd -wcslib -wcstools -wdg-html-validator -wdiff -wdm -wdq2wav -weathermap4rrd -weather-util -web2py -webalizer -webauth -webcamd -webcheck -webcit -webcolors -webdeveloper -webdruid -webfs -webgen0.4 -webgen0.5 -webhelpers -webissues -webissues-server -webkit -webkit2pdf -webkit-image -webkitkde -webkit-sharp -webmagick -weboob -weborf -webpy -webrtc-audio-processing -webserver-package -websvn -webtest -weechat -weechat-scripts -weex -weirdx -weka -welcome2l -weplab -werken.xpath -wesnoth-1.10 -west-chamber -wfmath -wfo -wfrench -wget -whatsnewfm -whatweb -when -whereami -whichman -whichwayisup -whiff -whitedune -whizzytex -whohas -whois -whowatch -why -whysynth -whyteboard -wicd -wicd-kde -wide-dhcpv6 -widelands -widemargin -wifi-radar -wiggle -wiipdf -wiki2beamer -wikidiff2 -wikipedia2text -wikipediafs -wildmidi -wiliki -wily -wims-help -win32-loader -windowlab -windows-el -wine -wine-doc -wine-gecko-1.4 -winetricks -winff -wing -wings3d -wininfo -winpdb -winwrangler -wipe -wireless-regdb -wireless-tools -wireshark -wise -witalian -witty -wizznic -wkhtmltopdf -wl -wl-beta -wm2 -wmacpi -wmail -wmaker -wmaker-data -wmaloader -wmanager -wmauda -wmbattery -wmbiff -wmbubble -wmbutton -wmcalclock -wmcdplay -wmclock -wmclockmon -wmcoincoin -wmcpu -wmcpuload -wmctrl -wmdate -wmdiskmon -wmdrawer -wmf -wmforkplop -wmfrog -wmhdplop -wm-icons -wmifinfo -wmifs -wmii -wmii-doc -wmitime -wmix -wml -wmlongrun -wmmatrix -wmmemload -wmmixer -wmmon -wmmoonclock -wmnd -wmnet -wmnut -wmpinboard -wmppp.app -wmpuzzle -wmrack -wmressel -wmshutdown -wmtemp -wmtime -wmtv -wmwave -wmweather -wmweather+ -wmwork -wmxmms2 -wmxres -wnn6-sdk -wnn7egg -wokkel -wolf4sdl -wondershaper -woof -wordgrinder -wordnet -wordplay -wordpress -wordpress-openid -wordpress-shibboleth -wordpress-xrds-simple -worker -worklog -workrave -wot -wotsap -wp2x -wpa -wpp -wput -wraplinux -wrapperfactory.app -wrapsrv -wreport -writer2latex -writerperfect -writetype -w-scan -wsdl2c -wsdl4j -wsil4j -wsjt -wspanish -wss4j -wsynth-dssi -wtforms -wuzzah -wv -wv2 -wvdial -wvstreams -wwl -wwwconfig-common -wwwstat -wxgeometrie -wxglade -wxmaxima -wxsqlite3 -wxsvg -wxwidgets2.8 -wyg -wyrd -wysihtml -wzdftpd -wzip -x11-apps -x11proto-bigreqs -x11proto-composite -x11proto-core -x11proto-damage -x11proto-dmx -x11proto-dri2 -x11proto-fixes -x11proto-fonts -x11proto-gl -x11proto-input -x11proto-kb -x11proto-print -x11proto-randr -x11proto-record -x11proto-render -x11proto-resource -x11proto-scrnsaver -x11proto-video -x11proto-xcmisc -x11proto-xext -x11proto-xf86bigfont -x11proto-xf86dga -x11proto-xf86dri -x11proto-xf86vidmode -x11proto-xinerama -x11-session-utils -x11-utils -x11vnc -x11-xfs-utils -x11-xkb-utils -x11-xserver-utils -x2 -x264 -x2goclient -x2vnc -x2x -x52pro -x86info -xa -xabacus -xacobeo -xalan -xaos -xapian-bindings -xapian-core -xapian-omega -xappy -xarchiver -xarclock -xauth -xautolock -xautomation -xavante -xaw3d -xawtv -xbacklight -xbae -xball -xbattbar -xbattle -xbill -xbindkeys -xbindkeys-config -xbitmaps -xblast-tnt -xblast-tnt-images -xblast-tnt-levels -xblast-tnt-models -xblast-tnt-musics -xblast-tnt-sounds -xbmc -xboard -xboing -xbomb -xboxdrv -xbs -xbubble -xbuffy -xca -xcache -xcal -xcalib -xcb -xcb-proto -xcb-util -xcb-util-image -xcb-util-keysyms -xcb-util-renderutil -xcb-util-wm -xcfa -xcftools -xchain -xchat -xchat-gnome -xchat-guile -xchat-xsys -xchm -xcircuit -xcite -xclip -xcolmix -xcolors -xcolorsel -xcompmgr -xcowsay -xcp-eliloader -xcp-storage-managers -xcp-vncterm -xcrysden -xcursor-themes -xd -xdaliclock -xdb -xdeb -xdebug -xdelta -xdelta3 -xdemineur -xdemorse -xdesktopwaves -xdffileio -xdg-user-dirs -xdg-user-dirs-gtk -xdg-utils -xdiskusage -xdm -xdmf -xdms -xdot -xdotool -xdrawchem -xdu -xdvik-ja -xen -xen-api -xen-api-libs -xenomai -xen-tools -xenwatch -xerces-c -xerces-c2 -xevil -xf86-input-mtrack -xf86-input-multitouch -xf86-input-wacom -xf86-video-glamo -x-face-el -xfaces -xfburn -xfce4 -xfce4-appfinder -xfce4-artwork -xfce4-battery-plugin -xfce4-cellmodem-plugin -xfce4-clipman-plugin -xfce4-cpufreq-plugin -xfce4-cpugraph-plugin -xfce4-datetime-plugin -xfce4-dev-tools -xfce4-dict -xfce4-diskperf-plugin -xfce4-fsguard-plugin -xfce4-genmon-plugin -xfce4-goodies -xfce4-hdaps -xfce4-indicator-plugin -xfce4-linelight-plugin -xfce4-mailwatch-plugin -xfce4-messenger-plugin -xfce4-mixer -xfce4-mount-plugin -xfce4-mpc-plugin -xfce4-netload-plugin -xfce4-notes-plugin -xfce4-notifyd -xfce4-panel -xfce4-places-plugin -xfce4-power-manager -xfce4-quicklauncher-plugin -xfce4-radio-plugin -xfce4-screenshooter -xfce4-sensors-plugin -xfce4-session -xfce4-settings -xfce4-smartbookmark-plugin -xfce4-systemload-plugin -xfce4-taskmanager -xfce4-terminal -xfce4-timer-plugin -xfce4-utils -xfce4-verve-plugin -xfce4-volumed -xfce4-wavelan-plugin -xfce4-weather-plugin -xfce4-wmdock-plugin -xfce4-xkb-plugin -xfconf -xfdesktop4 -xfe -xfig -xfingerd -xfireworks -xfishtank -xflip -xflr5 -xfm -xfmpc -xfoil -xfonts-100dpi -xfonts-75dpi -xfonts-a12k12 -xfonts-ayu -xfonts-baekmuk -xfonts-base -xfonts-biznet -xfonts-bolkhov -xfonts-cronyx -xfonts-cyrillic -xfonts-efont-unicode -xfonts-encodings -xfonts-jisx0213 -xfonts-jmk -xfonts-kaname -xfonts-kappa20 -xfonts-marumoji -xfonts-mathml -xfonts-mona -xfonts-mplus -xfonts-nexus -xfonts-scalable -xfonts-shinonome -xfonts-terminus -xfonts-traditional -xfonts-utils -xfonts-wqy -xfprint4 -xfpt -xfrisk -xfs -xfsdump -xfsprogs -xfstt -xfswitch-plugin -xft -xfwm4 -xfwm4-themes -xgalaga -xgalaga++ -xgammon -xgraph -xgridfit -xhtmlrenderer -xicc -xindy -xine-lib -xine-lib-1.2 -xine-plugin -xinetd -xine-ui -xinit -xinput -xinv3d -xiphos -xipmsg -xiterm+thai -xjadeo -xjdic -xjig -xjobs -xjokes -xjump -xkbind -xkbset -xkeyboard-config -xkeycaps -xl2tpd -xlassie -xlbiff -xless -xletters -xlhtml -xli -xloadimage -xlog -xlwt -xmacro -xmahjongg -xmail -xmakemol -xmanpages-ja -xmbmon -xmds -xmds-doc -xmedcon -xmem -xmhtml -xmille -xmix -xml2 -xmlbeans -xmlbeans-maven-plugin -xml-commons-external -xmlcopyeditor -xml-core -xml-crimson -xmldiff -xmlextras -xmlgraphics-commons -xmlindent -xml-light -xmlm -xmlmarshaller -xmlroff -xmlrpc-c -xmlrpc-epi -xmlrpc-light -xmlsec1 -xml-security-c -xmlstarlet -xmltex -xmlto -xmltoman -xmltooling -xmltv -xmlunit -xmms2 -xmms2-scrobbler -xmms2tray -xmobar -xmonad -xmonad-contrib -xmorph -xmotd -xmoto -xmount -xmountains -xmp -xmpi -xnbd -xnec2c -xnecview -xnee -xnetcardconfig -xneur -xom -xonix -xoo -xorg -xorg-docs -xorg-server -xorg-sgml-doctools -xorp -xoscope -xosd -xosview -xotcl -xournal -xpa -xpad -xpaint -xpat2 -xpdf -xpenguins -x-pgp-sig-el -xphoon -xpilot-extra -xpilot-ng -xplanet -xplc -xplot -xplot-xplot.org -xpn -xpp -xppaut -xpra -xprintidle -xprobe -xpuzzles -xpyb -xqf -xqilla -xracer -xrdp -xresprobe -xrestop -xringd -xrootconsole -xrsh -xsane -xscavenger -xscorch -xscreensaver -xsd -xsddiagram -xsel -xsensors -xserver-xorg-input-acecad -xserver-xorg-input-aiptek -xserver-xorg-input-elographics -xserver-xorg-input-evdev -xserver-xorg-input-joystick -xserver-xorg-input-keyboard -xserver-xorg-input-mouse -xserver-xorg-input-mutouch -xserver-xorg-input-synaptics -xserver-xorg-input-vmmouse -xserver-xorg-input-void -xserver-xorg-video-apm -xserver-xorg-video-ark -xserver-xorg-video-ati -xserver-xorg-video-chips -xserver-xorg-video-cirrus -xserver-xorg-video-dummy -xserver-xorg-video-fbdev -xserver-xorg-video-geode -xserver-xorg-video-glide -xserver-xorg-video-glint -xserver-xorg-video-i128 -xserver-xorg-video-i740 -xserver-xorg-video-intel -xserver-xorg-video-ivtvdev -xserver-xorg-video-mach64 -xserver-xorg-video-mga -xserver-xorg-video-modesetting -xserver-xorg-video-neomagic -xserver-xorg-video-nouveau -xserver-xorg-video-openchrome -xserver-xorg-video-qxl -xserver-xorg-video-r128 -xserver-xorg-video-rendition -xserver-xorg-video-s3 -xserver-xorg-video-s3virge -xserver-xorg-video-savage -xserver-xorg-video-siliconmotion -xserver-xorg-video-sis -xserver-xorg-video-sisusb -xserver-xorg-video-tdfx -xserver-xorg-video-tga -xserver-xorg-video-trident -xserver-xorg-video-tseng -xserver-xorg-video-vesa -xserver-xorg-video-vmware -xserver-xorg-video-voodoo -xsettings-kde -xshisen -xskat -xslthl -xsmc-calc -xsok -xsol -xsoldier -xsp -xstarfish -xstow -xstr -xstrp4 -xsunpinyin -xsynth-dssi -xsysinfo -xsystem35 -xtables-addons -xtail -xtalk -xteddy -xtel -xtell -xterm -xtermcontrol -xtermset -xtide -xtide-coastline -xtide-data -x-tile -xtitle -xtrace -xtrans -xtrkcad -xtrlock -xtron -xtrs -xttitle -xtux -xtv -xul-ext-monkeysphere -xul-ext-zotero -xutils-dev -xuxen-eu-spell -xvba-video -xvidcore -xvier -xview -xvkbd -xvt -xwatch -xwax -xwelltris -xwit -xword -xwpe -xwrits -xxgdb -xxkb -xxxterm -xye -xylib -xymon -xyscan -xzgv -xzip -xz-java -xzoom -xz-utils -yabause -yacas -yacpi -yade -yafaray -yafaray-exporter -yafc -yagf -yagiuda -yagtd -yahoo2mbox -yahtzeesharp -yajl -yakuake -yamdi -yaml-cpp -yaml-mode -yample -yap -yapet -yapps2 -yappy -yapra -yard -yardradius -yaret -yarssr -yasat -yash -yaskkserv -yasm -yasnippet -yasr -yate -yatex -yatm -yauap -yaws -yaz -yc-el -ydpdict -yeahconsole -yecht -yelp -yelp-tools -yelp-xsl -yersinia -yforth -ygl -ygraph -yics -yiyantang -ykclient -yocto-reader -yodl -yojson -yokadi -yorick -yorick-av -yorick-cubeview -yorick-curses -yorick-gl -yorick-hdf5 -yorick-imutil -yorick-mira -yorick-ml4 -yorick-mpeg -yorick-optimpack -yorick-soy -yorick-spydr -yorick-yao -yorick-yeti -yorick-yutils -yorick-z -yoshimi -yp-svipc -ytalk -ytree -yubico-pam -yubikey-personalization -yubikey-personalization-gui -yubikey-server-c -yubiserver -yudit -yue-sounds-fso -yui -yui3 -yui-builder -yui-compressor -yum -yum-metadata-parser -yydebug -z80asm -z80dasm -z80ex -z8530-utils2 -z88 -z88dk -zanshin -zapping -zarafa-drag-n-drop -zatacka -zathura -zathura-extras -zaz -zbar -zc.buildout -zc.lockfile -zconfig -zdaemon -zec -zeitgeist -zeitgeist-datahub -zeitgeist-sharp -zelig -zemberek -zemberek-ooo -zemberek-server -zendframework -zenity -zephyr -zeroc-ice -zeroc-icee -zeroc-icee-java -zeroc-icee-translators -zerofree -zeroinstall-injector -zeromq -zeya -zfec -zfs-fuse -zgv -zh-autoconvert -zhcon -zhpy -zile -zim -zimpl -zine -zinnia -zip -zipios++ -zipper.app -ziproxy -zita-ajbridge -zita-alsa-pcmi -zita-at1 -zita-convolver -zita-lrx -zita-resampler -zita-rev1 -zivot -zlib -zlibc -zmakebas -znc -zodb -zoem -zomg -zonecheck -zoneminder -zoo -zookeeper -zoomer -zope2.12 -zope.authentication -zope.browser -zope.cachedescriptors -zope-common -zope.component -zope.configuration -zope.contenttype -zope.copy -zope-debhelper -zope.deprecation -zope.dottedname -zope.event -zope.exceptions -zope.fixers -zope.hookable -zope.i18n -zope.i18nmessageid -zope.interface -zope.location -zope-maildrophost -zope-mysqlda -zope.proxy -zope.publisher -zope-quotafolder -zope-replacesupport -zope.schema -zope.security -zope.sendmail -zope.sqlalchemy -zope.testbrowser -zope.testing -zope.testrunner -zope.traversing -zorp -zp -zpaq -zpb-ttf -zpspell -zsh -zsh-beta -zshdb -zsi -zssh -zsync -zthreads -zutils -zvbi -zyn -zynaddsubfx -zynjacku -zziplib -zzuf diff --git a/src/musketeer/experiments/goto-runner/pkgs-jenkins-paper b/src/musketeer/experiments/goto-runner/pkgs-jenkins-paper deleted file mode 100644 index 429e961590a..00000000000 --- a/src/musketeer/experiments/goto-runner/pkgs-jenkins-paper +++ /dev/null @@ -1,10 +0,0 @@ -blktrace -dnshistory -ghostess -lingot -memcached -proxsmtp -ptunnel -see -timemachine -weborf diff --git a/src/musketeer/experiments/goto-runner/pkgs-qm-all b/src/musketeer/experiments/goto-runner/pkgs-qm-all deleted file mode 100644 index c92718e0cf7..00000000000 --- a/src/musketeer/experiments/goto-runner/pkgs-qm-all +++ /dev/null @@ -1,9121 +0,0 @@ -0ad -0xffff -389-admin -389-adminutil -389-ds-base -389-dsgw -3dchess -3depict -3dldf -4digits -4g8 -6tunnel -7kaa -9menu -9mount -9wm -a2jmidid -a52dec -a56 -aa3d -aalib -aaphoto -abcm2ps -abcmidi -abduco -abe -abinit -abiword -abook -aboot -abootimg -abr2gbr -abx -accerciser -accountsservice -acct -ace -aces3 -acfax -achilles -acl -acl2 -acorn-fdisk -acoustid-fingerprinter -acpi -acpi-support -acpica-unix -acpid -acpitail -acpitool -acr -acr38 -acsccid -activiz.net -adabrowse -adanaxisgpl -adasockets -adcli -adios -adjtimex -admesh -adns -adolc -adonthell-data -adonthell -adplay -adplug -adun.app -advancecomp -advi -adwaita-icon-theme -aegis -aegisub -aes2501-wy -aeskulap -aespipe -aevol -aewan -aewm++-goodies -aewm -afflib -afuse -agave -agda -agda-stdlib -agedu -agenda.app -agg -aggregate -aghermann -aha -ahcpd -aiccu -aide -aiksaurus -air-quality-sensor -airspy-host -airstrike -aisleriot -aj-snapshot -akonadi-googledata -alacarte -alarm-clock-applet -alarm-clock -alberta -aldo -ale -alevt -alex -alex4 -algol68g -allegro4.4 -allegro5 -alleyoop -alltray -almanah -alpine -alsa-lib -alsa-oss -alsa-plugins -alsa-utils -alsaequal -alsamixergui -alsaplayer -alsoft-conf -altermime -altree -alure -amarok -amavisd-milter -amide -amideco -amiga-fdisk -amor -amora-server -ample -ampliconnoise -ams -amsn -amsynth -amtterm -amule-emc -an -anacron -analitza -analog -and -android-androresolvd -android-platform-build -android-platform-system-core -anfo -angband -anjuta-extras -ann -anna -anomaly -antennavis -anthy -antigrav -antiword -antlr -antpm -ants -anypaper -anyremote -aoetools -aoeui -aolserver4-nsldap -aolserver4-nsmysql -aolserver4-nsopenssl -aolserver4-nspostgres -aolserver4-nssha1 -aolserver4-nssqlite3 -aolserver4-nsxml -apache-mod-auth-ntlm-winbind -apache-upload-progress-module-goto-binaries.tar..> -apache2 -apbs -apcalc -apcupsd -apertium -apertium-tolk -apf -apg -aplus-fsf -apmd -apng2gif -apngasm -apngdis -apngopt -apophenia -apparix -apparmor -appdata-tools -apper -appmenu-qt -appstream-glib -appstream -apq-postgresql -apr -apr-util -apron -aprsd -aprsdigi -apt-build -apt-cacher-ng -apt-dater -apt -apt-transport-tor -apt-watch -aptitude -aptsh -apvlv -apwal -aqemu -aqsis -aragorn -arbtt -arc-gui-clients -archivemount -ardour3 -argtable2 -argus -argyll -aria2 -aribas -ario -arj -ark -armada-backlight -armagetronad -arp-scan -arpack++ -arpack -arpalert -arping -arptables -arpwatch -array-info -artha -as31 -asc -ascdc -ascii -ascii2binary -asclock -asedriveiiie -aseprite -asio -asmail -asmix -asmixer -asmon -asp -aspcud -aspectc++ -aspell -aspic -assaultcube -assimp -aster -asterisk-testsuite -astromenace -astronomical-almanac -asunder -asymptote -at -at-spi2-atk -at-spi2-core -atari800 -aterm -atheme-services -athena-jot -atk1.0 -atkmm1.6 -atlas-cpp -atlas -atlc -atomicparsley -atomix -atril -atsar -attic -attica -attica-kf5 -attr -aubio -audacious -audex -audiocd-kio -audiofile -audiopreview -aufs-tools -augeas -aumix -authbind -auto-07p -auto-apt -autoclass -autoconf-dickey -autocutsel -autodir -autodocksuite -autofs -autogen -autolog -automoc -autoproject -autossh -autotalent -autounit -avahi -avahi-sharp -avarice -avfs -aview -avifile -avis-client-c -avogadro -avr-evtd -avrprog -awardeco -away -aweather -awesfx -awesome -awffull -ax25-apps -ax25-tools -axiom -aylet -ayttm -b43-fwcutter -babeld -babeltrace -babl -backuppc -bacula -balance -balder2d -ball -ballerburg -ballz -baloo -baloo-kcmadv -baloo-widgets -balsa -bam -bambamc -bamf -bamtools -bandwidthcalc -bandwidthd -bangarang -banshee-community-extensions -banshee -baobab -bar -barada-pam -barcode -bareftp -bareos -barrage -base-installer -base-passwd -basilisk2 -basket -batctl -batmand -baycomepp -baycomusb -bbe -bbmail -bbpager -bbrun -bbtime -bcache-tools -bchunk -bcpp -bcrypt -bdfresize -beanstalkd -bear -beast-mcmc -beav -beecrypt -beef -beep -belle-sip -ben -berkeley-abc -berusky -berusky2 -bespin -betaradio -bfbtester -bfgminer -bfm -bglibs -bibclean -bibcursed -bible-kjv -bibledit-bibletime -bibledit-gtk -bibledit-xiphos -bibletime -bibtexconv -bibtool -bibutils -bidiv -biff -bijiben -billiard -biloba -bin-prot -binclock -bind-dyndb-ldap -bind9 -bindechexascii -bindfs -binfmt-support -binfmtc -bing -biniax2 -binkd -bino -binstats -binutils-h8300-hms -binutils-m68hc1x -binutils-msp430 -binwalk -bio2jack -biosig4c++ -biosquid -bip -bird -birdfont -birthday -bisho -bison++ -bison -bist -bitlbee -bitops -bitpim -bitstormlite -bittwist -black-box -blackbox -blacs-mpi -blacs-pvm -bladerf -blahtexml -blam -blas -blcr -bld -blender -blepvco -bless -blinken -blist -blitz++ -blktool -blktrace -blobby -blockattack -blockout2 -blocks-of-the-undead -blop -bluedevil -blueman -bluemon -bluetile -bluez -bluez-tools -bmake -bmf -bml -bmon -bnfc -bochs -bognor-regis -bogofilter -boinc-app-seti -boinc -boinctui -bombardier -bomber -bomberclone -bomstrip -bonnie++ -boolector -boolstuff -boost1.55 -bootchart2 -booth -bootpc -bopm -bosh -bosixnet -boswars -bottlerocket -bovo -box2d -boxes -boxshade -bplay -bpm-tools -bppphyview -brandy -brasero -brewtarget -brian -brickos -bridge-utils -brightd -brightside -briquolo -browser-history -brp-pacu -brutalchess -brutefir -bs2b-ladspa -bsd-finger -bsd-mailx -bsdiff -bsdmainutils -btag -btanks -bti -btscanner -btyacc -buffer -buffy -bugsquish -buildtorrent -bullet -bum -bumprace -bup -burgerspace -burp -bustle -busybox -buthead -bwa -bwbar -bwbasic -bwm-ng -byacc -byacc-j -byzanz -bzflag -bzip2 -bzr -c-ares -c-icap -c-icap-modules -c2050 -c2esp -c2hs -cabal-debian -cabextract -cableswig -cachefilesd -cacti-spine -cadaver -cairo-clock -cairo-dock -cairo-ocaml -cairodevice -cairomm -caja-extensions -caja -cal -cal3d -calcoo -calf -calibre -calife -calligra -calligra-l10n -cam -camitk -camlbz2 -camldbm -camlidl -camlimages -camljava -camlzip -camorama -camp -can-utils -canl-c++ -canl-c -canlock -cantata -canto -cantor -capi4hylafax -capnproto -capstone -cardpeek -carettah -caribou -casablanca -cassiopee -catdoc -catdvi -catools -cattle-1.0 -cavezofphear -cb2bib -cbedic -cbflib -cbm -cbmplugs -cbootimage -cbrpager -cc1111 -ccache -cccd -ccd2iso -ccid -cciss-vol-status -cclive -ccontrol -cconv -ccrypt -ccze -cd-discid -cd5 -cdargs -cdbackup -cdbs -cdcd -cdck -cdde -cddlib -cdebconf-entropy -cdebconf -cdebconf-terminal -cdebootstrap -cdecl -cdo -cdparanoia -cdpr -cdrdao -cdrom-checker -cdtool -ceferino -cegui-mk2 -celestia -ceph -certmonger -cervisia -cfingerd -cfitsio -cfitsio3 -cflow -cfourcc -cgal -cgdb -cgiemail -cgilib -cgit -cgmanager -cgminer -cgoban -cgsi-gsoap -charls -charybdis -chase -chasen -chealpix -check -checkinstall -checkpolicy -cheese -cheetah -chemfp -chemical-mime-data -chemical-structures -chessx -chiark-tcl -chiark-utils -chicken -chimera2 -chise-base -chktex -chmlib -chntpw -choose-mirror -choosewm -choqok -chordii -choreonoid -chromaprint -chromium-bsu -chron -chrony -chrootuid -chrpath -chuck -cifs-utils -cigi-ccl -cinnamon-control-center -cinnamon-desktop -cinnamon -cinnamon-menus -cinnamon-screensaver -cinnamon-session -cinnamon-settings-daemon -circuslinux -citadel-client -cjet -cjk -cjs -cksfv -cl-sql -cl-uffi -clam -clamav -clamfs -clamsmtp -clamz -clanlib -cldump -clearcut -clearsilver -clementine -clex -clinfo -cliofetion -clipit -clipper -clippoly -clips -cliquer -cln -clock-setup -clog -cloog -cloog-ppl -cloop -clp -clsync -clucene-core -clustalo -clustalw -cluster-agents -cluster -clutter-gst-2.0 -clutter-gst -clutter-gtk -clutter-imcontext -clzip -cmatrix -cmdpack -cmigemo -cminpack -cmip5-cmor-tables -cmocka -cmor -cmospwd -cmph -cmtk -cmus -cnf -cnrun -cntlm -coala -coccinelle -code-saturne -codegroup -codelite -coils -coin3 -coinmp -coinor-cbc -coinor-cgl -coinor-csdp -coinor-dylp -coinor-flopc++ -coinor-osi -coinor-symphony -coinor-vol -coinst -coinutils -coldfire -colibri -collectd -colobot -colorblind -colord -colord-gtk -colorhug-client -colortail -colpack -colrconv -comedilib -comgt -commons-daemon -compartment -compiz-fusion-bcop -composite -compton -concalc -concordance -condor -conduit -confetti -confget -config-manager -confuse -conkeror -connect-proxy -connectome-workbench -connman -connman-ui -conntrack -conquest-dicom-server -console-braille -console-bridge -consolekit -conspy -converseen -cookietool -coolkey -coolmail -copyfs -coq -core-network -coriander -corkscrew -coturn -courier-authlib -couriergrey -courierpassd -cowbell -cowdancer -cp2k -cpipe -cpl-plugin-fors -cpl-plugin-giraf -cpl-plugin-hawki -cpl-plugin-kmos -cpl-plugin-sinfo -cpl-plugin-uves -cpl-plugin-xshoo -cpm -cpmtools -cpp-netlib -cppad -cppdb -cpphs -cppunit -cpputest -cpqarrayd -cproto -cpufreqd -cpulimit -cputool -cqrlib -crack-attack -crack -cracklib2 -cramfs -cramfsswap -crashmail -crashme -crda -creduce -cricket -crimson -criticalmass -crm114 -crmsh -cron -cronolog -cronutils -crossfire-client -crossfire -crrcsim -crtmpserver -cruft -crunch -cryptcat -cryptkeeper -cryptmount -cryptokit -cryptsetup -crystalhd -crystalspace-glshader-cg -cscope -csh -csmash -cssc -cstream -csv2latex -csync2 -ctdb -ctemplate -ctfutils -cthumb -ctn -ctorrent -ctpl -ctpp2 -ctsim -ctwm -cudf -cue2toc -cuetools -cunit -cups-bjnp -cups-filters -cups-pdf -cups-pk-helper -cupt -curl -curlpp -curseofwar -cutecom -cutils -cutter -cvc3 -cvector -cvm -cvs -cvsd -cvsgraph -cvsps -cwdaemon -cwidget -cwiid -cwirc -cwm -cxxtools -cyassl -cyclades-serial-client -cynthiune.app -cyrus-imspd -cytadela -cython -d-conf -d-feet -d52 -daa2iso -dact -dadadodo -daemon -daemonlogger -daemontools -daisy-player -dancer-xml -dangen -dapl -daq -dar -darcs -darcs-monitor -dares -darkice -darkplaces -darksnow -darkstat -darnwdl -darts -das-watchdog -dash -dasher -datamash -datapacker -dataquay -date -datefudge -dateutils -dav-text -davfs2 -davix -dawgdic -db -db1-compat -db5.3 -dballe -dbar -dbench -dbf2mysql -dbmix -dbskkd-cdb -dbus-c++ -dbus-glib -dbus -dbusada -dbuskit -dbview -dc3dd -dcap -dclock -dcraw -dctrl-tools -ddate -ddccontrol-db -ddccontrol -ddd -ddns3-client -ddpt -dds -dds2tar -deal -deal.ii -deb-gview -debconf-kde -debdelta -debfoster -debian-edu-artwork -debian-installer-utils -debian-xcontrol -debianutils -deborphan -debram -debsig-verify -debtags -dee -deets -defendguin -deja-dup -dejagnu -delta -deltarpm -denemo -depqbf -desklaunch -deskmenu -desktop-file-utils -desktopnova -desmume -desproxy -detox -deutex -devhelp -device-tree-compiler -devil -devilspie -devilspie2 -devio -devscripts -dfc -dff -dfu-programmer -dfu-util -dh-exec -dhcp-helper -dhcp-probe -dhcpcd-dbus -dhcpcd-ui -dhcpcd5 -dhcpdump -dhcping -dhex -dhis-client -dhis-dns-engine -dhis-mx-sendmail-engine -dhis-server -dhis-tools-dns -di -dia-newcanvas -dia-shapes -dia2code -diagnostics -dialign -dialign-t -dialog -dico -dicomnifti -dicomscope -dict-gcide -dictconv -dictd -diction -didiwiki -diet -diffstat -diffutils -digikam -digitemp -dillo -dimbl -dime -din -ding-libs -dino -diod -diodon -dipy -dirac -dircproxy -dirdiff -directvnc -direwolf -dirmngr -discosnp -discount -discover -disk-manager -diskscan -disktype -dispcalgui -display-dhammapada -dist -distcc -distorm3 -distorm64 -distro-info -disulfinder -djinn -djmount -djtools -djview4 -djvulibre -dleyna-connector-dbus -dleyna-core -dleyna-renderer -dleyna-server -dlume -dlz-ldap-enum -dma -dmalloc -dmapi -dmg2img -dmidecode -dmraid -dmtcp -dmtx-utils -dmucs -dns-flood-detector -dnshistory -dnsmasq -dnsproxy -dnssec-trigger -dnstop -dnstracer -docbook-to-man -docbook2x -dochelp -docker -docky -docsis -dogtag-pki -dolfin -dolphin-plugins -donkey -doodle -dopewars -doris -dos2unix -dosbox -doscan -doschk -dose3 -dosfstools -dossizola -dot-forward -dotconf -dov4l -dovecot -downtimed -doxygen -doxymacs -drac -dracut -dradio -dragon -drawtiming -drawtk -dreamchess -driftnet -drizzle -dropbear -drumkv1 -dsbltesters -dsc-statistics -dsdp -dsh -dssi -dsyslog -dtach -dtaus -dulwich -duma -dumpasn1 -dumpet -dune-common -dune-geometry -dune-grid-glue -dune-grid -dune-istl -dune-localfunctions -dune-pdelab -dune-typetree -dunst -duo-unix -duplicity -dv4l -dvbackup -dvbcut -dvblast -dvbsnoop -dvbstream -dvbstreamer -dvbtune -dvd+rw-tools -dvdbackup -dvdtape -dvgrab -dvi2dvi -dvi2ps -dvidvi -dvipng -dvipost -dvipsk-ja -dvorak7min -dwarfutils -dwarves-dfsg -dwdiff -dwm -dwww -dwz -dxflib -dymo-cups-drivers -dynalogin -dynamite -dynare -dzen2 -e00compr -e17 -e2ps -e2tools -easychem -easyh10 -easymp3gain -easyspice -easytag -eblook -ebnetd -ebook-speaker -ebook-tools -ebook2cw -ebtables -ecasound -echoping -ecl -eclib -eclipse-cdt -ecryptfs-utils -ed -ed2k-hash -edac-utils -edbrowse -edbus -edfbrowser -edflib -editline -editorconfig-core -eegdev -eep24c -efax -efax-gtk -efi-reader -efibootmgr -efingerd -efivar -eflite -efreet -efte -egenix-mx-base -eiciel -eigen3 -einspline -eiskaltdcpp -eject -ekeyd -ekg -ekiga -elastix -electric-fence -elementary -elementtidy -elfrc -elilo -elk -elog -elpa -elvis-tiny -emacs24 -emacspeak-ss -email2trac -embassy-domainatrix -embassy-domalign -embassy-domsearch -ember -emerillon -emms -empire -empire-hub -empire-lafe -empty-expect -emu8051 -enblend-enfuse -enca -encfs -enchant -enet -engine-pkcs11 -engrampa -enigma -enscribe -enscript -ent -entangle -entr -enum -envstore -eog -eog-plugins -eot-utils -eperl -epic4 -epic5 -epiphany -epix -epm -epr-api -epson-inkjet-printer-escpr -epstool -epwutil -eq10q -eql -eqonomize -erfa -ergo -eris -erlang-bitcask -erlang-cherly -erlang-cl -erlang-jiffy -erlang-p1-iconv -erlang-p1-pam -erlang-p1-sip -erlang-p1-stringprep -erlang-p1-tls -erlang-p1-xml -erlang-p1-yaml -erlang-p1-zlib -erm -esdl -esekeyd -esmtp -esniper -esorex -espctag -espeak -espeakup -espresso -esys-particle -eterm -etherape -etherpuppet -etherwake -ethstatus -etl -eukleides -euler -evas-loaders -evemu -event-dance -eventlog -eventstat -evilvte -evilwm -evince -evince-hwp -evolution-ews -evolution-mapi -evolution-rss -evtest -eweouz -exactimage -excellent-bifurcation -exempi -exfat-utils -exif -exifprobe -exiftags -exiv2 -exo -exodusii -expat -expect -expeyes -exrtools -ext3grep -ext4magic -extace -extra-cmake-modules -extra-xdg-menus -extremetuxracer -extundelete -exuberant-ctags -exult -ez-ipupdate -ezmlm-browse -ezstream -eztrace -f-irc -f2c -f2fs-tools -f3 -faad2 -fabulous -faifa -fair -fairymax -fake -fakepop -fakeroot -fakeroot-ng -faketime -falconpl -falselogin -fam -fapg -farpd -farstream-0.2 -farstream -fastdnaml -fastforward -fastjar -fastjet -fasttree -fastx-toolkit -fatattr -fatcat -fatrace -fatrat-czshare -fatrat-opensubtitles -fatresize -fatsort -faucc -fauhdlc -faulthandler -fbasics -fbcat -fbi -fbpager -fbpanel -fbset -fbterm -fbterm-ucimf -fbxkb -fbzx -fceux -fcgiwrap -fcitx-anthy -fcitx-chewing -fcitx-cloudpinyin -fcitx-configtool -fcitx-fbterm -fcitx-googlepinyin -fcitx -fcitx-hangul -fcitx-libpinyin -fcitx-m17n -fcitx-qt5 -fcitx-rime -fcitx-sayura -fcitx-skk -fcitx-sunpinyin -fcitx-ui-light -fcitx-unikey -fcl -fcode-utils -fcopulae -fcrackzip -fdflush -fdm -fdmdv2 -fdsend -fdupes -fdutils -feel++ -feh -ferret-vis -festival -fetchmail -ffcall -ffe -fflas-ffpack -ffmpeg2theora -ffmpegthumbnailer -ffmpegthumbs -ffms2 -ffrenzy -fftw -fftw3 -fgetty -fgrun -fhist -figlet -file -file-kanji -file-roller -filelight -fileschanged -filetea -fillets-ng -filter -findimagedupes -findlib -fio -firebird2.5 -firedns -firestring -firewalld -fische -fitsverify -fityk -five-or-more -fizmo -fl-cow -flac -flactag -flake -flam3 -flamerobin -flann -flare-engine -flare-game -flare -flashbench -flashcache -flashplugin-nonfree-extrasound-goto-binaries.ta..> -flashrom -flasm -flatzebra -fldiff -fldigi -flex-old -flexbar -flexloader -flexml -flickcurl -flightgear -flip -flmsg -floatbg -flog -florence -flowgrind -flpsed -flrig -fltk1.1 -fltk1.3 -fluidsynth-dssi -flush -fluxbox -flvmeta -flvstreamer -flwm -flwrap -fmit -fmtools -fntsample -folks -fondu -font-manager -fontconfig -fontforge-extras -fonttools -foo2zjs -foobillardplus -fookb -foomatic-db-engine -foomatic-filters -foreign -foremost -forked-daapd -forkstat -fort77 -fortune-mod -fortunes-es -fosfat -fossil -four-in-a-row -fox1.6 -foxtrotgps -fpart -fped -fpgatools -fping -fplll -fpm2 -fprint-demo -fprintd -fprobe -fprobe-ulog -fqterm -fractalnow -frama-c -frame -francine -freealut -freebirth -freebsd-glue -freebsd-libs -freecad -freecdb -freecell-solver -freeciv -freecontact -freedink-dfarc -freedroid -freefem++ -freefem -freefem3d -freefoam -freegish -freehdl -freeimage -freeipmi -freemat -freeorion -freeradius -freespace2-launcher-wxlauncher-goto-binaries.ta..> -freesweep -freetds -freetuxtv -freetype -freewheeling -freexl -frei0r -freqtweak -fribid -fritzing -frog -frogr -frotz -frown -frozen-bubble -fs-uae -fsarchiver -fslview -fsmark -fso-datad -fso-deviced -fso-gpsd -fso-gsm0710muxd -fso-gsmd -fso-usaged -fspanel -fsplib -fspy -fstrcmp -fswebcam -ftdi-eeprom -fteqcc -ftgl -ftjam -ftnchek -ftools-fv -ftphs -ftplib -ftpmirror -fullquottel -funguloids -funnelweb -fuse-convmvfs -fuse-emulator-utils -fuse-exfat -fuse -fuse-posixovl -fuse-umfuse-ext2 -fuse-umfuse-fat -fuse-umfuse-iso9660 -fusedav -fuseiso -fusesmb -fuzz -fvwm1 -fwbuilder -fwknop -fwlogwatch -fxload -fyba -fyre -g-wrap -g15composer -g15macro -g15mpd -g15stats -g2clib -g2ipmsg -g3data -g3dviewer -gadap -gadfly -gadmin-bind -gadmin-openvpn-client -gadmin-openvpn-server -gadmin-proftpd -gadmin-rsync -gadmin-samba -gajim -galax -galculator -galib -galleta -gamazons -gambc -game-music-emu -gamin -gamine -gammaray -ganeti -ganglia -ganglia-modules-linux -ganv -ganyremote -gap-float -gap -gap-guava -gap-io -garcon -garden-of-coloured-lights -garmin-forerunner-tools -garmin-plugin -garmindev -gatling -gauche-c-wrapper -gauche -gauche-gtk -gaviotatb -gavl -gazebo -gbase -gbatnav -gbemol -gbgoffice -gbonds -gbrainy -gbrowse -gbsplay -gcal -gcb -gcc-4.8 -gcc-arm-none-eabi -gcc-avr -gcc-mingw-w64 -gcl -gcolor2 -gcompris -gconf-editor -gconf -gconfmm2.6 -gconjugue -gcpegg -gcx -gd4o -gdbm -gdesklets -gdigi -gdis -gdk-pixbuf -gdl -gdm3 -gdmap -gdnsd -gdome2 -gdpc -geant321 -geany -geany-plugins -gearman-interface -gearmand -geary -gecko-mediaplayer -gecode -geda-gaf -geda-xgsch2pcb -gedit -gedit-latex-plugin -gedit-plugins -geekcode -geeqie -geis -geki2 -geki3 -gelemental -gem -gemanx-gtk2 -gemdropx -gemrb -gems -genders -genext2fs -gengetopt -genisovh -genius -genometools -genparse -genromfs -genshi -gentle -geoclue-2.0 -geoclue -geocode-glib -geogebra-kde -geographiclib -geoip -geomview -geos -gerbv -gerstensaft -gesftpserver -getdns -getstream -gexec -gexiv2 -gf-complete -gf2x -gfal2 -gfarm -gfarm2fs -gfax -gfbgraph -gff2aplot -gflags -gfm -gforth -gfpoken -gfs2-utils -gfsview -gftp -gfxboot -ggcov -ggobi -ghc -ghc-mod -ghc-testsuite -ghemical -ghex -ghostess -giblib -gif2apng -gif2png -giflib -gifsicle -gifticlib -giftrans -gigedit -giggle -gigolo -gimagereader -gimmix -gimp-dcraw -gimp-dds -gimp-gap -gimp-texturize -ginac -ginkgocadx -girara -git-annex -git-repair -gitg -github-backup -gitit -givaro -gjacktransport -gjay -gjiten -gjs -gkdebconf -gkermit -gkrellkam -gkrellm -gkrellm-leds -gkrellm-mailwatch -gkrellm-radio -gkrellm-reminder -gkrellm-thinkbat -gkrellm-volume -gkrellm-x86info -gkrellm-xkb -gkrellm2-cpufreq -gkrellmitime -gkrellmoon -gkrellmwireless -gkrellshoot -gkrelltop -gkrelluim -gkrellweather -gkremldk -gksu -gl-117 -gl2ps -glabels -glade -gladtex -glam2 -gle -glee -glew -glfer -glfw -glfw3 -glib-networking -glibmm2.4 -glide -glm -glob2 -global -globs -globus-authz-callout-error -globus-authz -globus-callout -globus-common -globus-core -globus-ftp-client -globus-ftp-control -globus-gass-cache -globus-gass-cache-program -globus-gass-copy -globus-gass-server-ez -globus-gass-transfer -globus-gatekeeper -globus-gfork -globus-gram-client -globus-gram-client-tools -globus-gram-job-manager-callout-error-goto-bina..> -globus-gram-job-manager-fork -globus-gram-job-manager -globus-gram-job-manager-lsf -globus-gram-job-manager-pbs -globus-gram-job-manager-scripts-goto-binaries.t..> -globus-gram-job-manager-sge -globus-gram-job-manager-slurm-goto-binaries.tar..> -globus-gram-protocol -globus-gridftp-server-control-goto-binaries.tar..> -globus-gridftp-server -globus-gridmap-callout-error -globus-gridmap-eppn-callout -globus-gridmap-verify-myproxy-callout-goto-bina..> -globus-gsi-callback -globus-gsi-cert-utils -globus-gsi-credential -globus-gsi-openssl-error -globus-gsi-proxy-core -globus-gsi-proxy-ssl -globus-gsi-sysconfig -globus-gss-assist -globus-gssapi-error -globus-gssapi-gsi -globus-io -globus-openssl-module -globus-proxy-utils -globus-rls-client -globus-rls-server -globus-rsl -globus-scheduler-event-generator-goto-binaries...> -globus-usage -globus-xio -globus-xio-gridftp-driver -globus-xio-gridftp-multicast -globus-xio-gsi-driver -globus-xio-pipe-driver -globus-xio-popen-driver -globus-xio-rate-driver -globus-xio-udt-driver -globus-xioperf -glogic -gloox -glosstex -glotski -glpk -glpk-java -gltron -gluegen2 -glurp -glw -glyr -gmanedit -gmchess -gmediaserver -gmemusage -gmerlin-avdecoder -gmerlin-encoders -gmerlin -gmetadom -gmfsk -gmidimonitor -gmime -gmlive -gmorgan -gmotionlive -gmp-ecm -gmp -gmpc -gmpc-plugins -gmrender-resurrect -gmrun -gmt -gmtk -gmtp -gmult -gnac -gnarwl -gnat-gps -gnat-mingw-w64 -gnet -gniall -gnoemoe -gnomad2 -gnome-applets -gnome-backgrounds -gnome-boxes -gnome-breakout -gnome-btdownload -gnome-calculator -gnome-chemistry-utils -gnome-chess -gnome-clocks -gnome-color-chooser -gnome-color-manager -gnome-commander -gnome-control-center -gnome-desktop -gnome-desktop-sharp2 -gnome-desktop-testing -gnome-desktop3 -gnome-dictionary -gnome-disk-utility -gnome-do -gnome-do-plugins -gnome-doc-utils -gnome-documents -gnome-flashback -gnome-font-viewer -gnome-hearts -gnome-hwp-support -gnome-icon-theme -gnome-js-common -gnome-keyring-sharp -gnome-klotski -gnome-logs -gnome-mahjongg -gnome-main-menu -gnome-maps -gnome-mastermind -gnome-media -gnome-menus -gnome-menus2 -gnome-mime-data -gnome-mines -gnome-mplayer -gnome-mud -gnome-music -gnome-nds-thumbnailer -gnome-nettool -gnome-nibbles -gnome-online-accounts -gnome-online-miners -gnome-orca -gnome-osd -gnome-packagekit -gnome-paint -gnome-panel -gnome-phone-manager -gnome-photos -gnome-pie -gnome-power-manager -gnome-ppp -gnome-python-desktop -gnome-python-extras -gnome-python -gnome-robots -gnome-schedule -gnome-screensaver -gnome-screenshot -gnome-search-tool -gnome-settings-daemon -gnome-sharp2 -gnome-shell-extension-weather-goto-binaries.tar..> -gnome-shell-extensions -gnome-shell -gnome-shell-mailnag -gnome-shell-pomodoro -gnome-software -gnome-sound-recorder -gnome-specimen -gnome-speech -gnome-subtitles -gnome-sudoku -gnome-sushi -gnome-system-log -gnome-system-monitor -gnome-system-tools -gnome-terminal -gnome-tetravex -gnome-themes-extras -gnome-themes -gnome-themes-standard -gnome-tweak-tool -gnome-user-share -gnome-vfs -gnome-video-arcade -gnome-video-effects -gnome-web-photo -gnome-xcf-thumbnailer -gnomekiss -gnomeradio -gnomint -gnonlin -gnonlin1.0 -gnote -gnotime -gnu-efi -gnu-smalltalk -gnuais -gnubg -gnubiff -gnubik -gnuboy -gnuchess -gnudatalanguage -gnugk -gnugo -gnuift -gnuit -gnujump -gnunet-fuse -gnunet -gnunet-gtk -gnupg-pkcs11-scd -gnuplot5 -gnurobbo -gnurobots -gnuserv -gnushogi -gnusim8085 -gnustep-back -gnustep-base -gnustep-dl2 -gnustep-gui -gnustep-make -gnustep-netclasses -gnustep-sqlclient -gnuvd -goaccess -gob2 -goban -gobby -gobby-infinote -gobi-loader -gobject-introspection -gocr -goffice-0.8 -goffice -gofigure2 -gogoc -goldencheetah -goldendict -golly -gom -goo -goobox -goocanvas -goocanvasmm -google-authenticator -google-glog -google-mock -google-perftools -gopchop -gopher -goplay -gosmore -gource -gozer -gp2c -gpaint -gpart -gparted -gpaste -gpdftext -gperiodic -gpgme1.0 -gphotofs -gphpedit -gpick -gpicview -gpiv -gpivtools -gplanarity -gpp -gpr -gpredict -gpsbabel -gpscorrelate -gpsd -gpsim -gpsk31 -gpsmanshp -gpt -gputils -gpw -gpx -gpx2shp -gqrx-sdr -gr-air-modes -gr-fcdproplus -gr-iqbal -gr-osmosdr -grabc -grail -gramadoir -gramofile -granatier -grantlee -granule -graphite2 -gravit -gravitywars -grcompiler -grdesktop -greed -grep -grepcidr -grhino -gri -gridlock.app -grig -grilo -grilo-plugins -gringotts -grisbi -grive -groff -gromacs -gromit -gromit-mpx -gross -groundhog -grsync -grub-installer -grun -gscanbus -gsetroot -gsettings-desktop-schemas -gshare -gsl -gsm0710muxd -gsmartcontrol -gsmlib -gsnmp -gsoap -gss -gssdp -gst-chromaprint -gst-fluendo-mp3 -gst-libav1.0 -gst-plugins-bad1.0 -gst-plugins-good0.10 -gst-plugins-ugly0.10 -gst-plugins-ugly1.0 -gst-python1.0 -gst0.10-python -gst123 -gstm -gstreamer-editing-services1.0-goto-binaries.tar..> -gstreamer-hplugins -gstreamer-sharp -gstreamer-vaapi -gstreamer0.10-dvswitch -gstreamer0.10-editing-services-goto-binaries.ta..> -gstreamer0.10 -gstreamer0.10-rtsp -gtamsanalyzer.app -gtans -gtest -gtetrinet -gtg-trace -gthumb -gtick -gtimer -gtk+2.0 -gtk-chtheme -gtk-doc -gtk-gnutella -gtk-im-libthai -gtk-nodoka-engine -gtk-recordmydesktop -gtk-sharp2 -gtk-sharp3 -gtk-theme-config -gtk-theme-switch -gtk-vector-screenshot -gtk-vnc -gtk2-engines-aurora -gtk2-engines-cleanice -gtk2-engines -gtk2-engines-magicchicken -gtk2-engines-murrine -gtk2-engines-oxygen -gtk2-engines-qtcurve -gtk2-engines-wonderland -gtk2-engines-xfce -gtk2hs-buildtools -gtkam -gtkatlantic -gtkballs -gtkcookie -gtkdataboxmm -gtkextra -gtkgl2 -gtkglextmm -gtkguitune -gtkhash -gtkhotkey -gtkhtml3.14 -gtkhtml4.0 -gtkimageview -gtkmathview -gtkmm2.4 -gtkmm3.0 -gtkorphan -gtkperf -gtkpod -gtkpool -gtksourceview2 -gtksourceview3 -gtkspell -gtkspell3 -gtkspellmm -gtools -gtranslator -gtrayicon -gts -gtypist -guacamole-server -guake -guake-indicator -guava -guayadeque -gucharmap -guessnet -guichan -guifications -guile-1.8 -guile-cairo -guile-gnome-platform -guiqwt -gummi -gup -gupnp-av -gupnp-dlna -gupnp -gupnp-igd -gurlchecker -gutenprint -guvcview -gv -gvfs -gvpe -gwaei -gwaterfall -gwave -gweled -gwenview -gworkspace -gworldclock -gwyddion -gxine -gxkb -gxmessage -gxmms2 -gxneur -gyoto -gyrus -gzip -gzrt -h5py -h5utils -ha -hachu -hackrf -haildb -halibut -hama-slide-mouse-control -hamlib -handlersocket -hapm -happy -haproxy -hardening-wrapper -hardinfo -hardlink -harfbuzz -harminv -harvid -hasciicam -haserl -hashalot -hashcash -haskell-abstract-deque -haskell-abstract-par -haskell-acid-state -haskell-active -haskell-adjunctions -haskell-aeson -haskell-aeson-pretty -haskell-alut -haskell-ami -haskell-ansi-terminal -haskell-ansi-wl-pprint -haskell-appar -haskell-arrows -haskell-asn1-data -haskell-asn1-encoding -haskell-asn1-parse -haskell-asn1-types -haskell-async -haskell-attoparsec-enumerator-goto-binaries.tar..> -haskell-attoparsec -haskell-augeas -haskell-authenticate -haskell-authenticate-oauth -haskell-aws -haskell-base-unicode-symbols -haskell-base16-bytestring -haskell-base64-bytestring -haskell-basic-prelude -haskell-bifunctors -haskell-binary-communicator -haskell-binary -haskell-binary-shared -haskell-bindings-dsl -haskell-bindings-gpgme -haskell-bindings-libzip -haskell-bindings-nettle -haskell-bindings-sane -haskell-bitarray -haskell-blaze-builder-enumerator-goto-binaries...> -haskell-blaze-builder -haskell-blaze-html -haskell-blaze-markup -haskell-blaze-svg -haskell-blaze-textual -haskell-bloomfilter -haskell-bmp -haskell-boolean -haskell-boomerang -haskell-boundedchan -haskell-boxes -haskell-brainfuck -haskell-byteable -haskell-bytedump -haskell-byteorder -haskell-bytestring-lexing -haskell-bytestring-mmap -haskell-bytestring-nums -haskell-bytestring-progress -haskell-bytestring-show -haskell-bzlib -haskell-cabal-file-th -haskell-cabal -haskell-cabal-install -haskell-cairo -haskell-case-insensitive -haskell-cassava -haskell-categories -haskell-cautious-file -haskell-cereal-conduit -haskell-cereal -haskell-certificate -haskell-cgi -haskell-charset -haskell-chart -haskell-chasingbottoms -haskell-chell -haskell-chell-hunit -haskell-chell-quickcheck2 -haskell-chunked-data -haskell-cipher-aes -haskell-cipher-blowfish -haskell-cipher-camellia -haskell-cipher-des -haskell-cipher-rc4 -haskell-citeproc-hs -haskell-classy-prelude-conduit-goto-binaries.ta..> -haskell-classy-prelude -haskell-clientsession -haskell-clock -haskell-clocked -haskell-cmdargs -haskell-colour -haskell-comonad -haskell-comonad-transformers -haskell-concrete-typerep -haskell-cond -haskell-conduit-combinators -haskell-conduit -haskell-configfile -haskell-configurator -haskell-connection -haskell-contravariant -haskell-control-monad-free -haskell-control-monad-loop -haskell-convertible -haskell-cookie -haskell-cprng-aes -haskell-cpu -haskell-crypto-api -haskell-crypto-cipher-tests -haskell-crypto-cipher-types -haskell-crypto-conduit -haskell-crypto -haskell-crypto-numbers -haskell-crypto-pubkey -haskell-crypto-pubkey-types -haskell-crypto-random-api -haskell-crypto-random -haskell-cryptocipher -haskell-cryptohash-conduit -haskell-cryptohash-cryptoapi -haskell-cryptohash -haskell-css-text -haskell-csv-conduit -haskell-csv -haskell-curl -haskell-data-accessor -haskell-data-accessor-mtl -haskell-data-accessor-template-goto-binaries.ta..> -haskell-data-binary-ieee754 -haskell-data-default-class -haskell-data-default -haskell-data-default-instances-base-goto-binari..> -haskell-data-default-instances-containers-goto-..> -haskell-data-default-instances-dlist-goto-binar..> -haskell-data-default-instances-old-locale-goto-..> -haskell-data-hash -haskell-data-inttrie -haskell-data-lens -haskell-data-lens-template -haskell-data-memocombinators -haskell-data-pprint -haskell-dataenc -haskell-datetime -haskell-dav -haskell-dbus -haskell-debian -haskell-deepseq-generics -haskell-dependent-map -haskell-dependent-sum -haskell-dependent-sum-template-goto-binaries.ta..> -haskell-derive -haskell-diagrams-cairo -haskell-diagrams-core -haskell-diagrams-gtk -haskell-diagrams-lib -haskell-diagrams-svg -haskell-diff -haskell-digest -haskell-dimensional -haskell-directory-tree -haskell-distributive -haskell-djinn-ghc -haskell-djinn-lib -haskell-dlist -haskell-dlist-instances -haskell-dns -haskell-doctest -haskell-download-curl -haskell-dpkg -haskell-dual-tree -haskell-dyre -haskell-edison-api -haskell-edison-core -haskell-edit-distance -haskell-editline -haskell-either -haskell-email-validate -haskell-enclosed-exceptions -haskell-entropy -haskell-enumerator -haskell-equivalence -haskell-erf -haskell-errors -haskell-esqueleto -haskell-event-list -haskell-exception-transformers-goto-binaries.ta..> -haskell-exceptions -haskell-executable-path -haskell-explicit-exception -haskell-extensible-exceptions-goto-binaries.tar..> -haskell-failure -haskell-fast-logger -haskell-fastcgi -haskell-fb -haskell-fclabels -haskell-fdo-notify -haskell-feed -haskell-fgl -haskell-file-embed -haskell-file-location -haskell-filemanip -haskell-filestore -haskell-fingertree -haskell-foldl -haskell-free -haskell-fsnotify -haskell-gconf -haskell-gd -haskell-generic-deriving -haskell-geniplate -haskell-ghc-events -haskell-ghc-mtl -haskell-ghc-paths -haskell-ghc-syb-utils -haskell-gio -haskell-github -haskell-gitlib -haskell-glade -haskell-glfw -haskell-glib -haskell-glob -haskell-gloss -haskell-gluraw -haskell-glut -haskell-gnuidn -haskell-gnutls -haskell-graceful -haskell-graphviz -haskell-groups -haskell-gsasl -haskell-gstreamer -haskell-gtk -haskell-gtk-traymanager -haskell-gtk3 -haskell-gtkglext -haskell-gtksourceview2 -haskell-haddock -haskell-hakyll -haskell-hamlet -haskell-happstack-authenticate-goto-binaries.ta..> -haskell-happstack -haskell-happstack-heist -haskell-happstack-hsp -haskell-happstack-server -haskell-harp -haskell-hashable -haskell-hashed-storage -haskell-hashmap -haskell-hashtables -haskell-haskeline -haskell-haskell-src -haskell-haskore -haskell-hastache -haskell-haxr -haskell-hcard -haskell-hcwiid -haskell-hedis -haskell-heist -haskell-hfuse -haskell-hgettext -haskell-hgl -haskell-hinotify -haskell-hint -haskell-hit -haskell-hjavascript -haskell-hjscript -haskell-hjsmin -haskell-hledger -haskell-hledger-interest -haskell-hledger-lib -haskell-hledger-web -haskell-hmatrix -haskell-hoauth2 -haskell-hoogle -haskell-hopenpgp -haskell-hopenpgp-tools -haskell-hostname -haskell-hourglass -haskell-hs-bibutils -haskell-hs3 -haskell-hscurses -haskell-hsemail -haskell-hsh -haskell-hslua -haskell-hsmagick -haskell-hsp -haskell-hspec-expectations -haskell-hspec -haskell-hsql -haskell-hsql-mysql -haskell-hsql-odbc -haskell-hsql-postgresql -haskell-hsql-sqlite3 -haskell-hssyck -haskell-hstringtemplate -haskell-hsx -haskell-hsx-jmacro -haskell-hsx2hs -haskell-hsyslog -haskell-html-conduit -haskell-html -haskell-http-attoparsec -haskell-http-client-conduit -haskell-http-client -haskell-http-client-tls -haskell-http-conduit -haskell-http-date -haskell-http -haskell-http-reverse-proxy -haskell-http-types -haskell-hunit -haskell-hxt-cache -haskell-hxt-charproperties -haskell-hxt-curl -haskell-hxt -haskell-hxt-http -haskell-hxt-regex-xmlschema -haskell-hxt-relaxng -haskell-hxt-tagsoup -haskell-hxt-unicode -haskell-hxt-xpath -haskell-hxt-xslt -haskell-iconv -haskell-idna -haskell-ieee754 -haskell-ifelse -haskell-incremental-parser -haskell-intern -haskell-intervals -haskell-io-choice -haskell-io-storage -haskell-io-streams -haskell-iospec -haskell-iproute -haskell-irc -haskell-ircbot -haskell-iteratee -haskell-ixset -haskell-jmacro -haskell-json -haskell-juicypixels -haskell-keys -haskell-knob -haskell-lambdabot-utils -haskell-language-c -haskell-language-haskell-extract-goto-binaries...> -haskell-language-javascript -haskell-language-python -haskell-largeword -haskell-lazysmallcheck -haskell-leksah -haskell-leksah-server -haskell-lens -haskell-lexer -haskell-libsystemd-journal -haskell-libtagc -haskell-libxml-sax -haskell-libzip -haskell-lifted-async -haskell-lifted-base -haskell-listlike -haskell-logict -haskell-lrucache -haskell-ltk -haskell-maccatcher -haskell-markdown -haskell-markov-chain -haskell-math-functions -haskell-maths -haskell-maybet -haskell-mbox -haskell-memoize -haskell-memotrie -haskell-mersenne-random -haskell-mersenne-random-pure64-goto-binaries.ta..> -haskell-midi -haskell-mime-mail -haskell-mime-types -haskell-mmap -haskell-mmorph -haskell-monad-control -haskell-monad-journal -haskell-monad-logger -haskell-monad-loops -haskell-monad-par-extras -haskell-monad-par -haskell-monadcatchio-mtl -haskell-monadcatchio-transformers-goto-binaries..> -haskell-monadcryptorandom -haskell-monadprompt -haskell-monadrandom -haskell-monads-tf -haskell-mono-traversable -haskell-monoid-extras -haskell-monoid-subclasses -haskell-monoid-transformer -haskell-mtl -haskell-mtlparse -haskell-mueval -haskell-murmur-hash -haskell-mwc-random -haskell-nats -haskell-ncurses -haskell-nettle -haskell-netwire -haskell-network -haskell-network-info -haskell-network-multicast -haskell-network-protocol-xmpp-goto-binaries.tar..> -haskell-newtype -haskell-non-negative -haskell-notmuch-web -haskell-numbers -haskell-numeric-extras -haskell-numeric-quest -haskell-numinstances -haskell-numtype -haskell-objectname -haskell-oeis -haskell-ofx -haskell-openal -haskell-opengl -haskell-openglraw -haskell-openpgp-asciiarmor -haskell-openpgp -haskell-operational -haskell-options -haskell-optparse-applicative -haskell-osm -haskell-pandoc-citeproc -haskell-pandoc-types -haskell-pango -haskell-parallel -haskell-parseargs -haskell-parsec -haskell-parsers -haskell-pastis -haskell-path-pieces -haskell-patience -haskell-pcap -haskell-pcre-light -haskell-pem -haskell-persistent -haskell-persistent-postgresql-goto-binaries.tar..> -haskell-persistent-sqlite -haskell-persistent-template -haskell-pipes-aeson -haskell-pipes-attoparsec -haskell-pipes-bytestring -haskell-pipes -haskell-pipes-group -haskell-pipes-parse -haskell-pipes-safe -haskell-pipes-zlib -haskell-pointed -haskell-pointedlist -haskell-polyparse -haskell-postgresql-libpq -haskell-postgresql-simple -haskell-prelude-extras -haskell-pretty-show -haskell-primes -haskell-primitive -haskell-process-conduit -haskell-process-extras -haskell-profunctors -haskell-project-template -haskell-psqueue -haskell-publicsuffixlist -haskell-punycode -haskell-puremd5 -haskell-pwstore-fast -haskell-qrencode -haskell-quickcheck -haskell-quickcheck-instances -haskell-quickcheck-io -haskell-random -haskell-random-shuffle -haskell-ranged-sets -haskell-ranges -haskell-reactive-banana -haskell-readargs -haskell-readline -haskell-recaptcha -haskell-reducers -haskell-reflection -haskell-reform-blaze -haskell-reform -haskell-reform-hamlet -haskell-reform-happstack -haskell-reform-hsp -haskell-regex-base -haskell-regex-compat -haskell-regex-pcre -haskell-regex-posix -haskell-regex-tdfa -haskell-regex-tdfa-utf8 -haskell-regexpr -haskell-repa -haskell-representable-functors-goto-binaries.ta..> -haskell-resource-pool -haskell-resourcet -haskell-rosezipper -haskell-rsa -haskell-safe -haskell-safecopy -haskell-safesemaphore -haskell-sandi -haskell-scientific -haskell-scrobble -haskell-sdl-gfx -haskell-sdl -haskell-sdl-image -haskell-sdl-mixer -haskell-sdl-ttf -haskell-securemem -haskell-semigroupoids -haskell-semigroups -haskell-sendfile -haskell-set-extra -haskell-setenv -haskell-setlocale -haskell-sfml-audio -haskell-sha -haskell-shakespeare-css -haskell-shakespeare -haskell-shakespeare-i18n -haskell-shakespeare-js -haskell-shakespeare-text -haskell-shellac -haskell-show -haskell-silently -haskell-simple-reflect -haskell-simple-sendfile -haskell-simpleea -haskell-simpleirc -haskell-skein -haskell-smallcheck -haskell-smtpclient -haskell-snap-core -haskell-snap -haskell-snap-loader-dynamic -haskell-snap-loader-static -haskell-snap-server -haskell-snaplet-acid-state -haskell-sockaddr -haskell-socks -haskell-split -haskell-src-exts -haskell-src-meta -haskell-statestack -haskell-statevar -haskell-static-hash -haskell-statistics -haskell-stm-chans -haskell-stm -haskell-stmonadtrans -haskell-storable-complex -haskell-stream -haskell-streaming-commons -haskell-strict-concurrency -haskell-strict -haskell-stringbuilder -haskell-stringprep -haskell-stringsearch -haskell-strptime -haskell-svgcairo -haskell-swish -haskell-syb -haskell-syb-with-class -haskell-syb-with-class-instances-text-goto-bina..> -haskell-system-fileio -haskell-system-filepath -haskell-tabular -haskell-tagged -haskell-tagsoup -haskell-tagstream-conduit -haskell-tar -haskell-tasty-golden -haskell-tasty -haskell-tasty-hspec -haskell-tasty-hunit -haskell-tasty-quickcheck -haskell-tasty-rerun -haskell-tasty-th -haskell-template -haskell-temporary -haskell-tensor -haskell-terminal-progress-bar-goto-binaries.tar..> -haskell-terminfo -haskell-test-framework -haskell-test-framework-hunit -haskell-test-framework-quickcheck2-goto-binarie..> -haskell-test-framework-th -haskell-test-framework-th-prime-goto-binaries.t..> -haskell-texmath -haskell-text -haskell-text-icu -haskell-tf-random -haskell-th-extras -haskell-th-lift -haskell-th-orphans -haskell-threads -haskell-time-compat -haskell-tinyurl -haskell-tls -haskell-transformers-base -haskell-transformers-compat -haskell-transformers -haskell-trifecta -haskell-type-level -haskell-unbounded-delays -haskell-uniplate -haskell-universe-base -haskell-universe -haskell-unix-bytestring -haskell-unix-compat -haskell-unix-time -haskell-unixutils -haskell-unlambda -haskell-unordered-containers -haskell-uri -haskell-url -haskell-utf8-light -haskell-utf8-string -haskell-utility-ht -haskell-uuagc-cabal -haskell-uuid -haskell-uulib -haskell-vault -haskell-vector-algorithms -haskell-vector-binary-instances-goto-binaries.t..> -haskell-vector -haskell-vector-instances -haskell-vector-space -haskell-vector-space-points -haskell-vector-th-unbox -haskell-void -haskell-vte -haskell-vty -haskell-wai-app-file-cgi -haskell-wai-app-static -haskell-wai-conduit -haskell-wai-extra -haskell-wai -haskell-wai-handler-fastcgi -haskell-wai-handler-launch -haskell-wai-logger -haskell-wai-websockets -haskell-warp -haskell-warp-tls -haskell-web-plugins -haskell-web-routes-boomerang -haskell-web-routes -haskell-web-routes-happstack -haskell-web-routes-hsp -haskell-web-routes-th -haskell-webkit -haskell-websockets -haskell-weighted-regexp -haskell-wizards -haskell-wl-pprint-text -haskell-word8 -haskell-x11 -haskell-x11-xft -haskell-x509 -haskell-x509-store -haskell-x509-system -haskell-x509-util -haskell-x509-validation -haskell-xcb-types -haskell-xdg-basedir -haskell-xhtml -haskell-xml-conduit -haskell-xml -haskell-xml-hamlet -haskell-xml-types -haskell-xml2html -haskell-xmlhtml -haskell-xss-sanitize -haskell-yaml -haskell-yaml-light -haskell-yesod-auth-account -haskell-yesod-auth -haskell-yesod-auth-oauth -haskell-yesod-bin -haskell-yesod-core -haskell-yesod-default -haskell-yesod-form -haskell-yesod -haskell-yesod-markdown -haskell-yesod-newsfeed -haskell-yesod-persistent -haskell-yesod-routes -haskell-yesod-static -haskell-yesod-test -haskell-zeromq4-haskell -haskell-zip-archive -haskell-zlib-bindings -haskell-zlib-enum -haskell-zlib -haskell98-report -haskell98-tutorial -haskelldb -haskelldb-hdbc -haskelldb-hdbc-odbc -haskelldb-hdbc-postgresql -haskelldb-hdbc-sqlite3 -hasktags -haveged -havp -hawknl -haxml -hbro-contrib -hbro -hdapsd -hdate-applet -hdbc -hdbc-odbc -hdbc-postgresql -hdbc-sqlite3 -hddtemp -hdevtools -hdf-eos4 -hdf-eos5 -hdup -health-check -hebcal -hedgewars -heimdal -heimdall-flash -heirloom-mailx -hello -hello-traditional -help2man -hepmc -herbstluftwm -heroes -hershey-fonts -herwig++ -hesiod -hexchat -hexcurse -hexec -hexedit -hexer -hexter -hexxagon -hfsplus -hfsprogs -hfsutils -hidapi -hidrd -highlighting-kate -hippo-canvas -hiredis -hitori -hivex -hkgerman -hkl -hlint -hmisc -hmmer -hmmer2 -hnb -ho22bus -hoauth -hocr -hodie -hol88 -holdingnuts -homebank -horgand -hostap-utils -hostname -hothasktags -hotssh -hotswap -hoz -hp2xx -hp48cc -hpanel -hpcc -hping3 -hplip -hpsockd -hscolour -hsetroot -hslogger -hspell -hspell-gui -ht -htcheck -htdig -html-xml-utils -htmlcxx -htmldoc -htop -htp -htpdate -htsengine -htseq -httest -http-parser -httperf -httpfs2 -httping -httpry -httptunnel -httrack -httraqt -hubicfuse -hugin -hugs98 -hunspell -hunt -hw-detect -hwinfo -hwloc-contrib -hwloc -hyantesite -hybserv -hydrogen -hyperestraier -hyperic-sigar -hyphen -hyphen-show -hypre -i2c-tools -i2util -i3-wm -i3lock -i3status -i7z -i810switch -i8kutils -iagno -iat -iaxmodem -ibacm -ibniz -ibod -ibsim -ibus-anthy -ibus-array -ibus-cangjie -ibus-chewing -ibus-client-clutter -ibus -ibus-hangul -ibus-input-pad -ibus-kkc -ibus-libpinyin -ibus-libthai -ibus-libzhuyin -ibus-m17n -ibus-pinyin -ibus-qt -ibus-rime -ibus-sharada-braille -ibus-skk -ibus-table -ibus-unikey -ibus-zhuyin -ibutils -ical2html -icebreaker -icecast2 -icecc -icecc-monitor -icedove -ices2 -icinga2 -icmake -icmpinfo -icmptx -icmpush -icom -icon-slicer -icoutils -icu -id3 -id3lib3.8.3 -id3ren -id3tool -idba -ident2 -idesk -ideviceinstaller -idle3-tools -idlestat -ido -idzebra -iec16022 -ifd-gempc -ifhp -ifile -ifmetric -ifpgui -ifplugd -ifrit -ifstat -iftop -ifupdown -ii -iipimage -ijs -ikarus -ike -ike-scan -ikiwiki-hosting -ikvm -ilmbase -im -imagemagick -imagevis3d -imagination -imapfilter -imaptool -imdbpy -imgvtopgm -imhangul -imhangul3 -iml -imlib2 -imposm -imview -imvirt -imwheel -inadyn -indent -indicator-session -indigo -infernal -infiniband-diags -infon -ink -inkscape -inn -inn2 -innoextract -inotail -inoticoming -inotify-tools -inotifyx -input-pad -input-utils -inputlirc -inputplug -insighttoolkit4 -instead -intel-gpu-tools -intel-vaapi-driver -inteltool -intone -invada-studio-plugins -invada-studio-plugins-lv2 -invaders -inventor -invesalius -iodine -iok -ioping -ip4r -ipband -ipe5toxml -iperf -iperf3 -ipfm -ipgrab -ipheth -ipip -ipkungfu -ipmitool -ippl -iprint -iproute2 -ips -ipsec-tools -ipset -ipsvd -iptotal -iptraf -iptraf-ng -iptux -iputils -ipv6calc -ipv6toolkit -ipvsadm -ipwatchd-gnotify -ipwatchd -ir.lv2 -ircd-hybrid -ircd-irc2 -ircd-ratbox -ircmarkers -ircp-tray -irda-utils -iroffer -irony-mode -irqbalance -irsim -irssi -irssi-plugin-otr -irssi-plugin-xmpp -isatapd -isc-dhcp -iscsitarget -iselect -isight-firmware-tools -isl -isomaster -isomd5sum -isoquery -ispell -istanbul -istgt -isync -italc -itcl3 -itk3 -itksnap -itools -itop -itsol -iucode-tool -ivtools -ivtv-utils -ivykis -iw -iwyu -jabber-muc -jack-audio-connection-kit -jack-capture -jack -jack-keyboard -jack-midi-clock -jack-mixer -jack-stdio -jack-tools -jackd2 -jackmeter -jaffl -jags -jalv -jam -jamnntpd -jana -jansson -jasper -jaula -java-atk-wrapper -java-gnome -java2html -java3d -jazip -jbig2dec -jbigkit -jblas -jclassinfo -jd -jed -jeex -jellyfish -jemalloc -jerasure -jesred -jester -jetty -jffi -jgraph -jhbuild -jhdf -jhead -jigdo -jigit -jikespg -jimtcl -jinput -jlint -jmagick -jmtpfs -jnettop -jocaml -joe -jovie -joy2key -joystick -jp2a -jpeginfo -jpegjudge -jpegoptim -jpegpixi -jpilot -jpnevulator -jq -jruby -js-of-ocaml -jshon -json-c -json-glib -json-spirit -jthread -judy -jugglemaster -juk -juke -jumpnbump -jupp -jvim -jxrlib -jzip -k3b -k3d -k4dirstat -kaa-base -kaa-imlib2 -kaa-metadata -kaccessible -kactivities -kadu -kaffeine -kajongg -kakasi -kalgebra -kali -kalign -kalternatives -kalzium -kamera -kamerka -kamoso -kanagram -kanatest -kanjipad -kannel-sqlbox -kanyremote -kapman -kapptemplate -kasumi -kate -katomic -kaya -kbackup -kbd -kbdd -kbibtex -kblackbox -kblocks -kbounce -kbreakout -kbruch -kbtin -kcachegrind -kcalc -kcc -kcemu -kcharselect -kchmviewer -kcm-fcitx -kcollectd -kcolorchooser -kcometen4 -kcov -kcron -kdbg -kdc2tiff -kde-base-artwork -kde-baseapps -kde-dev-scripts -kde-dev-utils -kde-gtk-config -kde-l10n -kde-runtime -kde-style-polyester -kde-style-qtcurve -kde-wallpapers -kde-workspace -kde4libs -kdeartwork -kdeconnect -kdegraphics-mobipocket -kdegraphics-strigi-analyzer -kdegraphics-thumbnailers -kdenetwork-filesharing -kdenetwork-strigi-analyzers -kdenlive -kdepimlibs -kdeplasma-addons -kdesdk-kioslaves -kdesdk-strigi-analyzers -kdesdk-thumbnailers -kdesrc-build -kdesudo -kdesvn -kdevelop -kdevelop-pg-qt -kdevelop-php-docs -kdevelop-php -kdevelop-python -kdevplatform -kdewebdev -kdf -kdiamond -kdiff3 -kdnssd -kdrill -keepalived -keepassx -kerneltop -kernsmooth -ketm -keurocalc -kexec-tools -keybinder-3.0 -keybinder -keylaunch -keynav -keyutils -kfilemetadata -kfloppy -kfourinline -kftpgrabber -kgamma -kgeography -kget -kgoldrunner -kgpg -khangman -khronos-opencl-headers -kicad -kid3 -kig -kigo -kildclient -kile -killbots -kimwitu++ -kimwitu -kinect-audio-setup -kino -kio-ftps -kio-gopher -kio-mtp -kiriki -kismet -kissplice -kiten -kivy -kjumpingcube -klatexformula -klettres -klickety -klines -klog -kmag -kmahjongg -kmess -kmetronome -kmflcomp -kmidimon -kmines -kmix -kmldonkey -kmod -kmousetool -kmouth -kmplayer -kmplot -kmymoney -knavalbattle -knemo -knetwalk -knews -knights -knockd -knocker -knot -knutclient -kobodeluxe -kolf -kollision -kolourpaint -komi -komparator -kompare -kon2 -konquest -konsole -konversation -kopete -korundum -kosd -kover -kpartsplugin -kpat -kphotoalbum -kppp -kprinter4 -kqtquickcharts -kradio4 -kraft -krb5-auth-dialog -krb5-strength -krb5-sync -krdc -krecipes -kredentials -kremotecontrol -krename -kreversi -krfb -kross-interpreters -kruler -krusader -ksaneplugin -kscd -kscreen -kshisen -kshutdown -ksirk -ksnakeduel -ksnapshot -kspaceduel -ksplice -ksquares -ksshaskpass -kst -kstars -kstart -ksudoku -ksystemlog -kteatime -kterm -ktikz -ktimer -ktorrent -ktouch -ktp-accounts-kcm -ktp-approver -ktp-auth-handler -ktp-call-ui -ktp-common-internals -ktp-contact-list -ktp-contact-runner -ktp-desktop-applets -ktp-filetransfer-handler -ktp-kded-integration-module -ktp-send-file -ktp-text-ui -ktuberling -kturtle -ktux -kubrick -kumofs -kuser -kuvert -kvirc -kvkbd -kvpm -kvpnc -kwallet -kwalletcli -kwin-style-crystal -kwin-style-dekorator -kwordquiz -kwstyle -kxl -kyotocabinet -kyototycoon -kytea -l2tpns -lablgl -lablgtk2 -lablgtkmathview -labrea -lacheck -ladish -ladr -ladspa-sdk -ladvd -lakai -lambdabot -lame -lapack -larswm -laserboy -last-align -lastpass-cli -lat -latd -late -latencytop -latex-cjk-japanese-wadalab -latex2rtf -latexila -latrace -lattice -launchtool -lbcd -lbdb -lbreakout2 -lbt -lbzip2 -lcab -lcalc -lcas -lcas-lcmaps-gt4-interface -lcd4linux -lcdproc -lcmaps -lcmaps-plugins-basic -lcmaps-plugins-jobrep -lcmaps-plugins-verify-proxy -lcmaps-plugins-voms -lcms2 -lcrt -ldap-haskell -ldap2dns -ldap2zone -ldapvi -ldb -ldc -le-dico-de-rene-cougnenc -le -leafpad -leave -lebiniou -ledger -ledmon -lekhonee-gnome -lensfun -leptonlib -letterize -levee -leveldb -lft -lftp -lgeneral -lhapdf -lhasa -lhs2tex -lib3ds -libaacs -libaal -libabw -libace-perl -libacme-damn-perl -libacpi -libafs-pag-perl -libai-fann-perl -libaio -libalgorithm-combinatorics-perl-goto-binaries.t..> -libalgorithm-diff-xs-perl -libalgorithm-lbfgs-perl -libalgorithm-permute-perl -libalias-perl -libalien-sdl-perl -libalien-wxwidgets-perl -libalkimia -libalog -libam7xxx -libantlr3c -libao -libaosd -libapache-authenhook-perl -libapache-db-perl -libapache-logformat-compiler-perl-goto-binaries..> -libapache-mod-auth-kerb -libapache-mod-auth-radius -libapache-mod-encoding -libapache-mod-evasive -libapache-mod-jk -libapache-mod-log-sql -libapache-mod-musicindex -libapache-mod-removeip -libapache2-authenntlm-perl -libapache2-mod-auth-cas -libapache2-mod-auth-gssapi -libapache2-mod-auth-mellon -libapache2-mod-auth-openid -libapache2-mod-auth-openidc -libapache2-mod-auth-pgsql -libapache2-mod-auth-plain -libapache2-mod-auth-pubtkt -libapache2-mod-auth-tkt -libapache2-mod-authn-sasl -libapache2-mod-authnz-external-goto-binaries.ta..> -libapache2-mod-authnz-pam -libapache2-mod-authz-unixgroup-goto-binaries.ta..> -libapache2-mod-bw -libapache2-mod-defensible -libapache2-mod-encoding -libapache2-mod-fcgid -libapache2-mod-form -libapache2-mod-geoip -libapache2-mod-intercept-form-submit-goto-binar..> -libapache2-mod-ldap-userdir -libapache2-mod-lisp -libapache2-mod-log-slow -libapache2-mod-lookup-identity-goto-binaries.ta..> -libapache2-mod-nss -libapache2-mod-perl2 -libapache2-mod-python -libapache2-mod-qos -libapache2-mod-rivet -libapache2-mod-rpaf -libapache2-mod-ruid2 -libapache2-mod-watchcat -libapache2-mod-xsendfile -libappindicator -libapr-memcache -libapreq2 -libaqbanking -libarray-refelem-perl -libart-lgpl -libass -libassa -libassuan -libast -libastro-fits-cfitsio-perl -libasync-interrupt-perl -libasyncns -libatasmart -libaudclient -libaudio-cd-perl -libaudio-ecasound-perl -libaudio-flac-decoder-perl -libaudio-flac-header-perl -libaudio-mixer-perl -libaudio-scan-perl -libaudio-wav-perl -libauthen-dechpwd-perl -libauthen-krb5-admin-perl -libauthen-krb5-perl -libauthen-krb5-simple-perl -libauthen-pam-perl -libauthen-sasl-cyrus-perl -libauthen-smb-perl -libauthen-tacacsplus-perl -libautobox-perl -libautovivification-perl -libavc1394 -libavg -libavl -libax25 -libb-compiling-perl -libb-hooks-endofscope-perl -libb-hooks-op-annotation-perl-goto-binaries.tar..> -libb-hooks-op-check-entersubforcv-perl-goto-bin..> -libb-hooks-op-check-perl -libb-hooks-op-ppaddr-perl -libb-hooks-parser-perl -libb-perlreq-perl -libb-utils-perl -libb64 -libbareword-filehandles-perl -libbde -libberkeleydb-perl -libbfio -libbind -libbinio -libbio-samtools-perl -libbio-scf-perl -libbit-vector-perl -libbitcoin -libbitmask -libblkmaker -libbluedevil -libbluray -libbonobo -libbonoboui -libboost-geometry-utils-perl -libbpp-qt -libbpp-raa -libbrahe -libbs2b -libbsd-arc4random-perl -libbsd -libbsd-resource-perl -libbssolv-perl -libbuffy -libburn -libcaca -libcache-fastmmap-perl -libcache-memcached-fast-perl -libcache-mmap-perl -libcairo-gobject-perl -libcairo-perl -libcanberra -libcangjie -libcap-ng -libcap2 -libcapi20-3 -libcapsinetwork -libcapture-tiny-perl -libccaudio2 -libccd -libccp4 -libccrtp -libccscript3 -libccss -libcdb-file-perl -libcddb -libcdk-perl -libcdk5 -libcdr -libcec -libcerf -libcgi-struct-xs-perl -libcgic -libcgicc -libcgns -libcgroup -libchamplain -libchipcard -libcitadel -libcitygml -libclass-accessor-grouped-perl-goto-binaries.ta..> -libclass-c3-xs-perl -libclass-date-perl -libclass-errorhandler-perl -libclass-load-xs-perl -libclass-methodmaker-perl -libclass-xsaccessor-perl -libclaw -libcli -libclone-perl -libcmis -libcommoncpp2 -libcompface -libcompress-bzip2-perl -libcompress-raw-bzip2-perl -libcompress-raw-lzma-perl -libcompress-raw-zlib-perl -libconfig-augeas-perl -libconfig-autoconf-perl -libconvert-binary-c-perl -libcookie-baker-perl -libcorelinux -libcoro-perl -libcoverart -libcoyotl -libcpanel-json-xs-perl -libcpanplus-dist-build-perl -libcpuset -libcroco -libcrypt-cast5-perl -libcrypt-cracklib-perl -libcrypt-des-perl -libcrypt-dh-gmp-perl -libcrypt-eksblowfish-perl -libcrypt-gcrypt-perl -libcrypt-mysql-perl -libcrypt-openssl-bignum-perl -libcrypt-openssl-dsa-perl -libcrypt-openssl-random-perl -libcrypt-openssl-rsa-perl -libcrypt-openssl-x509-perl -libcrypt-rijndael-perl -libcrypt-smime-perl -libcrypt-ssleay-perl -libcrypt-twofish-perl -libcrypt-unixcrypt-xs-perl -libcrypto++ -libcsfml -libcsoap -libcss-minifier-xs-perl -libcsv -libctapimkt -libctl -libcue -libcutl -libcxgb3 -libdaemon -libdap -libdata-alias-perl -libdata-clone-perl -libdata-dump-streamer-perl -libdata-messagepack-perl -libdata-peek-perl -libdata-pond-perl -libdata-streamdeserializer-perl-goto-binaries.t..> -libdata-streamserializer-perl-goto-binaries.tar..> -libdata-structure-util-perl -libdata-swap-perl -libdata-util-perl -libdata-uuid-libuuid-perl -libdata-uuid-perl -libdate-calc-xs-perl -libdate-pcalc-perl -libdate-simple-perl -libdatetime-format-pg-perl -libdatetime-perl -libdatrie -libdbd-firebird-perl -libdbd-mysql-perl -libdbd-odbc-perl -libdbd-pg-perl -libdbd-sqlite2-perl -libdbd-sqlite3-perl -libdbd-sybase-perl -libdbi-drivers -libdbi -libdbi-perl -libdbusmenu -libdbusmenu-qt -libdc0 -libdca -libde265 -libdebian-installer -libdebug -libdevel-beginlift-perl -libdevel-bt-perl -libdevel-caller-perl -libdevel-callsite-perl -libdevel-checkbin-perl -libdevel-checkcompiler-perl -libdevel-checklib-perl -libdevel-cover-perl -libdevel-declare-perl -libdevel-dprof-perl -libdevel-findref-perl -libdevel-leak-perl -libdevel-lexalias-perl -libdevel-nytprof-perl -libdevel-pragma-perl -libdevel-refcount-perl -libdevel-size-perl -libdevice-cdio-perl -libdevice-serialport-perl -libdevice-usb-perl -libdigest-crc-perl -libdigest-jhash-perl -libdigest-md2-perl -libdigest-md4-perl -libdigest-sha-perl -libdigest-sha3-perl -libdigest-whirlpool-perl -libdisasm -libdiscid -libdisplaymigration -libdivecomputer -libdjconsole -libdkim -libdmapsharing -libdmtx -libdmx -libdockapp -libdogleg -libdr-sundown-perl -libdr-tarantool-perl -libdrm -libdrumstick -libdshconfig -libdssialsacompat -libdumb -libdvb -libdvbcsa -libdvbpsi -libdvdnav -libdvdread -libe-book -libeatmydata -libebur128 -libecap -libechonest -libedit -libee -libelf -libembperl-perl -libemu -libencode-detect-perl -libencode-eucjpms-perl -libencode-hanextra-perl -libencode-jis2k-perl -libencode-perl -libeot -libepc -libepoxy -libepsilon -libept -libepubgen -libesmtp -libestr -libetonyek -libetpan -libev -libev-perl -libevdev -libevent -libevent-perl -libevhtp -libevocosm -libexif -libexif-gtk -libexosip2 -libexplain -libextractor -libextractor-java -libextutils-cbuilder-perl -libextutils-cchecker-perl -libextutils-cppguess-perl -libextutils-libbuilder-perl -libextutils-parsexs-perl -libfakekey -libfann -libfap5 -libfcgi -libfcgi-perl -libffado -libfile-extattr-perl -libfile-fcntllock-perl -libfile-fnmatch-perl -libfile-lchown-perl -libfile-libmagic-perl -libfile-mmagic-xs-perl -libfile-rsyncp-perl -libfile-spec-perl -libfile-sync-perl -libfilehandle-fmode-perl -libfilesys-df-perl -libfilesys-smbclient-perl -libfilesys-statvfs-perl -libfilter-perl -libfiu -libfixbuf -libfixposix -libflorist -libfm -libfolia -libfont-freetype-perl -libfontenc -libforks-perl -libforms -libfprint -libfreefare -libfreehand -libfreenect -libfso-glib -libfsoframework -libftdi -libfurl-perl -libfuse-perl -libg15 -libg15render -libg3d -libgadu -libgaiagraphics -libgarmin -libgc -libgcal -libgconf-bridge -libgcr410 -libgctp -libgd-gd2-perl -libgd-perl -libgda5 -libgdal-grass -libgdata -libgdchart-gd2 -libgdf -libgee-0.8 -libgee -libgenome -libgeo-distance-xs-perl -libgeo-ip-perl -libgeo-proj4-perl -libgeotiff-dfsg -libgetdata -libgetopt++ -libgfshare -libghemical -libgig -libgisi -libgit2-glib -libgksu -libglademm2.4 -libglib-object-introspection-perl-goto-binaries..> -libglib-perl -libgltf -libglu -libgmpada -libgnatcoll -libgnome -libgnome-keyring -libgnome-media-profiles -libgnome2-canvas-perl -libgnome2-gconf-perl -libgnome2-perl -libgnome2-vfs-perl -libgnome2-wnck-perl -libgnomecanvas -libgnomecanvasmm2.6 -libgnomekbd -libgnomeui -libgoo-canvas-perl -libgooglepinyin -libgpg-error -libgpiv -libgpod -libgraphics-libplot-perl -libgringotts -libgrip -libgrits -libgroove -libgrss -libgsecuredelete -libgsf -libgsm -libgsm0710 -libgssapi-perl -libgssglue -libgstreamer-interfaces-perl -libgstreamer-perl -libgtextutils -libgtk2-appindicator-perl -libgtk2-gladexml-perl -libgtk2-imageview-perl -libgtk2-notify-perl -libgtk2-perl -libgtk2-sourceview2-perl -libgtk2-spell-perl -libgtk2-trayicon-perl -libgtk2-traymanager-perl -libgtk2-unique-perl -libgtkada -libgtksourceviewmm -libgtop2 -libguac -libguard-perl -libguess -libguestfs -libgusb -libgweather -libgwenhywfar -libgwibber -libgxps -libhangul -libharu -libhash-fieldhash-perl -libhash-storediterator-perl -libhbaapi -libhbalinux -libhdhomerun -libheimdal-kadm5-perl -libhmsbeagle -libhtml-parser-perl -libhtml-strip-perl -libhtml-template-pro-perl -libhtml-tidy-perl -libhtp -libhttp-parser-xs-perl -libhx -libibcm -libiberty -libibmad -libibtk -libibumad -libibverbs -libice -libicns -libics -libid3tag -libident -libidl -libidn2-0 -libiec61883 -libieee1284 -libifp -libiksemel -libimage-exif-perl -libimage-imlib2-perl -libimage-librsvg-perl -libimager-perl -libimager-qrcode-perl -libimobiledevice -libindi -libindicate -libindicate-qt -libindicator -libindirect-perl -libinline-c-perl -libinnodb -libinput -libinstpatch -libint -libinternals-perl -libintl-perl -libio-aio-perl -libio-captureoutput-perl -libio-dirent-perl -libio-epoll-perl -libio-interface-perl -libio-pty-perl -libio-socket-multicast-perl -libipathverbs -libipc-sharelite-perl -libiptcdata -libircclient -libirman -libiscsi -libisds -libisoburn -libisocodes -libitl-gobject -libitl -libitpp -libixion -libixp -libjavascript-minifier-xs-perl-goto-binaries.ta..> -libjconv -libjna-java -libjogl2-java -libjpeg-turbo -libjpeg6b -libjpeg8 -libjpeg9 -libjson-maybexs-perl -libjson-pointer-perl -libjson-rpc-perl -libjson-xs-perl -libkal -libkarma -libkate -libkaz -libkcddb -libkcompactdisc -libkdcraw -libkdeedu -libkdegames -libkeepalive -libkexiv2 -libkeyword-simple-perl -libkgapi -libkibi -libkinosearch1-perl -libkipi -libkkc-data -libkkc -libkmahjongg -libkmfl -libkml -libkolab -libkolabxml -libkomparediff2 -libkpeople -libkqueue -libksane -libksba -libkscreen -libktoblzcheck -libktorrent -liblangtag -liblas -liblastfm -liblaxjson -liblbfgs -liblchown-perl -libldm -liblexical-sealrequirehints-perl-goto-binaries...> -liblexical-var-perl -liblicense -liblingua-stem-snowball-perl -liblinux-dvb-perl -liblinux-epoll-perl -liblinux-inotify2-perl -liblinux-pid-perl -liblinux-prctl-perl -liblip -liblist-moreutils-perl -liblivemedia -liblo -liblocale-gettext-perl -liblocale-hebrew-perl -liblockfile -liblogging -liblognorm -liblouis -liblouisutdml -liblouisxml -liblqr -liblrdf -liblscp -libltc -libltcsmpte -liblucy-perl -liblunar -libm4ri -libm4rie -libmaa -libmad -libmail-cclient-perl -libmarpa-r2-perl -libmatch-simple-xs-perl -libmatchbox -libmatekbd -libmateweather -libmath++ -libmath-bigint-gmp-perl -libmath-clipper-perl -libmath-convexhull-monotonechain-perl-goto-bina..> -libmath-geometry-voronoi-perl-goto-binaries.tar..> -libmath-gmp-perl -libmath-int64-perl -libmath-libm-perl -libmath-mpfr-perl -libmath-prime-util-gmp-perl -libmath-prime-util-perl -libmath-random-isaac-xs-perl -libmath-random-mt-perl -libmath-random-tt800-perl -libmath-tamuanova-perl -libmath-vector-real-xs-perl -libmatheval -libmatio -libmatthew-java -libmbim -libmdsp -libmediaart -libmediainfo -libmemcached -libmialm -libmicrohttpd -libmikmod -libmime-explode-perl -libmimedir -libmimic -libmirisdr -libmkv -libmlx4 -libmlx5 -libmm-qt -libmms -libmng -libmnl -libmodbus -libmodelfile -libmodplug -libmodule-build-perl -libmodule-build-tiny-perl -libmodule-build-xsutil-perl -libmoe -libmongo-client -libmongodb-perl -libmoose-perl -libmoosex-role-withoverloading-perl-goto-binari..> -libmouse-perl -libmousex-foreign-perl -libmowgli-2 -libmowgli -libmozilla-ldap-perl -libmp3splt -libmpd -libmpdclient -libmpeg3 -libmrss -libmsgcat-perl -libmsn -libmspack -libmspub -libmsv -libmthca -libmtp -libmultidimensional-perl -libmusicbrainz-discid-perl -libmusicbrainz3 -libmwaw -libnanomsg-raw-perl -libnatpmp -libnbio -libncursesada -libndp -libnes -libnet-arp-perl -libnet-bluetooth-perl -libnet-cli-interact-perl -libnet-cups-perl -libnet-dbus-glib-perl -libnet-dbus-perl -libnet-dns-perl -libnet-freedb-perl -libnet -libnet-idn-encode-perl -libnet-jabber-loudmouth-perl -libnet-ldapapi-perl -libnet-libdnet-perl -libnet-libidn-perl -libnet-nis-perl -libnet-patricia-perl -libnet-pcap-perl -libnet-rawip-perl -libnet-ssh2-perl -libnet-ssleay-perl -libnet-tclink-perl -libnet-z3950-simpleserver-perl-goto-binaries.ta..> -libnet-z3950-zoom-perl -libnetaddr-ip-perl -libnetfilter-acct -libnetfilter-cthelper -libnetfilter-cttimeout -libnetfilter-log -libnetfilter-queue -libnfc -libnfnetlink -libnfo -libnfs -libnfsidmap -libnftnl -libnice -libnih -libnjb -libnl3 -libnm-qt -libnotify -libnova -libnsbmp -libnsgif -libnss-cache -libnss-db -libnss-extrausers -libnss-gw-name -libnss-ldap -libnss-lwres -libnss-myhostname -libnss-pgsql -libnss-securepass -libntlm -libnxml -libnxt -libnzb -liboauth -libocas -libodfgen -libofa -libofx -libogg -libogg-vorbis-decoder-perl -liboggz -liboglappth -libomxalsa -libomxcamera -libomxfbdevsink -libomxmad -libomxvideosrc -libomxvorbis -libomxxvideo -liboobs -liboop -libopendbx -libopengl-perl -libopengl-xscreensaver-perl -libopenraw -libopenusb -liboping -libopkele -liborcus -libosinfo -libosip2 -libosmosdr -libotf -libotr -libp11 -libpackage-stash-xs-perl -libpadwalker-perl -libpagemaker -libpam-abl -libpam-afs-session -libpam-alreadyloggedin -libpam-blue -libpam-ccreds -libpam-chroot -libpam-encfs -libpam-krb5 -libpam-ldap -libpam-mount -libpam-pwdfile -libpam-radius-auth -libpam-script -libpam-ssh -libpam-sshauth -libpam-tacplus -libpam-usb -libpango-perl -libpano13 -libpaper -libpar-packer-perl -libpar2 -libparams-classify-perl -libparams-util-perl -libparams-validate-perl -libparse-exuberantctags-perl -libpcap -libpcapnav -libpcl1 -libpcre++ -libpdl-io-hdf5-perl -libpdl-io-matlab-perl -libpdl-linearalgebra-perl -libpdl-netcdf-perl -libpeas -libperl-destruct-level-perl -libperl5i-perl -libperlio-eol-perl -libperlio-gzip-perl -libperlio-utf8-strict-perl -libperlx-maybe-xs-perl -libpff -libpfm4 -libpg-hstore-perl -libpg-perl -libpgf -libpgm -libpgplot-perl -libphone-ui-shr -libphone-utils -libphonenumber -libphysfs -libpinyin -libpipeline -libplack-middleware-expires-perl-goto-binaries...> -libplayer -libplist -libpmount -libpng -libpodofo -libpolyclipping -libposix-atfork-perl -libposix-strftime-compiler-perl-goto-binaries.t..> -libposix-strptime-perl -libpostproc -libppd -libppi-xs-perl -libpqtypes -libpqxx -libpreludedb -libpri -libprintsys -libproc-processtable-perl -libproc-wait3-perl -libproxy -libpsl -libpst -libpthread-stubs -libpthread-workqueue -libpulse-java -libpuzzle -libpwiz -libpwquality -libpyzy -libqalculate -libqmi -libquantum -libquazip -libquicktime -libquota-perl -libquvi -libr3 -librabbitmq -libradsec -libranlip -librasterlite -libraw -libraw1394 -librcc -librcd -librcsb-core-wrapper -librdkafka -librdmacm -libreadline-java -libreadonly-perl -libreadonly-xs-perl -librecad -librelp -librep -libreplaygain -libresample -librest -librevenge -librevisa -librime -librostlab-blast -librostlab -librouter-simple-perl -librpcsecgss -librsvg -librsync -librtfcomp -libs3 -libsamplerate -libsane-perl -libsbml -libsbsms -libscalar-list-utils-perl -libscalar-string-perl -libscalar-util-numeric-perl -libscope-upper-perl -libscrypt -libsdl-console -libsdl-perl -libsdl2-gfx -libsdl2-image -libsdl2-mixer -libsdl2-net -libsdl2-ttf -libseccomp -libsecret -libsemanage -libsendmail-milter-perl -libsepol -libsereal-decoder-perl -libsereal-encoder-perl -libserialport -libset-object-perl -libsexy -libsfml -libshairport -libshevek -libshout -libshout-idjc -libshr-glib -libsidplay -libsidplayfp -libsieve -libsigc++-1.2 -libsigc++-2.0 -libsignatures-perl -libsigrok -libsigrokdecode -libsigsegv -libsixel -libskk -libsm -libsmf -libsmi -libsocket-linux-perl -libsocket-msghdr-perl -libsocket-multicast6-perl -libsocket-perl -libsocket6-perl -libsocketcan -libsodium -libsoil -libsolv -libsort-key-perl -libsort-key-top-perl -libsoup2.4 -libspctag -libspectre -libspf2 -libspiro -libspnav -libss7 -libssh -libssh2 -libstatgrab -libstoragemgmt -libstore-opaque-perl -libstrictures-perl -libstring-approx-perl -libstring-compare-constanttime-perl-goto-binari..> -libstring-crc32-perl -libstring-similarity-perl -libstroke -libstrophe -libstxxl -libsub-current-perl -libsub-identify-perl -libsub-name-perl -libsub-prototype-perl -libswe -libsylph -libsynthesis -libsys-cpu-perl -libsys-cpuload-perl -libsys-mmap-perl -libsys-syslog-perl -libsys-utmp-perl -libsys-virt-perl -libsysactivity -libtaint-runtime-perl -libtaint-util-perl -libtar -libtasn1-6 -libtcd -libtcl-perl -libteam -libtecla -libtelnet -libtemplate-perl -libterm-readkey-perl -libterm-readline-gnu-perl -libterm-size-perl -libterm-size-perl-perl -libterm-slang-perl -libterralib -libtest-leaktrace-perl -libtest-mock-guard-perl -libtest-taint-perl -libtest-valgrind-perl -libtext-aspell-perl -libtext-bibtex-perl -libtext-bidi-perl -libtext-charwidth-perl -libtext-chasen-perl -libtext-csv-xs-perl -libtext-hunspell-perl -libtext-iconv-perl -libtext-kakasi-perl -libtext-levenshteinxs-perl -libtext-markdown-discount-perl-goto-binaries.ta..> -libtext-mecab-perl -libtext-ngram-perl -libtext-qrcode-perl -libtext-reflow-perl -libtext-soundex-perl -libtext-unaccent-perl -libtexttools -libtextwrap -libtfbs-perl -libthai -libtheora -libthread-sigmask-perl -libticonv -libtime-hr-perl -libtime-warp-perl -libtime-y2038-perl -libtins -libtirpc -libtk-img -libtk-tablematrix-perl -libtokyocabinet-perl -libtomcrypt -libtommath -libtorrent -libtorrent-rasterbar -libtpl -libtrace3 -libtrain -libtrio -libtritonus-java -libtrue-perl -libtrycatch-perl -libtsm -libtuxcap -libtwin -libtype-tiny-xs-perl -libucimf -libunibreak -libunicode-casefold-perl -libunicode-collate-perl -libunicode-japanese-perl -libunicode-linebreak-perl -libunicode-map-perl -libunicode-map8-perl -libunicode-string-perl -libunicode-utf8-perl -libuninameslist -libuninum -libunique -libunique3 -libunistring -libunix-mknod-perl -libunix-syslog-perl -libunwind -libupnp -libupnp4 -libur-perl -liburcu -liburi-escape-xs-perl -libusb-1.0 -libusb -libusb-java -libusbmuxd -libusbtc08 -libuser -libutempter -libuuid-perl -libuv -libva -libvariable-magic-perl -libvc -libvdpau -libvdpau-va-gl -libversion-perl -libverto -libvformat -libvideo-capture-v4l-perl -libvideo-ivtv-perl -libview -libvigraimpex -libvirt-glib -libvirt -libvirt-php -libvirt-python -libvisca -libvisio -libvistaio -libvisual -libvisual-plugins -libvncserver -libvoikko -libvorbis -libvorbisidec -libvsqlitepp -libwacom -libwant-perl -libwcat1 -libwebcam -libwebp -libwebsockets -libwfut -libwibble -libwnck -libwnck3 -libwnckmm -libwpd -libwpg -libwps -libwww-curl-perl -libwww-youtube-download-perl -libwx-perl -libwx-scintilla-perl -libx11 -libx11-guitest-perl -libx86 -libx86emu -libxau -libxaw -libxc -libxcb -libxcomposite -libxcrypt -libxcursor -libxdamage -libxdg-basedir -libxdmcp -libxext -libxfce4ui -libxfce4util -libxfcegui4 -libxfixes -libxfont -libxi -libxinerama -libxkbcommon -libxkbfile -libxklavier -libxml++2.6 -libxml-bare-perl -libxml-easy-perl -libxml-libxml-perl -libxml-libxslt-perl -libxml-parser-perl -libxml-quote-perl -libxml-rss-libxml-perl -libxml-sax-expatxs-perl -libxml2 -libxmltok -libxmp -libxmu -libxp -libxpm -libxr -libxrandr -libxrender -libxres -libxs -libxs-object-magic-perl -libxsettings-client -libxsettings -libxss -libxtst -libxv -libxvmc -libxxf86dga -libxxf86vm -libyahoo2 -libyaml -libyaml-libyaml-perl -libyaml-syck-perl -libydpdict -libykneomgr -libytnef -libyubikey -libzapojit -libzeitgeist -libzen -libzerg -libzerg-perl -libzeromq-perl -libzhuyin -libzip -libzn-poly -libzorpll -libzrtpcpp -libzypp -licenseutils -licq -liece -lierolibre -lifelines -lifeograph -liggghts -light-locker -lightdm -lightdm-gtk-greeter -lightdm-kde -lightsoff -lightspark -lightspeed -lilv -lilypond -lilyterm -linbox -lincity-ng -lingot -link-grammar -link-monitor-applet -linkchecker -links2 -lintex -linux-atm -linux-ftpd -linux-ftpd-ssl -linux -linux-igd -linux-minidisc -linux-tools -linux-user-chroot -linux-wlan-ng -linuxdcpp -linuxdoc-tools -linuxinfo -linuxlogo -linuxtv-dvb-apps -liquidwar -lisaac -listaller -littler -littlewizard -live-f1 -live-installer -lives -liwc -lksctp-tools -ll-scope -lldpd -llvm-toolchain-3.3 -llvm-toolchain-3.4 -llvm-toolchain-3.5 -lm-sensors -lm4tools -lmarbles -lmdb -lmemory -lmms -lmod -lnav -lnpd -loadlin -loadmeter -loadwatch -lockdev -lockfile-progs -log4c -log4cplus -log4cpp -log4cxx -log4shib -logapp -logfs-tools -logjam -logol -logrotate -logservice -logstalgia -logtool -logtools -logtop -lokalize -loki -lomoco -longomatch -lookup -looptools -loqui -lordsawar -lostirc -loudmouth -lout -love -lowmem -lowpan-tools -lp-solve -lpc21isp -lpctools -lpe -lprng -lrcalc -lrslib -lrzip -lrzsz -lsat -lsdvd -lshw -lskat -lsmbox -lsof -lsscsi -lsyncd -ltpanel -ltrace -ltris -ltrsift -ltsp -ltspfs -lttngtop -lttoolbox -lttv -lua-apr -lua-augeas -lua-bitop -lua-cjson -lua-curl -lua-cyrussasl -lua-dbi -lua-discount -lua-event -lua-expat -lua-filesystem -lua-iconv -lua-ldap -lua-lgi -lua-lpeg -lua-lpty -lua-md5 -lua-posix -lua-rexlib -lua-rings -lua-sec -lua-sql -lua-svn -lua-term -lua-wsapi -lua-yaml -lua-zip -lua-zlib -lua5.1 -lua5.2 -lua50 -luajit -luasocket -lucene++ -luminance-hdr -lunar-date -lunar -lunzip -luola -lurker -lutefisk -luxio -lv -lv2 -lv2dynparam1 -lv2file -lv2proc -lv2vocoder -lvm2 -lwatch -lwipv6 -lwjgl -lwm -lwt -lx-gdb -lxappearance -lxappearance-obconf -lxde-common -lxdm -lxinput -lxlauncher -lxmenu-data -lxml -lxmms2 -lxmusic -lxpanel -lxrandr -lxsession -lxshortcut -lxtask -lxterminal -lynkeos.app -lysdr -lyx -lz4 -lzlib -lzma -lzo2 -lzop -m17n-contrib -m17n-db -m17n-docs -m17n-im-config -m17n-lib -m2300w -m2crypto -m2ext -m2vrequantiser -mac-robber -macchanger -macfanctld -macs -madbomber -madlib -madplay -madwimax -maelstrom -mafft -magic-haskell -magicfilter -magicrescue -magics++ -mah-jong -mail-notification -mailavenger -mailcheck -maildir-filter -maildir-utils -maildrop -mailfilter -mailfront -mailman -mailsync -mailtextbody -mailto -mailutils -main-menu -mairix -maitreya -make-dfsg -makebootfat -makedepf90 -makefs -makehuman -makejvf -makepp -makexvpics -malaga -maloc -man2html -manaplus -mancala -mango-lassi -manpages-tr -mapcache -mapnik -mapsembler2 -maq -maqview -marble -marco -maria -mariadb-client-lgpl -marisa -markupsafe -marsshooter -massxpert -matanza -matchbox-desktop -matchbox-keyboard -matchbox-panel-manager -matchbox-window-manager -mate-applets -mate-backgrounds -mate-control-center -mate-desktop -mate-icon-theme -mate-indicator-applet -mate-media -mate-menus -mate-netbook -mate-netspeed -mate-notification-daemon -mate-panel -mate-polkit -mate-power-manager -mate-screensaver -mate-sensors-applet -mate-session-manager -mate-settings-daemon -mate-system-monitor -mate-system-tools -mate-terminal -mate-themes -mate-utils -mathgl -mathomatic -mathtex -mathwar -matplotlib -matroxset -maude -mawk -maxima -maximus -mayavi2 -mboxgrep -mbt -mbtserver -mbuffer -mbw -mc -mcabber -mcelog -mcl -mclibs -mcmcpack -mcpp -mcrl2 -mcron -md5deep -mdbtools -mdbus -mdetect -mdf2iso -mdk -mdm -mdns-scan -me-tv -meanwhile -mecab -media-ctl -mediainfo -mediatomb -mediawiki2latex -medit -mednafen -medusa -meep -meep-lam4 -meep-mpi-default -meep-mpich2 -meep-openmpi -megaglest-data -megaglest -megatools -meliae -melting -memcached -memcachedb -memchan -memdump -memphis -memstat -memtester -mensis -menu-cache -menu -mercator -mercurial -mergelog -mesa-demos -meschach -meshlab -mess-desktop-entries -metacity -metapixel -metar -metastore -metatheme-gilouche -meterbridge -meterec -metis -metview -mew-beta -mew -mftrace -mgcv -mgdiff -mgt -mhc -mhddfs -mhwaveedit -mia -mialmpick -miaviewit -micro-httpd -micro-inetd -micro-proxy -microbiomeutil -microcom -microdc2 -midgard2-core -midish -mighttpd2 -mikmod -milkytracker -milter-greylist -mimedefang -mimelib1 -mimetex -mimetic -min12xxw -minbif -minetest -mingetty -mingw-ocaml -mini-httpd -mini18n -minicom -minidjvu -minimodem -minisapserver -minissdpd -ministat -minit -miniupnpc -miniupnpd -minizip -minpack -mira -mirage -miredo -miro -mirrormagic -missidentify -missingh -mixmaster -mixxx -mkcue -mkelfimage -mknbi -mksh -mktorrent -mkvtoolnix -mldemos -mlgmp -mlmmj -mlocate -mlpack -mlpcap -mlpy -mlton -mlv-smile -mm -mm3d -mmass -mmdb -mmorph -mmpong -mmtk -mmv -moblin-gtk-engine -moblin-menus -mobyle -moc -mod-authn-webid -mod-authnz-persona -mod-authz-securepass -mod-dnssd -mod-gearman -mod-gnutls -mod-mime-xattr -mod-mono -mod-proxy-msrpc -mod-vhost-ldap -mod-wsgi -modem-cmd -modem-manager-gui -modglue -modplugtools -modsecurity-apache -modules -mokomaze -mokutil -mon -mona -monav -mongodb -monit -monkeystudio -mono-fuse -mono-tools -monopd -monotone-viz -monster-masher -monsterz -moodbar -moon-buggy -moon-lander -moonshot-gss-eap -moonshot-trust-router -moonshot-ui -mooproxy -mopac7 -moreutils -morla -morris -morse-simulator -morse2ascii -morsegen -mosh -mosquitto -most -motif -motion -mountall -mountpy -mouseemu -mousepad -mousetrap -mousetweaks -movit -mozjs -mozjs17 -mozjs24 -mozo -mozplugger -mp -mp3blaster -mp3fs -mp3info -mp3rename -mp3splt -mp3wrap -mp4h -mp4v2 -mpage -mpb -mpc -mpc123 -mpclib3 -mpd -mpdcon.app -mpdcron -mpdecimal -mpdris2 -mpdscribble -mpeg2dec -mpegdemux -mpfi -mpfr4 -mpg123 -mpi4py -mpich -mplayerthumbs -mpm-itk -mpop -mppenc -mpqc -mpt-status -mrbayes -mriconvert -mrmpi -mrpt -mrtg -mrtgutils -mruby -mrxvt -mscgen -mscompress -msgpack -msktutil -msmtp -msr-tools -msrtool -mssh -mstflint -mswatch -mt-st -mtasc -mtbl -mtd-utils -mtdev -mtpaint -mtr -mtx -muddleftpd -mudita24 -muffin -multiboot -multicat -multimon -multitee -multiwatch -mumble -mummer -mummy -mumps -mumudvb -munge -munin-c -muparser -mupen64plus-audio-sdl -mupen64plus-core -mupen64plus-input-sdl -mupen64plus-rsp-hle -mupen64plus-ui-console -mupen64plus-video-glide64 -mupen64plus-video-glide64mk2 -mupen64plus-video-rice -mupen64plus-video-z64 -muroar -muroard -muse -museek+ -musescore -music -musl -mutter -muttprint -mvtnorm -mwrap -mx -mxallowd -mxml -mydumper -mygui -myodbc -mypaint -myproxy -myrescue -mysecureshell -myspell -mysql++ -mysql-connector-c++ -mysql-ocaml -mysql-workbench -mysqltcl -mysqmail -mythes -mythtvfs-fuse -n2n -nacl -nagios-nrpe -nagios-plugins-contrib -nagios3 -nagircbot -nailgun -nam -namazu2 -nano -nanomsg -nas -nasm -naspro-bridge-it -naspro-bridges -naspro-core -nast -nasty -nat -nautic -nautilus-actions -nautilus-filename-repairer -nautilus -nautilus-image-converter -nautilus-open-terminal -nautilus-python -nautilus-sendto -nautilus-share -nautilus-wipe -nbd -nbdkit -nbibtex -nbtscan -nc6 -ncap -ncbi-blast+ -ncbi-seg -ncbi-tools6 -ncdt -ncdu -ncmpc -ncmpcpp -nco -ncompress -nd -ndisc6 -ndiswrapper -ndoutils -ndpi -ne -neard -nec -nec2c -nedit -neko -nekobee -nemiver -nemo-fileroller -nemo -neon27 -nepomuk-core -nepomuk-widgets -nestopia -net-acct -net-tools -net6 -netatalk -netcat -netcat-openbsd -netcf -netcfg -netdiag -netdiscover -netexpect -nethogs -netifaces -netkit-bootparamd -netkit-ftp -netkit-ftp-ssl -netkit-ntalk -netkit-rsh -netkit-rusers -netkit-rwall -netkit-rwho -netkit-telnet -netkit-telnet-ssl -netkit-tftp -netmask -netmate -netmrg -netperfmeter -netpipe -netpipes -netqmail -netrek-client-cow -netrik -netris -netrw -netsed -netselect -netspeed -netstat-nat -netsurf -nettle -nettoe -netw-ib-ox-ag -network-console -network-manager-applet -network-manager-iodine -network-manager-openconnect -network-manager-openvpn -network-manager-pptp -network-manager-strongswan -network-manager-vpnc -neverball -newlib -newmat -newpid -nexus -nfacct -nfft -nflog-bindings -nfqueue-bindings -nfs-utils -nfs4-acl-tools -nfswatch -nftables -ng -ng-utils -ngetty -nghttp2 -nginx -ngircd -ngraph-gtk -ngrep -nickle -nicstat -nield -nifti2dicom -nifticlib -nikwi -nilfs-tools -ninja -ninvaders -nip2 -nipy -nis -nitpic -nitrogen -njam -nkf -nlme -nload -nlopt -nmap -nmapsi4 -nmh -nmon -nmzmail -nocache -nodau -node -nodejs -nodm -noiz2sa -nomarch -nomnom -nordugrid-arc -normalize-audio -notebook -notification-daemon -notify-osd -novena-eeprom -noweb -npapi-vlc -npth -nqp -nrg2iso -nrss -ns3 -nsca -nsca-ng -nsd -nsis -nslint -nsnake -nspr -nss-mdns -nss-pam-ldapd -nss-passwords -nss-updatedb -nted -ntfs-config -ntl -ntop -ntopng -ntp -ntpstat -ntrack -nuapplet -nullidentd -nullmailer -numactl -numdiff -numlockx -numptyphysics -nut-nutrition -nuttcp -nvi -nvidia-modprobe -nvidia-settings-legacy-304xx -nvidia-texture-tools -nvidia-xconfig -nvram-wakeup -nvramtool -nvtv -nwall -nwipe -nwrite -nx-libs-lite -nxcl -nyancat -o3dgc -oar -oasis3 -obby -obconf -obdgpslogger -obex-data-server -obexd -obexfs -obexftp -obexpushd -objcryst-fox -obsession -ocaml-alsa -ocaml-ao -ocaml-bitstring -ocaml-bjack -ocaml-cry -ocaml-ctypes -ocaml-curses -ocaml-dbus -ocaml-dssi -ocaml-dtools -ocaml-duppy -ocaml-expat -ocaml-extunix -ocaml-faad -ocaml-fdkaac -ocaml-flac -ocaml-frei0r -ocaml-gavl -ocaml-gettext -ocaml -ocaml-gstreamer -ocaml-inotify -ocaml-ladspa -ocaml-lame -ocaml-lastfm -ocaml-libvirt -ocaml-lo -ocaml-mad -ocaml-magic -ocaml-mm -ocaml-ogg -ocaml-opus -ocaml-portaudio -ocaml-pulseaudio -ocaml-reins -ocaml-samplerate -ocaml-schroedinger -ocaml-sha -ocaml-shine -ocaml-shout -ocaml-soundtouch -ocaml-speex -ocaml-sqlite3 -ocaml-ssl -ocaml-taglib -ocaml-text -ocaml-theora -ocaml-usb -ocaml-voaacenc -ocaml-vorbis -ocaml-xmlplaylist -ocaml-zarith -ocamlagrep -ocamlbricks -ocamlgsl -ocamlnet -ocamlodbc -ocamlpam -ocamlsdl -oce -ocfs2-tools -ocp -ocp-indent -ocproxy -ocrfeeder -ocsinventory-agent -octave -octomap -ocurl -ode -odt2txt -oflib -ofono -ogamesim -oggfwd -oggvideotools -ogmtools -ogre-1.8 -ogre-1.9 -ohcount -ois -okteta -okular -ola -olpc-kbdshim -olpc-powerd -olsrd -omake -omega-rpg -omhacks -omins -omnievents -omniorb-dfsg -ompl -oneko -onesixtyone -onioncat -ontv -oolite -opam -opari -opari2 -open-axiom -open-cobol -open-invaders -open-jtalk -openais -openal-soft -openambit -openarena-085-data -openarena-088-data -openarena-data -openbabel -openblas -openbox -openbox-menu -openbsd-inetd -opencaster -opencc -opencity -openclonk -opencolorio -openconnect -opencore-amr -openct -openctm -opendkim -opendmarc -opendnssec -openexr -openexr-viewers -openfetion -openigtlink -openimageio -openjade -openjade1.3 -openjdk-7-jre-dcevm -openjfx -openjpeg -openjpeg2 -openlayer -openlibm -openload -openlugaru -openms -openntpd -openpref -openr2 -openrpt -opensaml2 -opensc -openscad -openscap -openscenegraph -openslide -opensm -opensp -openspecfun -openssl -openteacher -openuniverse -openvanilla-modules -openvpn-auth-ldap -openvpn -openvrml -openwince-include -openwince-jtag -openyahtzee -ophcrack -opt -optipng -opus -opus-tools -opusfile -orafce -orbit2 -orbital-eunuchs-sniper -orc -oregano -original-awk -oroborus -orpie -orthanc -orville-write -osdclock -osdsh -osgearth -osm-gps-map -osm2pgsql -osmctools -osmo -osptoolkit -oss-preserve -ossim -ossp-uuid -osspd -osspsa -otcl -otf -otf2bdf -otp -otpw -ots -outguess -ovirt-guest-agent -ovito -owfs -oxygen-gtk3 -oxygencursors -p0f -p11-kit -p7zip -p910nd -pacemaker -pachi -packagekit-qt -packeth -packit -pacman4console -paco -pacparser -padevchooser -padre -pads -pagodacf -pairs -pajeng -pal -palapeli -palbart -palo -palp -pam-dbus -pam-geoip -pam -pam-krb5-migrate -pam-mysql -pam-p11 -pam-pgsql -pam-pkcs11 -pam-python -pam-shield -pam-tmpdir -paman -pamtester -pan -pandas -pandoc -pandora-build -pangomm -pangox-compat -pantomime1.2 -paperkey -papi -paprefs -paps -papyrus -par -par2cmdline -paraview -parcellite -parchive -pari -paris-traceroute -parley -parmap -parole -parprouted -parrot -parser -parser-mysql -partclone -parted -partimage -partitionmanager -partman-base -partman-crypto -pasco -passepartout -passwdqc -pasystray -patch -patchelf -patchutils -pathogen -pathological -pavucontrol -pavuk -pavumeter -pax-britannica -pax -pax-utils -paxctl -pbs-drmaa -pcal -pcapfix -pcaputils -pcb2gcode -pccts -pciutils -pcl -pcmanfm -pcmanx-gtk2 -pcmciautils -pconsole -pcre-ocaml -pcre3 -pcsc-cyberjack -pcsc-lite -pcsc-perl -pcsc-tools -pd-arraysize -pd-aubio -pd-bassemu -pd-beatpipe -pd-boids -pd-bsaylor -pd-chaos -pd-comport -pd-cxc -pd-cyclone -pd-earplug -pd-ekext -pd-ext13 -pd-fftease -pd-flite -pd-freeverb -pd-ggee -pd-hcs -pd-hid -pd-iemambi -pd-iemlib -pd-iemmatrix -pd-iemnet -pd-libdir -pd-lua -pd-lyonpotpourri -pd-markex -pd-maxlib -pd-mjlib -pd-moonlib -pd-motex -pd-osc -pd-pddp -pd-pdogg -pd-pdstring -pd-plugin -pd-pmpd -pd-sigpack -pd-smlib -pd-unauthorized -pd-vbap -pd-wiimote -pd-windowing -pd-zexy -pdf-presenter-console -pdf2djvu -pdf2htmlex -pdf2svg -pdfcrack -pdfcube -pdfgrep -pdfmod -pdfresurrect -pdl -pdlzip -pdmenu -pdns -pdns-recursor -pdnsd -pdsh -pebl -pecomato -peg -pegasus-wms -pegsolitaire -pekwm -pen -pencil2d -penguin-command -pennmush -pente -pentobi -pepper -perceptualdiff -percona-xtradb-cluster-galera-2.x-goto-binaries..> -perforate -performous -perftest -perl-byacc -perl -perl4caml -perlipq -petri-foo -petris -pev -pexec -pfb2t1c2pfb -pfqueue -pfstmo -pfstools -pg-comparator -pg-reorg -pgadmin3 -pgagent -pgapack -pgbouncer -pgdbf -pgespresso -pgextwlist -pgfincore -pgmemcache -pgn-extract -pgn2web -pgpdump -pgpgpg -pgreplay -pgrouting -pgsql-asn1oid -pgtcl -pgtop -phalanx -phasex -phnxdeco -phonefsod -phoneui-apps -phoneuid -phonon-backend-gstreamer -phonon-backend-vlc -phonon -photopc -photoprint -php-adodb -php-apcu -php-gearman -php-geoip -php-gnupg -php-horde-lz4 -php-igbinary -php-imagick -php-imlib -php-json -php-memcached -php-mongo -php-msgpack -php-mysqlnd-ms -php-oauth -php-pinba -php-propro -php-radius -php-raphf -php-redis -php-rrd -php-solr -php-ssh2 -php-stomp -php-svn -php-tokyo-tyrant -php-yac -php-zmq -phylip -phyml -pianobar -pianobooster -picard -picmi -picocom -picolisp -picosat -picviz -pida -pidentd -pidgin-audacious -pidgin-awayonlock -pidgin-blinklight -pidgin-encryption -pidgin-extprefs -pidgin-festival -pidgin-gmchess -pidgin -pidgin-hotkeys -pidgin-latex -pidgin-libnotify -pidgin-librvp -pidgin-mpris -pidgin-mra -pidgin-nateon -pidgin-openfetion -pidgin-otr -pidgin-privacy-please -pidgin-sipe -pidgin-skype -pidgin-twitter -pigment -pigment-python -pigz -pillow -pilot-link -pinball -pinentry -pinentry-x2go -pinfo -pingus -pinot -pinpoint -pinta -pion -pioneers -pipebench -pipemeter -pipewalker -pitivi -pixelize -pixman -pixmap -pixz -pjproject -pkcs11-data -pkcs11-dump -pkcs11-helper -pkg-config -pkg-kde-tools -pkgconf -pktools -pktstat -plainbox-provider-checkbox -plainbox-provider-resource-generic-goto-binarie..> -plan -planner -plasma-nm -plasma-widget-adjustableclock-goto-binaries.tar..> -plasma-widget-cwp -plasma-widget-fastuserswitch -plasma-widget-menubar -plasma-widget-message-indicator-goto-binaries.t..> -plasma-widget-smooth-tasks -plasma-widget-yawp -plastimatch -plee-the-bear -plib -ploop -plotdrop -ploticus -plotutils -plptools -plr -pluma -plymouth -pm-utils -pmccabe -pmidi -pmk -pmount -pms -pmw -pmx -png23d -png2html -pngcheck -pngcrush -pnglite -pngmeta -pngnq -pngphoon -pngquant -pngtools -pnm2ppa -pnp4nagios -pnscan -poa -poc-streamer -pocketsphinx -pocl -poco -poe.app -poedit -polari -polarssl -poldi -policycoreutils -policykit-1-gnome -policykit-1 -polipo -polkit-kde-1 -polkit-qt-1 -polspline -polybori -polyglot -polylib -polyml -polyorb -pommed -pong2 -popa3d -poppassd -poppler -popt -populations -portabase -portaudio19 -portmidi -portreserve -portsentry -portsmf -posh -postal -poster -posterazor -postfix-gld -postfix -postgis -postgresql-9.1 -postgresql-9.3 -postgresql-9.4 -postgresql-debversion -postgresql-filedump -postgresql-hll -postgresql-multicorn -postgresql-ocaml -postgresql-pgmp -postgresql-pllua -postgresql-plsh -postgresql-prioritize -postmark -postpone -postr -potool -potrace -pound -povray -powerdebug -powerline -powerman -powermanga -powerstat -powertop -powstatd -poxml -pp-popularity-contest -ppl -pps-tools -pptp-linux -pptpd -pqiv -praat -prayer -prctl -prefix -prelink -preload -prelude-lml -premake4 -preprepare -prerex -presage -pretzel -price.app -prima -prime-phylo -primer3 -print-manager -printfilters-ppd -prips -prison -pristine-tar -privbind -privoxy -probabel -procenv -procinfo -procmail -procmeter3 -procserv -prodigal -proftmb -proftpd-mod-autohost -proftpd-mod-case -proftpd-mod-dnsbl -proftpd-mod-fsync -proftpd-mod-msg -proftpd-mod-tar -projectm -propellor -prosody -protobuf-c -protobuf -proxsmtp -proxy-suite -proxychains -proxycheck -proxytunnel -prt -ps2eps -psad -pscan -psensor -psi -psi-plus -psi4 -psicode -psignifit -psimedia -pslib -psmisc -psocksxx -pspresent -psqlodbc -pstack -pstoedit -pstotext -psurface -psutils -psychtoolbox-3 -psycopg2 -pth -ptouch-driver -ptpd -ptunnel -publib -puf -pugixml -pugl -pulseview -pump -pumpa -pure-ftpd -puredata-import -purelibc -purity -putty -pvrg-jpeg -pwauth -pwgen -pxe -pxe-kexec -pxlib -pxljr -pxsl-tools -pxz -py-postgresql -py-radix -py3cairo -pyalsaaudio -pyao -pyatspi -pybloomfiltermmap -pybluez -pycairo -pycaml -pycangjie -pychm -pycryptopp -pycurl -pyepl -pyepr -pyfai -pyfftw -pyfits -pyfribidi -pygame -pygdchart2 -pygobject-2 -pygobject -pygoocanvas -pygpgme -pygpiv -pygresql -pygrib -pygtk -pygtksourceview -pygts -pyhunspell -pykaraoke -pykcs11 -pykdtree -pykerberos -pyliblo -pylibmc -pylibssh2 -pylibtiff -pylirc -pymad -pymc -pymca -pyme -pymilter -pymol -pymongo -pymssql -pymtbl -pymvpa -pymvpa2 -pynac -pynfft -pynifti -pyode -pyogg -pyopenssl -pyoperators -pyorbit -pyparted -pypoker-eval -pyprotocols -pypy -pyqt5 -pyrenamer -pyrit -pyrit-opencl -pyrite-publisher -pyscanfcs -pyscard -pysendfile -pyside -pyside-tools -pysmbc -pysparse -pyspatialite -pystemmer -pysubnettree -pytables -python-admesh -python-adns -python-apsw -python-astropy -python-bcrypt -python-bibtex -python-biggles -python-biom-format -python-biopython -python-bitarray -python-bsddb3 -python-caja -python-casmoothing -python-cddb -python-cffi -python-chaco -python-cjson -python-clamav -python-clips -python-cogent -python-coverage -python-cpl -python-crypto -python-cryptography -python-cups -python-daap -python-demgengeo -python-djvulibre -python-dmidecode -python-edbus -python-enet -python-ethtool -python-fabio -python-falcon -python-fontconfig -python-fuse -python-gd -python-geoip -python-gevent -python-gitdb -python-gmpy -python-gmpy2 -python-gnatpython -python-gnutls -python-greenlet -python-gtkglext1 -python-gudev -python-hiredis -python-http-parser -python-jswebkit -python-kinterbasdb -python-krbv -python-ldap -python-levenshtein -python-libdiscid -python-libpcap -python-lightblue -python-llfuse -python-lz4 -python-lzma -python-lzo -python-memprof -python-mhash -python-misaka -python-mysqldb -python-neuroshare -python-nids -python-nss -python-numpy -python-omniorb -python-osd -python-pam -python-passfd -python-persistent -python-phoneutils -python-poppler -python-posix-ipc -python-pqueue -python-prctl -python-psutil -python-pyalsa -python-pyaudio -python-pygraphviz -python-pylibacl -python-pyo -python-pypcap -python-pypm -python-pysam -python-pyscss -python-pysqlite1.1 -python-pysqlite2 -python-pytc -python-pywcs -python-pyxattr -python-pyxenstore -python-qrencode -python-qt4 -python-regex -python-reportlab -python-scientific -python-scipy -python-scrypt -python-setproctitle -python-shapely -python-shogun -python-smbpasswd -python-snappy -python-sqlite -python-srp -python-ssdeep -python-stdlib-extensions -python-sysv-ipc -python-tcpwrap -python-thrift -python-tornado -python-traits -python-unac -python-unshare -python-utmp -python-visual -python-wrapt -python-xattr -python-xdo -python-xklavier -python-yenc -python2.7 -python3-stdlib-extensions -python3.4 -pythonmagick -pythonqt -pythontracer -pytone -pyusb -pyvorbis -pywavelets -pywebkitgtk -pyx -pyx3 -pyxmpp -pyxplot -pyyaml -pyzmq -q4wine -qalculate-gtk -qapt -qastools -qcomicbook -qdacco -qdbm -qedje -qfits -qgis -qhull -qiime -qimageblitz -qimhangul -qingy -qiv -qjackctl -qjson -qlandkartegt -qliss3d -qlvnictools -qmapshack -qmenu -qmidiarp -qmidinet -qmidiroute -qmmp -qmpdclient -qmtest -qof -qonk -qpdf -qpdfview -qpid-proton -qprint -qpxtool -qqwing -qrencode -qrisk2 -qrouter -qsampler -qsapecng -qstat -qsynth -qt-gstreamer -qt4-perl -qtads -qtbase-opensource-src -qtcreator -qtemu -qterm -qthid-fcd-controller -qtimageformats-opensource-src-goto-binaries.tar..> -qtiplot -qtkeychain -qtm -qtmultimedia-opensource-src -qtoctave -qtop -qtractor -qtruby -qtwebkit -qtwebkit-opensource-src -qtzeitgeist -quadprog -quadrapassel -quadrule -quantlib -quantlib-swig -quarry -quassel -quesoglc -quickfix -quickplot -quicksynergy -quisk -quitcount -quixote -quixote1 -quota -quvi -qwbfsmanager -qwo -qwtplot3d -qzion -r-bioc-affy -r-bioc-affyio -r-bioc-biobase -r-bioc-biostrings -r-bioc-biovizbase -r-bioc-edger -r-bioc-genomicalignments -r-bioc-genomicranges -r-bioc-graph -r-bioc-hilbertvis -r-bioc-iranges -r-bioc-limma -r-bioc-makecdfenv -r-bioc-preprocesscore -r-bioc-rsamtools -r-bioc-rtracklayer -r-bioc-shortread -r-bioc-snpstats -r-bioc-variantannotation -r-bioc-xvector -r-cran-amore -r-cran-ape -r-cran-base64enc -r-cran-bayesm -r-cran-bbmisc -r-cran-boolnet -r-cran-catools -r-cran-checkmate -r-cran-class -r-cran-colorspace -r-cran-cubature -r-cran-deal -r-cran-digest -r-cran-dosefinding -r-cran-e1071 -r-cran-eco -r-cran-ecodist -r-cran-energy -r-cran-epi -r-cran-evd -r-cran-expm -r-cran-gam -r-cran-genabel -r-cran-gsl -r-cran-gss -r-cran-haplo.stats -r-cran-hdf5 -r-cran-int64 -r-cran-lpsolve -r-cran-maldiquant -r-cran-mapdata -r-cran-mapproj -r-cran-maps -r-cran-maptools -r-cran-mass -r-cran-matrixstats -r-cran-medadherence -r-cran-mixtools -r-cran-mnp -r-cran-msm -r-cran-ncdf4 -r-cran-nloptr -r-cran-nnet -r-cran-polycub -r-cran-pscl -r-cran-qtl -r-cran-quantreg -r-cran-randomforest -r-cran-rcurl -r-cran-rjags -r-cran-rjson -r-cran-rnetcdf -r-cran-rniftilib -r-cran-rsclient -r-cran-rsqlite -r-cran-slam -r-cran-sp -r-cran-spatial -r-cran-spc -r-cran-surveillance -r-cran-testthat -r-cran-tgp -r-cran-truncnorm -r-cran-vegan -r-cran-vgam -r-other-mott-happy -r-zoo -rabbyt -radeontool -radeontop -radioclk -radiusclient-ng -radsecproxy -radvd -ragel -raidutils -raincat -rakarrack -rakudo -ramond -rancid -randomize-lines -randomsound -randtype -rapidsvn -raptor -raptor2 -rarcrack -rarpd -rasmol -raspell -rasqal -raster3d -rat -ratbox-services -rate4site -ratfor -ratmenu -ratpoison -ratproxy -rawtherapee -raxml -razor -razorqt -rblcheck -rbootd -rc -rcmdr -rcs -rdate -rdd -rdfind -rdiff-backup-fs -rdiff-backup -rdkit -re2c -read-edid -readahead-fedora -readline5 -readline6 -readosm -realmd -realpath -realtimebattle -reaver -recite -recode -recoll -reconserver -recordmydesktop -recoverdm -recoverjpeg -recutils -redir -redis -redland-bindings -redland -redshift -redshift-plasmoid -redsocks -ree -refdb -referencer -refpolicy -regexxer -regina-normal -regina-rexx -regionset -reglookup -reinteract -reiserfsprogs -relion -remake -remctl -remind -remmina -remote-tty -renameutils -renattach -renpy -rep-gtk -rephrase -repmgr -repsnapper -reptyr -resample -resiprocate -restartd -revelation -rexima -rfc5766-turn-server -rfdump -rfkill -rfoo -rgbpaint -rgl -rglpk -rgxg -rhash -rheolef -rhnsd -rhythmbox -ri-li -riemann-c-client -rifiuti -rifiuti2 -rinetd -ripmime -ripole -ristretto -rivet -rjava -rkward -rlinetd -rlog -rlpr -rlvm -rlwrap -rman -rmatrix -rmilter -rmpi -rmysql -rnahybrid -rng-tools -roaraudio -roarplaylistd -roboptim-core -robotfindskitten -robustbase -rockdodger -rocs -rodbc -rofs-fuse -roger-router -rolldice -root-system -root-tail -rootskel -rosegarden -rotix -rott -rotter -routino -rovclock -rox -roxterm -rp-pppoe -rpart -rpcbind -rpm -rpm2html -rpy -rpy2 -rrdcollect -rrdtool -rrep -rrootage -rs -rserve -rsibreak -rspamd -rsprng -rsrce -rss-glx -rss2irc -rssh -rsstail -rstatd -rsymphony -rt-app -rt-tests -rtaudio -rtfilter -rtkit -rtl-sdr -rtmidi -rtmpdump -rtorrent -rtpproxy -rubberband -ruby-atomic -ruby-augeas -ruby-bcrypt -ruby-bdb -ruby-blockenspiel -ruby-bluecloth -ruby-bson-ext -ruby-cairo -ruby-charlock-holmes -ruby-curb -ruby-dataobjects-mysql -ruby-dataobjects-postgres -ruby-dataobjects-sqlite3 -ruby-eb -ruby-escape-utils -ruby-exif -ruby-fast-stemmer -ruby-fast-xs -ruby-fcgi -ruby-ferret -ruby-ffi -ruby-fftw3 -ruby-filesystem -ruby-fusefs -ruby-gd -ruby-gherkin -ruby-globalhotkeys -ruby-gnome2 -ruby-god -ruby-gpgme -ruby-grib -ruby-gsl -ruby-hdfeos5 -ruby-hiredis -ruby-hitimes -ruby-http-parser.rb -ruby-inotify -ruby-json -ruby-kgio -ruby-lapack -ruby-ldap -ruby-levenshtein -ruby-libvirt -ruby-libxml -ruby-mkrf -ruby-mpi -ruby-msgpack -ruby-multibitnums -ruby-multimap -ruby-mysql -ruby-mysql2 -ruby-narray -ruby-ncurses -ruby-netcdf -ruby-nfc -ruby-nio4r -ruby-nokogiri -ruby-odbc -ruby-oily-png -ruby-oj -ruby-ox -ruby-passenger -ruby-password -ruby-patron -ruby-pcaprub -ruby-pg -ruby-pgplot -ruby-posix-spawn -ruby-raindrops -ruby-rdiscount -ruby-redcarpet -ruby-redcloth -ruby-rinku -ruby-rjb -ruby-rmagick -ruby-rpatricia -ruby-sdl -ruby-sequel-pg -ruby-serialport -ruby-shadow -ruby-sigar -ruby-sqlite3 -ruby-standalone -ruby-taglib2 -ruby-termios -ruby-tokyocabinet -ruby-uconv -ruby-unicode -ruby-version-sorter -ruby-xmlparser -ruby-yajl -ruby-zoom -rudecgi -ruli -runawk -rungetty -runlim -rxp -rxtx -rxvt -rxvt-unicode -rzip -s2tc -s3d -s3ql -s51dude -sa-exim -sac -safe-hole-perl -safecopy -saga -sagasu -sage -sailcut -saint -sakura -salome-kernel -samdump2 -samplv1 -samtools -samtools-legacy -sanduhr -sane-backends-extras -sane-backends -sane-frontends -sanlock -saods9 -sarg -sash -sawfish -saytime -sbc -sbcl -sblim-wbemcli -sbnc -sbox-dtc -sbrsh -sc -scalapack -scalc -scalpel -scamper -scanbd -scanbuttond -scanlogd -scanmem -scanssh -scantailor -scantool -scgi -schedtool -scheme9 -schism -schroedinger -schroot -scid -scim-anthy -scim-chewing -scim -scim-kmfl-imengine -scim-pinyin -scim-skk -scim-tables -scim-thai -scim-unikey -sciplot -sciscipy -scite -sciteproj -scm -scorched3d -scottfree -scratchbox2 -screen-message -screentest -scribus -scrot -scrounge-ntfs -scrub -scrypt -scscp-imcce -scsitools -scute -sdate -sdcv -sdformat -sdl-image1.2 -sdl-mixer1.2 -sdl-net1.2 -sdl-sound1.2 -sdl-stretch -sdl-ttf2.0 -sdlbasic -sdlgfx -sdlpango -sdop -sdpa -sdparm -sdrangelove -seabios -seahorse -seahorse-nautilus -searchandrescue -searchmonkey -seaview -seccure -secure-delete -sed -see -seekwatcher -sendfile -sendip -sensors-applet -sentinella -seq24 -seqan -seqtk -ser2net -serd -serf -service-wrapper-java -setcd -setserial -sextractor -sfftobmp -sflphone -sfront -sg3-utils -sgabios -sgf2dg -sgrep -sgt-puzzles -shadow -shapelib -shapetools -shared-mime-info -sharutils -shc -shed -sheepdog -shell-fm -shellcheck -shellex -shellinabox -shelltestrunner -shelxle -shhmsg -shhopt -shibboleth-resolver -shibboleth-sp2 -shiboken -shine -shishi -shntool -shogivar -shogun -shotdetect -shotwell -sibsim4 -sic -sidplay -sidplay-libs -siege -sigma-align -signing-party -sigrok-cli -sigscheme -silan -silentjack -silgraphite2.0 -silly -silo-llnl -silversearcher-ag -sim4 -simage -simbody -simhash -similarity-tester -simple-scan -simple-tpm-pk11 -simpleburn -simplejson -simpleparse -simpleproxy -simulavr -since -sineshaper -sinfo -sip-tester -sip4 -sipcalc -sipcrack -sipsak -sipwitch -sipxtapi -siril -siscone -sispmctl -sitecopy -skalibs -skanlite -sketch -skimage -skinedit -skipfish -skksearch -skktools -skrooge -sks-ecc -sks -skstream -skycat -skytools3 -sl -slang2 -slapi-nis -slcfitsio -slcurl -sleepd -sleepenh -sleuthkit -slexpat -slgdbm -slgsl -slhist -slic3r -slim -slimevolley -slmon -sloccount -slowhttptest -slpvm -slrn -slrnface -slsqlite -sludge -slurm-drmaa -slurm -slv2 -slwildcard -slxfig -sm-archive -sm -sma -smalt -smart -smartlist -smartmontools -smb4k -smbnetfs -smc -smcroute -smem -smemstat -smlnj -smokegen -smokekde -smokeping -smokeqt -smp-utils -smpeg -smsclient -smstools -smuxi -snacc -snake4 -snap -snappea -snapper -snappy -snappy-player -snarf -snd -sndfile-tools -sndobj -sng -sniffit -snimpy -snmpkit -snmptrapfmt -snooper -snoopy -snowball -snowdrop -snp-sites -sntop -so-synth-lv2 -soapdenovo -soapdenovo2 -sobby -socat -socket++ -socket -socklog -sockstat -socnetv -softflowd -softhsm -sogo -solarpowerlog -solfege -solid-pop3d -sombok -sonata -sonic -sonic-visualiser -sooperlooper -sope -soprano -sopwith -soqt -sord -sortmail -sound-juicer -sound-theme-freedesktop -soundconverter -soundkonverter -soundmodem -soundscaperenderer -soundtouch -source-highlight -sox -soya -sp-gxmlcpp -spacearyarya -spacefm -spacenavd -spacezero -spamass-milter -spamassassin -spamprobe -spark -sparsehash -sparskit -spass -spatialindex -spatialite -spatialite-gui -spatialite-tools -spawn-fcgi -spd -spectemu -spectools -spectrwm -speech-dispatcher -speech-tools -speechd-up -speedcrunch -speex -spell -spellutils -spew -spherepack -sphinxbase -spice -spice-gtk -spice-vdagent -spice-xpi -spim -spinner -spiped -splash -splat -splay -spline -spooles -spotlighter -spout -spring -springlobby -sqcwa -sqlalchemy -sqlcipher -sqlheavy -sqlite -sqlite3 -sqlitebrowser -sqliteodbc -sqsh -squeak-plugins-scratch -squeezelite -squid3 -squidguard -squidview -squishyball -squizz -sra-sdk -sratom -src2tex -srecord -sredird -srf -srg -srm-ifce -srptools -srtp -ssdeep -ssed -ssh-askpass-fullscreen -ssh-askpass -ssh-contact -sshfs-fuse -sshguard -sshm -sshpass -ssldump -sslh -sslscan -sslsniff -ssm -ssmping -ssmtp -sssd -ssss -ssvnc -st -staden-io-lib -stalin -stalonetray -stardata-common -stardict -stardict-tools -starlink-ast -starlink-pal -starplot -startpar -startup-notification -starvoyager -statserial -stax -stdsyslog -steadyflow -steghide -stegsnow -stellarium -step -stfl -stimfit -stk -stm32flash -stoken -stone -stopmotion -storm -stress -stress-ng -stressapptest -stretchplayer -strigi -stringencoders -stterm -stud -stx-btree -styx -subcommander -subnetcalc -subsurface -subtitlecomposer -subtitleeditor -subtle -subunit -subversion -subvertpy -suck -suckless-tools -sucrack -sudo -sudoku -sugar-0.96 -sugar-0.98 -sugar-artwork-0.84 -sugar-artwork-0.88 -sugar-artwork-0.96 -sugar-artwork-0.98 -sugar-base-0.84 -sugar-base-0.88 -sugar-base-0.96 -sugar-base-0.98 -sugar-datastore-0.84 -sugar-datastore-0.88 -sugar-datastore-0.96 -sugar-datastore-0.98 -sugar-toolkit-0.84 -sugar-toolkit-0.88 -sugar-toolkit-0.96 -sugar-toolkit-0.98 -sugar-toolkit-gtk3 -suil -suitesparse -suitesparse-metis -summain -sumo -sundials -sunpinyin -sunxi-tools -sup -super -supercat -supercollider -superiotool -superkaramba -superlu -supermin -supertux -supertuxkart -surf -survex -survival -sushi -svgpart -svrcore -swac-explore -swac-get -swami -swapspace -swath -swe-standard-data -sweep -sweeper -swell-foop -swfmill -swh-lv2 -swh-plugins -swift-im -swig -swig2.0 -swish-e -swisswatch -switchsh -sword -swt-gtk -swt4-gtk -sxid -sxiv -syfi -sylfilter -sylph-searcher -sylpheed -symlinks -symmetrica -sympa -sympow -synaesthesia -synaptic -synce-serial -syncevolution -syncmaildir -synergy -synfig -synfigstudio -synopsis -synthv1 -syrep -syrthes -sysbench -sysdig -sysfsutils -syslog-ng -syslog-ng-incubator -syslog-ocaml -sysnews -sysprof -sysrqd -sysstat -system-config-cluster -system-config-lvm -system-config-printer -system-tools-backends -systemd-shim -systemd-ui -sysvbanner -sysvinit -t-code -t1utils -t2n -t4kcommon -tabble -tabix -tableau-parm -tablix2 -tachyon -tack -taffybar -tagainijisho -tagcoll2 -taggrepper -taglib-extras -taglib -tagtool -tagua -taktuk -tali -talloc -tamil-gtk2im -tamuanova -tangerine -tango -tango-icon-theme -taningia -taopm -tap-plugins -tapecalc -tar -tarantool -tardy -tart -task -task-spooler -tasque -tau -tayga -tbb -tcc -tcd-utils -tcl-fitstcl -tcl-signal -tclcl -tclcurl -tclex -tclgeoip -tclodbc -tclreadline -tclthread -tcltls -tcltrf -tcludp -tclvfs -tclx8.4 -tclxml -tcm -tcos -tcpcopy -tcpcrypt -tcpdump -tcpflow -tcplay -tcpreen -tcpser -tcpslice -tcpspy -tcpstat -tcptrace -tcptraceroute -tcptrack -tcputils -tcpxtract -tcs -tcsh -tdbc -tdbcmysql -tdbcodbc -tdbcpostgres -tdbcsqlite3 -tdc -tdfsb -tdom -tea -tecnoballz -teeworlds -teg -telegnome -telepathy-farstream -telepathy-gabble -telepathy-glib -telepathy-haze -telepathy-idle -telepathy-logger -telepathy-logger-qt -telepathy-mission-control-5 -telepathy-qt -telepathy-rakia -telepathy-salut -tellico -tenace -tenmado -tercpp -terminatorx -terminology -termit -teseq -tesseract -testdisk -tetgen -tetradraw -tetrinet -tetrinetx -tex4ht -texmacs -texstudio -textdraw -texworks -tf -tf5 -tfdocgen -tftp-hpa -tgt -thc-ipv6 -the -thepeg -thermald -theseus -thewidgetfactory -thin -thin-provisioning-tools -thinkfan -threadscope -thrift-compiler -thuban -thunar-archive-plugin -thunar-dropbox-plugin -thunar -thunar-media-tags-plugin -thunar-vcs-plugin -thunar-volman -ticcutils -ticker -tickr -tidy -tifffile -tig -tiger -tilda -tilem -tilp2 -timbl -timblserver -time -timelimit -timemachine -timemon.app -timidity -tin -tina -tinc -tint -tint2 -tintin++ -tinycdb -tinydyndns -tinymux -tinyos-tools -tinyproxy -tinyscheme -tinywm -tinyxml2 -tiptop -tix -tk-html3 -tk-table -tk707 -tkdesk -tkdnd -tkpng -tkrplot -tktray -tktreectrl -tlsdate -tmispell-voikko -tmperamental -tmpreaper -tmux -tnat64 -tnef -tnetstring -tnftp -tntdb -tntnet -tofrodos -togl -toilet -tokyocabinet -tokyocabinet-haskell -tokyotyrant -tolua++ -tolua -tomboy -tomcat-native -tomoyo-tools -topal -tophat -toppler -tor -tora -torcs -toshset -totem-pl-parser -towitoko -tpconfig -tpm-tools -traceroute -trackballs -tracker -trafficserver -transcalc -transcriber -transfermii -transfig -translatoid -transmageddon -transmission-remote-gtk -traverso -trayer -tre -tree-puzzle -treil -trickle -trigger-rally -triggerhappy -trinity -tripwire -troffcvt -trophy -trousers -trueprint -trustedqsl -tsdecrypt -tse3 -tseries -tslib -tsocks -tstools -ttf2ufm -ttfautohint -tth -tthsum -tty-clock -ttyload -ttylog -ttyrec -ttysnoop -tua -tulip -tumbler -turnserver -tuxcmd-modules -tuxfootball -tuxguitar -tuxmath -tuxonice-userui -tuxpaint -tuxpuck -tuxtype -tv-fonts -tvoe -tvtime -twclock -tweak -twidge -twig -twisted -twm -twofish -twoftpd -twolame -tworld -twpsk -txt2pdbdoc -tzc -u-boot -u1db -u3-tool -uanytun -uapevent -uaputl -ubuntulooks -ucarp -ucblogo -ucimf-chewing -ucimf-openvanilla -ucimf-sunpinyin -ucl -uclmmbase -ucommon -ucpp -ucspi-proxy -ucto -udev -udevil -udftools -udisks-glue -udisks -udisks2 -udj-desktop-client -udns -udo -udpcast -udpkg -udptunnel -udunits -ufc -ufiformat -ufraw -uget -uhd -uhttpmock -uhub -ui-auto -ui-gxmlcpp -ui-utilcpp -uid-wrapper -uim-chewing -uim -uisp -ulogd2 -ultracopier -umbrello -uml-utilities -unac -unace -unadf -unagi -unalz -unar -unclutter -undbx -undertaker -unhide -unhtml -uni2ascii -unicap -unicode-screensaver -unicorn -unifdef -unifont -unison2.32.52 -units -uniutils -unixcw -unixodbc -unixodbc-gui-qt -unmass -unmo3 -unpaper -unrar-free -unrtf -unscd -unshield -unsort -untex -unworkable -unyaffs -unzip -upnp-router-control -uprofiler -upslug2 -uptimed -uqwk -urdfdom -urdfdom-headers -urfkill -urg -uriparser -urjtag -urlview -urwid -usb-modeswitch -usbmuxd -usbprog -usbrelay -usbtc08-python -usbutils -usbview -userinfo -usermode -userv -ussp-push -ustr -uswsusp -utalk -utfout -util-linux -utopia-documents -uuagc -uucp -uucpsend -uudeview -uvccapture -uw-imap -uwsgi -uzbl -v4l2ucp -v86d -vacation -vagalume -vala-0.16 -vala-0.24 -vala-0.26 -vala-dbus-binding-tool -vala-terminal -valabind -valadoc -valgrind -validns -valknut -vamp-plugin-sdk -vamps -vanessa-adt -vanessa-logger -vanessa-socket -varconf -varmon -varnish -vbetool -vbindiff -vblade -vboot-utils -vbrfix -vcdimager -vcftools -vde2 -vdesk -vdetelweb -vdk2 -vdmfec -vdpau-video -vdr -vdr-plugin-streamdev -vdr-plugin-xineliboutput -vectoroids -velvet -vera++ -verbiste -verilator -verse -veusz -vflib3 -vgabios -vgrabbj -vidalia -videogen -videotrans -viennacl -viewmol -viewnior -vifm -vigor -viking -vile -vilistextum -vim-youcompleteme -vinagre -vino -virt-viewer -virt-what -virtualjaguar -vish -visionegg -visitors -visp -visualboyadvance -visualvm -vite -viva -vkeybd -vlan -vlc -vlfeat -vlock -vm -vmfs-tools -vmpk -vncsnapshot -vnstat -vo-aacenc -vo-amrwbenc -vobcopy -vokoscreen -volpack -volumeicon -voms -voms-mysql-plugin -vorbis-tools -vorbisgain -votca-csg -votca-tools -vowpal-wabbit -vpb-driver -vpcs -vpnc -vramsteg -vrfy -vrrpd -vsdump -vstream-client -vtable-dumper -vte -vte2.91 -vte3 -vtgrab -vtk-dicom -vtprint -vttest -vtun -vxi -vxl -vzctl -vzquota -w3cam -w9wm -wacomtablet -waffle -warmux -warzone2100 -watchcatd -watchdog -wavbreaker -wavemon -wavpack -wavtool-pl -wayland -wayv -wbar -wbox -wbxml2 -wcd -wcslib-contrib -wcslib -wdiff -webalizer -webauth -webcit -webdis -webdruid -webfs -webkit-image -webkit2gtk -webkit2pdf -webkitgtk -webkitkde -weborf -webrtc-audio-processing -websocketpp -websockify -weechat -weex -welcome2l -weplab -wesnoth-1.10 -wesnoth-1.11 -west-chamber -wfmath -wfrench -whichman -whitedb -whois -whowatch -why -whysynth -wicd-kde -wide-dhcpv6 -widelands -wiggle -wiipdf -wikidiff2 -wildmidi -wily -wims -windowlab -wings3d -wininfo -winwrangler -wipe -wireless-tools -wise -witty -wizznic -wmacpi -wmail -wmaker -wmaloader -wmauda -wmbattery -wmbubble -wmbutton -wmcalclock -wmclock -wmclockmon -wmcpu -wmcpuload -wmctrl -wmdate -wmdiskmon -wmf -wmforecast -wmforkplop -wmfrog -wmhdplop -wmifinfo -wmifs -wmitime -wmix -wml -wmlongrun -wmmatrix -wmmemload -wmmon -wmmoonclock -wmnd -wmnet -wmnut -wmpinboard -wmppp.app -wmpuzzle -wmrack -wmressel -wmshutdown -wmsystemtray -wmtemp -wmtime -wmtv -wmwave -wmweather+ -wmweather -wmwork -wmxmms2 -wmxres -wnn6-sdk -woff-tools -wordgrinder -wordnet -wordplay -wordwarvi -worker -worklog -workrave -wp2x -wpa -wput -wraplinux -wrapsrv -wreport -writerperfect -wsjt -wsjtx -wsynth-dssi -wuzzah -wv -wv2 -wvstreams -wwl -wxmaxima -wxsqlite3 -wxsvg -wxwidgets2.8 -wxwidgets3.0 -wysihtml -wzip -x11-apps -x11-session-utils -x11-touchscreen-calibrator -x11-utils -x11-xfs-utils -x11-xkb-utils -x11-xserver-utils -x11proto-bigreqs -x11proto-composite -x11proto-core -x11proto-damage -x11proto-dmx -x11proto-dri2 -x11proto-dri3 -x11proto-fixes -x11proto-fonts -x11proto-gl -x11proto-input -x11proto-kb -x11proto-present -x11proto-randr -x11proto-record -x11proto-render -x11proto-resource -x11proto-scrnsaver -x11proto-video -x11proto-xcmisc -x11proto-xext -x11proto-xf86dga -x11proto-xf86dri -x11proto-xf86vidmode -x11proto-xinerama -x11vnc -x2 -x264 -x2vnc -x2x -x42-plugins -x52pro -x86info -xa -xabacus -xacobeo -xalan -xaos -xapian-bindings -xapian-core -xapian-omega -xarchiver -xarclock -xastir -xauth -xautolock -xautomation -xawtv -xbacklight -xbae -xbase64 -xbattbar -xbill -xbindkeys-config -xbindkeys -xbitmaps -xbmc-pvr-addons -xbomb -xbs -xbubble -xbuffy -xcache -xcalib -xcape -xcb -xcb-util-cursor -xcb-util -xcb-util-image -xcb-util-keysyms -xcb-util-renderutil -xcb-util-wm -xcfa -xcftools -xchain -xchat-gnome -xchat -xchat-guile -xchm -xcircuit -xclip -xcolmix -xcolors -xcolorsel -xcompmgr -xcowsay -xcrysden -xcursor-themes -xdaliclock -xdebug -xdelta -xdelta3 -xdemineur -xdemorse -xdesktopwaves -xdffileio -xdg-user-dirs -xdg-user-dirs-gtk -xdiskusage -xdm -xdmf -xdms -xdotool -xdu -xdx -xemacs21 -xerces-c -xf86-input-wacom -xf86-input-xwiimote -xf86-video-glamo -xfaces -xfburn -xfce4-appfinder -xfce4-battery-plugin -xfce4-cellmodem-plugin -xfce4-clipman-plugin -xfce4-cpufreq-plugin -xfce4-cpugraph-plugin -xfce4-datetime-plugin -xfce4-dev-tools -xfce4-dict -xfce4-diskperf-plugin -xfce4-fsguard-plugin -xfce4-genmon-plugin -xfce4-hdaps -xfce4-indicator-plugin -xfce4-linelight-plugin -xfce4-mailwatch-plugin -xfce4-messenger-plugin -xfce4-mixer -xfce4-mount-plugin -xfce4-mpc-plugin -xfce4-netload-plugin -xfce4-notes-plugin -xfce4-notifyd -xfce4-panel -xfce4-places-plugin -xfce4-power-manager -xfce4-quicklauncher-plugin -xfce4-radio-plugin -xfce4-screenshooter -xfce4-sensors-plugin -xfce4-session -xfce4-settings -xfce4-smartbookmark-plugin -xfce4-systemload-plugin -xfce4-taskmanager -xfce4-terminal -xfce4-timer-plugin -xfce4-verve-plugin -xfce4-volumed -xfce4-wavelan-plugin -xfce4-weather-plugin -xfce4-whiskermenu-plugin -xfce4-wmdock-plugin -xfce4-xkb-plugin -xfconf -xfdesktop4 -xfe -xfig -xfireworks -xfishtank -xflip -xfoil -xfonts-100dpi -xfonts-75dpi -xfonts-base -xfonts-cyrillic -xfonts-encodings -xfonts-scalable -xfonts-utils -xfpt -xfrisk -xfstt -xfswitch-plugin -xft -xfwm4 -xgalaga -xgks -xhprof -xindy -xine-plugin -xine-ui -xinit -xinput-calibrator -xinput -xinv3d -xiphos -xipmsg -xiterm+thai -xjokes -xjump -xkbind -xkbset -xkeyboard-config -xkeycaps -xl2tpd -xlassie -xlbiff -xless -xletters -xli -xmahjongg -xmakemol -xmbmon -xmds -xmedcon -xmhtml -xmille -xmix -xml-security-c -xml2 -xmlcopyeditor -xmldiff -xmlindent -xmlroff -xmlrpc-epi -xmlsec1 -xmlstarlet -xmlto -xmltooling -xmms2 -xmms2-scrobbler -xmobar -xmonad-contrib -xmonad -xmotd -xmoto -xmount -xmountains -xmp -xmpi -xnbd -xnec2c -xnecview -xnee -xneur -xombrero -xonix -xoo -xorg-docs -xorg -xorg-sgml-doctools -xosd -xotcl -xpa -xpad -xpat2 -xpenguins -xphoon -xpilot-ng -xplanet -xplc -xplot -xplot-xplot.org -xpra -xprintidle -xprobe -xpuzzles -xpyb -xqf -xqilla -xracer -xresprobe -xrestop -xringd -xrootconsole -xscavenger -xscorch -xsd -xsel -xsensors -xserver-xorg-input-acecad -xserver-xorg-input-aiptek -xserver-xorg-input-elographics-goto-binaries.ta..> -xserver-xorg-input-evdev -xserver-xorg-input-joystick -xserver-xorg-input-keyboard -xserver-xorg-input-mouse -xserver-xorg-input-mutouch -xserver-xorg-input-synaptics -xserver-xorg-input-vmmouse -xserver-xorg-input-void -xserver-xorg-video-ati -xserver-xorg-video-cirrus -xserver-xorg-video-dummy -xserver-xorg-video-fbdev -xserver-xorg-video-glide -xserver-xorg-video-intel -xserver-xorg-video-ivtvdev -xserver-xorg-video-mach64 -xserver-xorg-video-mga -xserver-xorg-video-modesetting-goto-binaries.ta..> -xserver-xorg-video-neomagic -xserver-xorg-video-nouveau -xserver-xorg-video-openchrome-goto-binaries.tar..> -xserver-xorg-video-qxl -xserver-xorg-video-r128 -xserver-xorg-video-savage -xserver-xorg-video-siliconmotion-goto-binaries...> -xserver-xorg-video-tdfx -xserver-xorg-video-trident -xserver-xorg-video-vesa -xsettings-kde -xshisen -xshogi -xskat -xsok -xsol -xsoldier -xsp -xss-lock -xstarfish -xstow -xsunpinyin -xsynth-dssi -xsysinfo -xtables-addons -xtail -xteddy -xtell -xterm -xtermcontrol -xtermset -xtrace -xtrans -xtrlock -xtron -xtrs -xttitle -xtv -xutils-dev -xvba-video -xvidcore -xvier -xvkbd -xvt -xwatch -xwax -xwelltris -xwiimote -xwit -xwpe -xwrits -xxdiff -xxkb -xxxterm -xye -xylib -xz-utils -xzgv -xzip -xzoom -yacas -yacpi -yade -yafc -yagf -yagiuda -yajl -yakuake -yamdi -yaml-cpp -yaml-cpp0.3 -yapet -yara -yash -yasr -yauap -yaws -yc-el -ydpdict -yeahconsole -yelp -yelp-xsl -ygl -yi -yics -yiyantang -ykclient -yodl -yorick-av -yorick-cubeview -yorick-curses -yorick -yorick-gy -yorick-hdf5 -yorick-imutil -yorick-ml4 -yorick-mpeg -yorick-optimpack -yorick-yeti -yorick-ygsl -yorick-ynfft -yorick-z -yoshimi -ytree -yubico-pam -yubikey-personalization -yubikey-server-c -yubiserver -yudit -yum-metadata-parser -z80asm -z80dasm -z80ex -z8530-utils2 -z88 -zabbix -zalign -zam-plugins -zanshin -zatacka -zathura-extras -zathura -zaz -zbackup -zeitgeist -zenity -zenlisp -zeroc-icee-translators -zerofree -zeroinstall-injector -zeromq -zeromq3 -zfec -zh-autoconvert -zimlib -zimpl -zinnia -zip -zipios++ -zlib -zlibc -zmakebas -zmap -zodb -zomg -zoo -zookeeper -zope.hookable -zope.i18nmessageid -zope.interface -zope.proxy -zope.security -zope2.13 -zopfli -zpspell -zsh -zssh -zsync -zthreads -zurl -zyn -zynaddsubfx -zypper -zziplib -zzuf diff --git a/src/musketeer/experiments/goto-runner/pkgs-qm-paper b/src/musketeer/experiments/goto-runner/pkgs-qm-paper deleted file mode 100644 index 429e961590a..00000000000 --- a/src/musketeer/experiments/goto-runner/pkgs-qm-paper +++ /dev/null @@ -1,10 +0,0 @@ -blktrace -dnshistory -ghostess -lingot -memcached -proxsmtp -ptunnel -see -timemachine -weborf diff --git a/src/musketeer/experiments/goto-runner/readme.txt b/src/musketeer/experiments/goto-runner/readme.txt deleted file mode 100644 index 486e9c2e3a5..00000000000 --- a/src/musketeer/experiments/goto-runner/readme.txt +++ /dev/null @@ -1,18 +0,0 @@ - -Debian experiments -================== - -The Debian experiments can be run with the script goto-runner.sh. The script -runs a goto binary analysis tool on the goto binaries contained in archives held -at a certain URL. - -The script reads a configuration file .config, with being -the hostname of the machine the script is run on (as can be retrieved by the -command 'hostname'). Various options can be configured in this file, such as the -URL from which to download packages, the tools to use, or the analysis timeout. -For an example configuration file see dkr11.cs.ox.ac.uk.config. - -The output of successful runs is put into a directory 'success', and the output -of erroneous runs is put into a directory 'failure'. An erroneous run means that -the tool crashed or a timeout occured. - diff --git a/src/musketeer/fence-insertion/fi.py b/src/musketeer/fence-insertion/fi.py deleted file mode 100644 index b0cf1539c56..00000000000 --- a/src/musketeer/fence-insertion/fi.py +++ /dev/null @@ -1,1061 +0,0 @@ -#!/usr/bin/env python3 - -# (1) Wrap if, while, etc. statements in curly braces. -# (2) Insert fences; backup file as *.fibak first if it does not exist yet - -# Transformations preserve line numbers. - -# ------------------------------------------------------------------------------ -# Current musketeer input format (SVN rev >= 4816) - -# Input format example (musketeer output; 9 cols): -# fence|peterson.c|thr1|6|c::turn|peterson.c|thr1|7|c::flag2 - -# Input format example (for e.g. pensieve output; 5 cols): -# fence|peterson.c|5|c::flag1|0 - -# ------------------------------------------------------------------------------ -# Old musketeer input formats: - -# Input format example (for regular musketeer output; fixed version; 9 cols): -# fence|test.c|test|5|c::exp|test.c|test|5|c::exp - -# Input format example (for regular musketeer output; async version; -# unsupported; 11 cols): -# fence|test.c|test|5|exp|c::exp|test.c|test|5|exp|c::exp - -# Input format example (for regular musketeer output; with types; unsupported; -# 13 cols): -# dp|pfscan.c|matchfun|311|line_f|c::line_f|signed_int|f.c|fun|31|*mutex|c::p_l| -# (notice that there's no type for the second access) - -# Input format example (for e.g. allshared output; 5 cols): -# fence|assoc.c|125|old_hashtable|Write - -# ------------------------------------------------------------------------------ -# Implementation notes - -# - The newline that terminates a line is considered part of the line. -# - Two ways of specifying lines: line number (1-based), or global index of -# character (0-based). -# - Conceptually, the C file is analyzed by moving around a cursor that points -# at characters in the input file. Various functions are provided to move the -# cursor (e.g. ln_toe() moves the cursor to the end of the current line). -# - Common argument names: pos (cursor position), s (string containing source -# file) -# - Assumption: Input is a well-formed C file. -# - Whitespace (e.g. for eat() and puke()): space, tab, newline. -# - Functions that take ranges of cursor positions treat both as inclusive. -# - Most important top-level functions: insert_fences(), place_fence(), -# place_dp(). -# - Two types of temporary variables: pull variable, connection variable. For -# the pull variable we need the correct type of the expression. - -# ------------------------------------------------------------------------------ - -# Todo: -# - Comment handling, e.g. comments at end of line (priority low) - -# ------------------------------------------------------------------------------ - -import re -import sys -import shutil -import os - -# ------------------------------------------------------------------------------ -# Fence map (for ARM and dp only used when dependency insertion is not possible) - -fm_x86 = { 'fence': 'mfence' } -fm_arm = { 'fence': 'dsb', 'cf': 'isb', 'dp': 'dsb' } - -# ------------------------------------------------------------------------------ -# Configuration parameters set via command line arguments. - -handle_dp = False -musk_form = True -fm = fm_x86 - -# ------------------------------------------------------------------------------ -# Indices of items in lines in results.txt in musk format -# -1: gets last element from list - -im_fence = 0 - -im_src_file1 = 1 -im_func_name1 = 2 -im_line1 = 3 -im_exp1 = -1 -im_cprover_exp1 = -1 -im_type1 = -1 - -im_src_file2 = 5 -im_func_name2 = 6 -im_line2 = 7 -im_exp2 = -1 -im_cprover_exp2 = -1 -im_type2 = -1 - -# ------------------------------------------------------------------------------ -# Indices of items in lines in results.txt in other format - -io_fence = 0 -io_src_file = 1 -io_line = 2 - -# ------------------------------------------------------------------------------ - -# Enum for possible fence positions -fence_first, fence_second = range(2) - -# Config for fence position (where to insert into the code) -fence_pos = fence_first - -# ------------------------------------------------------------------------------ - -def print_err(s): - print(s, file = sys.stderr) - -def assert_msg(c, msg): - if not c: - print_err(msg) - assert(False) - -def usage(): - print_err("Usage:") - print_err(" fi.py (x86|arm) (fence|dp) (musk|other) ") - print_err("") - print_err(" 1: Architecture") - print_err(" 2: Select if fence or real dependency should be used for dp's") - print_err(" 3: Specify input format") - print_err(" 4: Output file of musketeer (results.txt)") - -# ------------------------------------------------------------------------------ -# Functions to delete, replace, and insert symbols from/in a string - -### Insert string at position in string -# :pos is exclusive, pos: is inclusive -def insert(s, pos, c): - return s[:pos] + c + s[pos:] - -### Delete string between pos1 (inclusive) and pos2 (exclusive) -def delete(s, pos1, pos2): - assert(pos1 <= pos2) - return s[:pos1] + s[pos2:] - -### Get line within string (including newline at end) -# pos: position within a line -def extract_ln(s, pos): - start = ln_tos(s, pos) - end = ln_toe(s, pos) - ss = s[start:end+1] - return ss - -### Replace regex on line with repl (regex must match on line) -# Current limitation: only string replacement -def replace_ln(s, pos, regex, repl): - start = ln_tos(s, pos) - end = ln_toe(s, pos) - ln = extract_ln(s, pos) - #lnt = re.sub(regex, ln, repl) - lnt = ln.replace(regex, repl, 1) - assert(ln != lnt); - s = delete(s, start, end + 1) - s = insert(s, start, lnt) - return s - -### Insert curly braces at specified positions -def wrap(s, pos1, pos2): - assert(pos1 < pos2) - assert(pos2 < len(s)) - s = insert(s, '{', pos1) - s = insert(s, '}', pos2 + 1) - return s - -### Insert items at given positions of string (l is a list of pairs) -# Items to insert must be single characters -def insert_items(s, l): - l.sort() - cnt = 0 - for el in l: - s = insert(s, el[0] + cnt, el[1]) - cnt += 1 - return s - -# ------------------------------------------------------------------------------ -# Functions to move cursor to start or end of specific lines. - -### Goto start of line of a certain number -# return value: index of first char on line, -1 if line does not exist -def before_line(s, n): - assert(n >= 1) - cnt = 1 - for i in range(0, len(s)): - if cnt == n: - return i - if s[i] == '\n': - cnt += 1 - return -1 - -### Goto end of line of a certain number -# return value: index of newline at end of line -def after_line(s, n): - return before_line(s, n + 1) - 1 - -# ------------------------------------------------------------------------------ -# Functions to move cursor to start or end of line, given a position. - -### Go from end to start of line -def ln_etos(s, pos): - assert(s[pos] == '\n') - return ln_tos(s, pos) - -### Go from start to end of line -def ln_stoe(s, pos): - assert(s[pos] != '\n') - return ln_toe(s, pos) - -### Go to start of line -def ln_tos(s, pos): - assert(pos > 0) - if s[pos] == '\n': - pos -= 1 - - while pos > 0 and s[pos] != '\n': - pos -= 1 - - if s[pos] == '\n': - pos += 1 - assert(s[pos] != '\n') - return pos - assert(False) - -### Go to end of line -def ln_toe(s, pos): - assert(pos > 0) - l = len(s) - while pos < l and s[pos] != '\n': - pos += 1 - - if s[pos] == '\n': - return pos - assert(False) - -# ------------------------------------------------------------------------------ -# Functions to skip over text items. It is an error to skip to the end of the -# string. - -def next_item(s, pos, item): - l = len(s) - assert(pos < l) - ret = s.find(item, pos) - - # Debug - if (ret == -1): - assert(s[pos] == '\n') - print('Debug: string for next_item:') - print(s[pos:]) - - return ret - -### Get next semicolon at or after pos -# return value: index of next semicolon, or -1 -def next_semicolon(s, pos): - return next_item(s, pos, ';') - -### Skip over nested items (return pos of next character), forwards or backwards -# s: file as string -# a: left item -# b: right item -# d: direction(1: forward, -1: backward) -# pos: points at first item (a for forward, b for backward) -def skip_nested(s, a, b, d, pos): - l = len(s) - assert(pos < l) - assert(pos >= 0) - assert(d == -1 or d == 1); - assert(d != 1 or s[pos] == a); - assert(d != -1 or s[pos] == b); - - cnt = d - pos += d - while True: - assert(pos >= 0) - assert(pos < l) - if s[pos] == a: - cnt += 1 - elif s[pos] == b: - cnt -= 1 - - pos += d - - if cnt == 0: - assert(pos >= 0) - assert(pos < l) - return pos - - assert(False) - -def skip_p(s, pos): - return skip_nested(s, '(', ')', 1, pos) - -def skip_b(s, pos): - return skip_nested(s, '{', '}', 1, pos) - -def skip_p_b(s, pos): - return skip_nested(s, '(', ')', -1, pos) - -def skip_b_b(s, pos): - return skip_nested(s, '{', '}', -1, pos) - -# Return position of current or next non-whitespace character -def eat(s, pos): - l = len(s) - assert(pos < l) - while (pos < l): - c = s[pos] - if c != ' ' and c != '\t' and c != '\n': - return pos - pos += 1 - assert(False) - return pos - -# Return position of current or previous non-whitespace character. -def puke(s, pos): - l = len(s) - assert(pos < l) - while (pos < l): - c = s[pos] - if c != ' ' and c != '\t' and c != '\n': - return pos - pos -= 1 - assert(False) - return pos - -# Return position of current or previous non-whitespace character (newline is -# not considered a whitespace character here). -def puke2(s, pos): - l = len(s) - assert(pos < l) - while (pos < l): - c = s[pos] - if c != ' ' and c != '\t': - return pos - pos -= 1 - assert(False) - return pos - -### Skip over statement (including parentheses). -def skip_stat(s, pos): - l = len(s) - assert(pos < l) - # Skip keyword - if (s[pos:pos+5] == 'while'): - pos += 5 - elif (s[pos:pos+2] == 'if'): - pos += 2 - elif (s[pos:pos+3] == 'for'): - pos += 3 - elif (s[pos:pos+6] == 'switch'): - pos += 6 - else: - return -1 - pos = eat(s, pos) - if (s[pos] != '('): - # Spurious statement (e.g. in comment or string) - return -1 - pos = skip_p(s, pos) - pos = eat(s, pos) - return pos - -# ------------------------------------------------------------------------------ -# Predicates - -# Are the nested constructions with symbols a, b balanced between pos1 and pos2? -def is_balanced(s, a, b, pos1, pos2): - assert(pos1 < pos2) - assert(pos2 < len(s)) - cnt = 0 - for i in range(pos1, pos2+1): - if s[i] == a: - cnt += 1 - elif s[i] == b: - cnt -= 1 - if cnt == 0: - return True - return False - -def is_balanced_curly(s, pos1, pos2): - return is_balanced(s, '{', '}', pos1, pos2) - -# Can pos2 see variables declared at pos1? (counting braces between is not -# sufficient as the visibility can be killed in between) -def from_to_scope(s, pos1, pos2): - l = len(s) - assert(pos1 >= 0) - assert(pos1 < pos2) - assert(pos2 < l) - cnt = 0 - for i in range(pos1, pos2 + 1): - if s[i] == '{': - cnt += 1 - elif s[i] == '}': - cnt -= 1 - if cnt == -1: - return False - return True - -### Check if string ln contains string s -def contains(ln, s): - ret = ln.find(s, 0) - if ret != -1: - return True - return False - -### Check if string ln contains string s, and s is delimited by special chars. -# A string at the beginning or end of line is delimited by definition. -def contains_delim(ln, s): - l = len(s) - ret = ln.find(s, 0) - if ret != -1: - if ret > 0 and ret + l < len(ln): - return not ln[ret-1].isalnum() and not ln[ret+l].isalnum() - return False - -### Check if line has a statement keyword like if, while, ... -def contains_stat(ln): - b = contains_delim(ln, "if") - b = b or contains_delim(ln, "while") - b = b or contains_delim(ln, "for") - b = b or contains_delim(ln, "do") - b = b or contains_delim(ln, "switch") - b = b or contains_delim(ln, "case") - return b - -### Check if string contains carriage returns -def check(s): - mo = re.search('\r', s) - if mo == None: - return True - return False - -def is_stat_delim(c): - return c == ';' or c == '{' or c == '}' - -# ------------------------------------------------------------------------------ -# Fix braces in string - -### Fix statements other than cases -# s: whole source -def fix(s): - pat = '([;}\t\n ](if|while|for))|(do[\t\n ]*\{)' - - s_prev = s - - # Set of starting locations of whiles that belong to previous do's - forbidden = set() - - while True: - locs = [] - it = re.finditer(pat, s) - - # For all match objects - for mo in it: - pos = mo.start() - - # Ignore lines that are defines or comments (check for not equal to \n to - # avoid skipping to the previous line) - if s[pos] != '\n': - px = ln_tos(s, pos) - px = eat(s, px) - if s[px] == '#': - continue - if s[px:px+2] == '//': - continue - if s[px:px+2] == '/*': - continue - - if s[pos:pos+2] == 'do': - pos += 2 - pos = eat(s, pos) - assert(s[pos] == '{') - pos = skip_b(s, pos) - pos = eat(s, pos) - assert(s[pos:pos+5] == 'while') - forbidden.add(pos) - continue - - pos += 1 - - # While that belongs to a previous do - if pos in forbidden: - continue - - pos = skip_stat(s, pos) - - # Spurious statement - if pos == -1: - continue - - if s[pos] == '{': - # Already wrapped, nothing to do - pass - else: - ppos = puke(s, pos - 1) - ppos += 1 - # Try to skip statement below - npos = skip_stat(s, pos) - if npos == -1: - # Statement ending in semicolon - end = next_semicolon(s, pos) - assert(end > 0) - locs.append((ppos, '{')) - locs.append((end + 1, '}')) - elif s[npos] == '{': - # Wrapped statement - end = skip_b(s, npos) - locs.append((ppos, '{')) - locs.append((end, '}')) - - s = insert_items(s, locs) - if (s == s_prev): - break - s_prev = s - - return s - -### Wrap cases in switch statement in curly braces -# s: whole source -def fix_case(s): - pat = '([\t ]((case[^:\n]+\:)|(default\:))|(switch[ \t]*\())' - it = re.finditer(pat, s) - locs = [] - prev_end = -1 - - for mo in it: - pos = mo.start() - if s[pos:pos+6] == 'switch': - prev_end = -1 - else: - start = mo.start() - if prev_end != -1 and is_balanced_curly(s, prev_end, start): - locs.append((prev_end, '{')) - locs.append((start, '}')) - prev_end = mo.end() - - s = insert_items(s, locs) - return s - -# ------------------------------------------------------------------------------ -# Dependency handling (ARM only) - -### Connect a read via a dependency to a previous read -# s: file as string -# pos: points at newline at end of line -# cv: name of the connecting variable -# read_exp: expression that corresponds to the read -# return value: -# 1: true if connected, false otherwise -# 2: transformed string -def connect_rd_dp(s, pos, cv, read_exp): - repl = "*(&(" + read_exp + ")" + cv + ")" - s = replace_ln(s, pos, read_exp, repl) - return s - -# Connect a write via a dependency to a previous read -# s: file as string -# pos: points at newline at end of line -# cv: name of the connecting variable -# return value: -# 1: true if connected, false otherwise -# 2: transformed string -def connect_wrt_dp(s, pos, cv): - # Find pattern " = " (matches practically all writes occuring in a C program) - pos -= 1 - while pos >= 0 and s[pos] != '\n': - if s[pos] == '=' and s[pos-1] == ' ' and s[pos+1] == ' ': - s = insert(s, pos + 2, cv + " + ") - return True, s - pos -= 1 - return False, s - -# ------------------------------------------------------------------------------ -# Temporary variable names - -### Get name of next temporary variable -tmp_cnt = 0 -def next_tmp(): - global tmp_cnt - tmp_cnt += 1 - vn = 'tmp_xjsdfk_' + str(tmp_cnt) - return vn - -### Get name of next pull temporary variable -tmp_cnt_pull = 0 -def next_tmp_pull(): - global tmp_cnt_pull - tmp_cnt_pull += 1 - vn = 'tmp_pull_' + str(tmp_cnt_pull) - return vn - -### Get name of next connection temporary variable -tmp_cnt_con = 0 -def next_tmp_con(): - global tmp_cnt_con - tmp_cnt_con += 1 - vn = 'tmp_con_' + str(tmp_cnt_con) - return vn - -# ------------------------------------------------------------------------------ - -### Insert given statement at given position (for inserting full fences). -# s: file as string -# pos: points at newline character at end of line -# asm: asm statement to insert -# line_cnt: line in results.txt -placement_cnt = 0 -def place_fence(s, pos, asm, line_cnt): - assert(s[pos] == '\n') - - global placement_cnt - placement_cnt += 1 - pc = str(placement_cnt) - - # Check if it's an if or while at the end of the line - pn = puke(s, pos) - if s[pn] == '{': - pn = puke(s, pn - 1) - if s[pn] == ')': - pb = skip_p_b(s, pn) + 1 - assert(s[pb] == '(') - # Condition including parentheses - cond = s[pb:pn+1] - p = puke(s, pb - 1) - if s[p-1:p+1] == 'if': - px = puke(s, p-2) - if re.search('[;}\t\n ]', s[p-2]) != None and s[px-3:px+1] != 'else': - # We have found a suitable if - tmp = next_tmp() - s = delete(s, pb + 1, pn) - s = insert(s, pb + 1, tmp) - p -= 1 - s = insert(s, p, 'long ' + tmp + ' = (long)' + cond + ';' + asm) - print('Placing fence ' + line_cnt + ' with rule 1') - return s - elif s[p-4:p+1] == 'while': - if re.search('[;}\t\n ]', s[p-5]) != None: - - tmp = next_tmp() - pulled = tmp + ' = (long)' + cond + ';' + asm - - # Statement at end of while loop - idx = next_item(s, p, '{') - assert(s[idx] == '{') - idx = skip_b(s, idx) - idx -= 1 - assert(s[idx] == '}') - s = insert(s, idx, pulled) - - pulled = 'long ' + pulled - s = delete(s, pb + 1, pn) - s = insert(s, pb + 1, tmp) - p -= 4 - s = insert(s, p, pulled) - print('Placing fence ' + line_cnt + ' with rule 2') - return s - - # Try to place on same line (at the end) - pn = puke(s, pos) - while s[pn] == '}': - pn = puke(s, pn - 1) - c = s[pn] - if c == ';' or c == '{': - s = insert(s, pn + 1, asm) - print('Placing fence ' + line_cnt + ' with rule 3') - return s - - # Try to place on next line (at the beginning) - pn = eat(s, pos) - c = s[pn] - if c == '{': - s = insert(s, pn + 1, asm) - print('Placing fence ' + line_cnt + ' with rule 4') - return s - - print('Ignoring fence ' + line_cnt) - return s - -# ------------------------------------------------------------------------------ - -### Get asm statement connecting a read with a read/write -# inv: in variable -# outv: out variable -def get_connector(inv, outv): - s = "__asm volatile(\"eors %0, %1, %1\" : \"=r\"(" + outv + ") : \"r\"(" + \ - inv + "));" - return s - -### Connect an expression expr via connection variable cv -# Works for both read and write targets -# s: -# pos: starting index of the expression -# cv: connection variable -# expr: original expression -def connect_dp(s, pos, cv, expr): - repl = "(*(&(" + expr + ") + " + cv + "))" - s = replace_ln(s, pos, expr, repl) - return s - -### Place the asm connection statement -# s: -# idx: index of the second expression belonging to the dependency -# ps: index of the start of the line -# asm_st: asm statement to place -def place_asm_st(s, idx, ps, asm_st): - assert(idx > ps) - pt = puke2(s, idx-1) - tc = s[pt] - if is_stat_delim(tc): - # Place immediately before the expression - s = insert(s, pt+1, asm_st) - return s - else: - pt = puke(s, ps-1) - tc = s[pt] - if is_stat_delim(tc): - # Place at start of line - assert(s[ps] != '\n') - s = insert(s, ps, asm_st) - return s - else: - # Connector asm statement cannot be placed - return "" - -### Add a dependency between the accesses -# s: file as string -# pos1: points at newline character at end of line of first access -# pos2: points at newline character at end of line of second access -# fst: first expression (read) -# snd: second expression (read or write) -# ty: type of first expression -# line_cnt: corresponding line number in results.txt -def place_dp(s, pos1, pos2, fst, snd, ty, line_cnt): - - if ty == '' or ty == ' ': - return s - - # Strip off c:: from source and target expressions (if any) - if fst[0:3] == 'c::': - fst = fst[3:] - - if snd[0:3] == 'c::': - snd = snd[3:] - - ps1 = ln_etos(s, pos1) - ps2 = ln_etos(s, pos2) - assert(ps1 != '\n') - assert(ps2 != '\n') - - ln1 = extract_ln(s, pos1) - ln2 = extract_ln(s, pos2) - - # Check if expressions exist on line (exact matches) - if not contains(ln1, fst): - print('dp ' + line_cnt + ', first expression not found') - return s - if not contains(ln2, snd): - print('dp ' + line_cnt + ', second expression not found') - return s - - # Get starting indices of expressions in source file - idx1 = s.find(fst, ps1) - idx2 = s.find(snd, ps2) - assert(idx1 != -1) - assert(idx2 != -1) - len1 = len(fst) - len2 = len(snd) - - if not from_to_scope(s, idx1, idx2): - print('dp ' + line_cnt + ', target out of scope') - return s - - # At this point, we're pretty confident that it's possible to insert the dep - # :-) - - # Handle source of dependency - stat = contains_stat(ln1) - if stat: - # Source line contains a complicated statement (if, while, for, do, case, - # switch) - print('Inserting dependency with complicated source, ' + line_cnt) - - # Handle target of dependency - sn = connect_dp(s, idx2, "0", snd) - assert(len(sn) > 0) - - # Handle connector asm statement - asm_st = '__asm volatile("":::"memory");' - sn = place_asm_st(sn, idx2, ps2, asm_st) - if sn == '': - return s - else: - # Source line is simple - print('Inserting dependency with simple source, ' + line_cnt) - - # Pull and connection variables - pv = next_tmp_pull() - con = next_tmp_con() - - # Handle target of dependency - sn = connect_dp(s, idx2, con, snd) - assert(len(sn) > 0) - - # Handle connector asm statement - asm_st = get_connector(pv, con) - sn = place_asm_st(sn, idx2, ps2, asm_st) - if sn == '': - return s - - # Transform line to pulled version - sn = delete(sn, idx1, idx1 + len1) - sn = insert(sn, idx1, '(' + pv + ')') - con_and_pull = 'int ' + con + ' = 0; ' + ty + ' ' + pv + ' = ' + fst + ';' - while True: - idx1 -= 1 - c = sn[idx1] - if c == ';' or c == '{' or c == '}' or c == '\n': - sn = insert(sn, idx1 + 1, con_and_pull) - break - - return sn - -# ------------------------------------------------------------------------------ - -# Process each line in results.txt separately; not efficient but OK ... -# fences: list of pairs (with pair = (num, list), a list in a pair represents a -# line in results.txt) -# -# fences: all non-ignored lines in results.txt -def insert_fences(fences): - global musk_form - global handle_dp - global fm - - # For every line in results.txt - for p in fences: - line_cnt = str(p[0]) - l = p[1] - - # Read file into string - assert(im_src_file1 == io_src_file) - fn = l[im_src_file1] - f = open(fn, 'r') - s = f.read() - f.close() - - # Sanity checks - if musk_form: - if l[im_src_file1] != l[im_src_file2]: - print('Ignoring fence/dp ' + line_cnt + ', file mismatch') - continue - if l[im_func_name1] != l[im_func_name2]: - print('Ignoring fence/dp ' + line_cnt + ', func mismatch') - continue - - # Handle inverse line numbers - if musk_form: - if int(l[im_line1]) > int(l[im_line2]): - pass - - place_full_fence = True - - # Dp's are handled specially and line specifies a dp - if handle_dp and l[im_fence] == "dp": - assert(musk_form) - - # Get position pointers - ln1 = int(l[im_line1]) - ln2 = int(l[im_line2]) - if ln1 == ln2: - print('Ignoring dp ' + line_cnt + ', same line numbers') - continue - pos1 = after_line(s, ln1) - pos2 = after_line(s, ln2) - - # Expressions - fst = l[im_exp1] - snd = l[im_exp2] - - # Type of first expression (+ replace _ by space) - ty = l[im_type1] - ty = ty.replace('_', '') - - s_bak = s - s = place_dp(s, pos1, pos2, fst, snd, ty, line_cnt) - # Dependency successfully inserted - if (s != s_bak): - place_full_fence = False - - if place_full_fence: - # Insert a normal fence - assert(im_fence == io_fence) - try: - fence = fm[l[im_fence]] - except KeyError: - print_err('Unrecognized fence for architecture. Exiting.') - sys.exit(1) - - # Using __asm as asm does not work with -std=c99 - asm = '__asm volatile ("' + fence + '":::"memory");' - # Throws ValueError if not an integer - if musk_form: - if fence_pos == fence_first: - ln = int(l[im_line1]) - elif fence_pos == fence_second: - ln = int(l[im_line2])-1 - else: - ln = int(l[io_line]) - - # Point at newline character at end of line - pos = after_line(s, ln) - #assert(s[pos] == '\n') - assert_msg(s[pos] == '\n', 'Insert at line: ' + str(ln) + ', File: ' + fn) - - s = place_fence(s, pos, asm, line_cnt) - - # Write back result - f = open(fn, 'w') - f.write(s) - f.close() - -# ------------------------------------------------------------------------------ - -def handle_args(args): - global musk_form - global handle_dp - global fm - - if len(sys.argv) != 5: - print_err('Number of arguments != 5\n') - usage() - sys.exit(1) - - arch = sys.argv[1] - if arch == 'x86': - print('x86 architecture') - fm = fm_x86 - elif arch == 'arm': - print('ARM architecture') - fm = fm_arm - else: - print_err('Unrecognized architecture') - sys.exit(1) - - dp_mode = sys.argv[2] - if dp_mode == "dp": - print('Handling dp') - handle_dp = True - elif dp_mode == "fence": - print('Using full fence for dp') - handle_dp = False - else: - print_err('Unrecognized fencing strategy') - sys.exit(1) - - in_form = sys.argv[3] - if in_form == "musk": - print('Input format musketeer\n') - musk_form = True - elif in_form == "other": - print('Input format other\n') - musk_form = False - else: - print_err('Unrecognized format selector') - sys.exit(1) - - if handle_dp and (not(musk_form) or not(arch == 'arm')): - print_err('Incompatible argument values.') - sys.exit(1) - -# ------------------------------------------------------------------------------ - -if __name__ == "__main__": - - handle_args(sys.argv) - # Hack (musk output insufficient for dp insertion at the moment) - handle_dp = False - - print('Current working directory: \n' + os.getcwd() + '\n') - - # Read results file (check files mentioned in there) - fences = [] # list of pairs: (num, list) - files = [] # files in results.txt that will be fenced - all_files = [] # all files mentioned in results.txt - with open(sys.argv[4], 'r') as f: - cnt = 0 - for line in f: - cnt += 1 - # Note: "a||b|".split('|') yields ['a', '', 'b', ''] - l = line.split('|') - cols = len(l) - if cols == 11 or cols == 13: - print(' is from older version of musketeer') - sys.exit(1) - assert(cols == 5 or cols == 9) - assert(im_src_file1 == io_src_file) - fn = l[im_src_file1] - all_files.append(fn) - if fn[0] != '/' and os.path.isfile(fn): - # Files to fence - files.append(fn) - # Fencing instruction used (and its line in results.txt) - fences.append((cnt, l)) - - # Check if files exist before doing anything - not_found = False - all_files = list(set(all_files)) - for f in all_files: - if not(os.path.isfile(f)): - not_found = True - print('File ' + f + ' does not exist') - continue - if f[0] == '/': - not_found = True - print('File ' + f + ' has absolute path. Ignoring.') - - # Print extra newline if there is a file we ignore (pretty printing) - if not_found: - print() - - # Files to fence - files = list(set(files)) - - # Backup files (if backup doesn't exist yet) - for f in files: - backup = f + '.fibak' - if not(os.path.isfile(backup)): - shutil.copyfile(f, backup) - - # Fix curly braces in files (results.txt is not used) - for f in files: - sf = open(f, 'r') - s = sf.read() - # Check if file contains carriage returns - r = check(s) - if not(r): - print_err('File ' + f + ' contains carriage returns') - sys.exit(1) - sf.close() - # Fix the cases of switch statements - s = fix_case(s) - # Fix the remaining statements - s = fix(s) - sf = open(f, 'w') - sf.write(s) - sf.close() - - # Do actual fence insertion (fences: list of pairs, with pair = (num, list), - # with num denoting the line number of the entry in results.txt) - insert_fences(fences) - print('\ndone') - diff --git a/src/musketeer/fence-insertion/test1/clean.sh b/src/musketeer/fence-insertion/test1/clean.sh deleted file mode 100644 index 9a5b29472f0..00000000000 --- a/src/musketeer/fence-insertion/test1/clean.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -rm -f test test1 test2 test3 test.c *.fibak diff --git a/src/musketeer/fence-insertion/test1/results-musk.txt b/src/musketeer/fence-insertion/test1/results-musk.txt deleted file mode 100644 index f6278d128c4..00000000000 --- a/src/musketeer/fence-insertion/test1/results-musk.txt +++ /dev/null @@ -1,21 +0,0 @@ -fence|test.c|test|5|c::exp|test.c|test|5|c::exp -fence|test.c|test|7|c::exp|test.c|test|7|c::exp -fence|test.c|test|59|c::exp|test.c|test|59|c::exp -fence|test.c|test|63|c::exp|test.c|test|63|c::exp -fence|example.c|test|59|c::exp|example.c|test|59|c::exp -fence|test.c|test|65|c::exp|test.c|test|65|c::exp -fence|test.c|test|68|c::exp|test.c|test|68|c::exp -fence|test.c|test|69|c::exp|test.c|test|69|c::exp -fence|test.c|test|71|c::exp|test.c|test|71|c::exp -fence|test.c|test|76|c::exp|test.c|test|76|c::exp -fence|test.c|test|5|c::exp|test.c|test|5|c::exp -fence|test.c|test|59|c::exp|test.c|test|59|c::exp -fence|blabla.c|test|59|c::exp|blabla.c|test|59|c::exp -fence|test.c|test|86|c::exp|test.c|test|86|c::exp -fence|test.c|test|133|c::exp|test.c|test|133|c::exp -fence|test.c|dp_test1|173|c::x|test.c|dp_test1|174|c::y -fence|test.c|dp_test2|184|c::x|test.c|dp_test2|185|c::y -fence|test.c|test|240|x|test.c|test|240|x -fence|test.c|test|240|x|test.c|test|240|x -fence|test.c|test|249|x|test.c|test|247|x -fence|test.c|test|254|x|test.c|test|254|x diff --git a/src/musketeer/fence-insertion/test1/results-other.txt b/src/musketeer/fence-insertion/test1/results-other.txt deleted file mode 100644 index ca34c1984df..00000000000 --- a/src/musketeer/fence-insertion/test1/results-other.txt +++ /dev/null @@ -1,21 +0,0 @@ -fence|test.c|5|c::exp|0 -fence|test.c|7|c::exp|0 -fence|test.c|59|c::exp|0 -fence|test.c|63|c::exp|0 -fence|example.c|59|c::exp|0 -fence|test.c|65|c::exp|0 -fence|test.c|68|c::exp|0 -fence|test.c|69|c::exp|0 -fence|test.c|71|c::exp|0 -fence|test.c|76|c::exp|0 -fence|test.c|5|c::exp|0 -fence|test.c|59|c::exp|0 -fence|blabla.c|59|c::exp|0 -fence|test.c|86|c::exp|0 -fence|test.c|133|c::exp|0 -fence|test.c|173|c::x|0 -fence|test.c|184|c::x|0 -fence|test.c|240|x|0 -fence|test.c|240|x|0 -fence|test.c|249|x|0 -fence|test.c|254|x|0 diff --git a/src/musketeer/fence-insertion/test1/test.sh b/src/musketeer/fence-insertion/test1/test.sh deleted file mode 100644 index a1891f5bc18..00000000000 --- a/src/musketeer/fence-insertion/test1/test.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -set -e - -T='test.sh:' - -prepare() { - ./clean.sh - cp test.c.orig test.c -} - -prepare -gcc -std=c99 -Wall -o test1 test.c -echo -e $T 'Original compiled successfully.\n' - -prepare -../fi.py x86 fence musk results-musk.txt -gcc -std=c99 -Wall -o test2 test.c -echo -e $T 'Fenced compiled successfully (musketeer format).\n' - -prepare -../fi.py x86 fence other results-other.txt -gcc -std=c99 -Wall -o test3 test.c -echo -e $T 'Fenced compiled successfully (other format).' - -./clean.sh diff --git a/src/musketeer/fence-insertion/test2/clean.sh b/src/musketeer/fence-insertion/test2/clean.sh deleted file mode 100644 index 9e636f1f7d7..00000000000 --- a/src/musketeer/fence-insertion/test2/clean.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -rm -f test test1 test2 test.c *.fibak diff --git a/src/musketeer/fence-insertion/test2/results.txt b/src/musketeer/fence-insertion/test2/results.txt deleted file mode 100644 index 0627c6a1035..00000000000 --- a/src/musketeer/fence-insertion/test2/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -fence|test.c|thr1|14|c::flag1|test.c|thr1|10|c::flag2 -fence|test.c|thr1|9|c::flag1|test.c|thr1|10|c::flag2 -fence|test.c|thr2|26|c::flag2|test.c|thr2|27|c::flag1 -fence|test.c|thr2|26|c::flag2|test.c|thr2|30|c::turn -fence|test.c|thr2|29|c::flag2|test.c|thr2|30|c::turn -fence|test.c|thr2|31|c::flag2|test.c|thr2|27|c::flag1 diff --git a/src/musketeer/fence-insertion/test2/test.sh b/src/musketeer/fence-insertion/test2/test.sh deleted file mode 100644 index 4d4f5c7e069..00000000000 --- a/src/musketeer/fence-insertion/test2/test.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -set -e - -T='test.sh:' - -prepare() { - ./clean.sh - cp test.c.orig test.c -} - -prepare -gcc -std=c99 -Wall -o test1 test.c -echo -e $T 'Original compiled successfully.\n' - -prepare -../fi.py x86 fence musk results.txt -gcc -std=c99 -Wall -o test2 test.c -echo -e $T 'Fenced compiled successfully (musketeer format).\n' - -./clean.sh diff --git a/src/musketeer/fence_assert.cpp b/src/musketeer/fence_assert.cpp deleted file mode 100644 index d44faf74689..00000000000 --- a/src/musketeer/fence_assert.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/*******************************************************************\ - -Module: ILP construction for cycles affecting user-assertions - and resolution - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP construction for cycles affecting user-assertions and resolution - -#include "fence_assert.h" - -bool fence_assert_insertert::find_assert( - const event_grapht::critical_cyclet &cycle) const -{ - /* TODO */ - return true; -} - -void fence_assert_insertert::process_cycles_selection() -{ - for(std::set::const_iterator - C_j=instrumenter.set_of_cycles.begin(); - C_j!=instrumenter.set_of_cycles.end(); - ++C_j) - { - if( find_assert(*C_j) ) - selected_cycles.insert(C_j->id); - } -} diff --git a/src/musketeer/fence_assert.h b/src/musketeer/fence_assert.h deleted file mode 100644 index bc21b8b5319..00000000000 --- a/src/musketeer/fence_assert.h +++ /dev/null @@ -1,52 +0,0 @@ -/*******************************************************************\ - -Module: ILP construction for cycles affecting user-assertions - and resolution - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP construction for cycles affecting user-assertions and resolution - -#ifndef CPROVER_MUSKETEER_FENCE_ASSERT_H -#define CPROVER_MUSKETEER_FENCE_ASSERT_H - -#include - -#include - -#include "fence_inserter.h" - -class instrumentert; - -class fence_assert_insertert:public fence_insertert -{ -protected: - std::set selected_cycles; - - bool find_assert(const event_grapht::critical_cyclet &cycle) const; - - // overload for base class - virtual void process_cycles_selection(); - - // overload for base class - virtual bool filter_cycles(unsigned cycles_id) const - { - return selected_cycles.find(cycles_id)!=selected_cycles.end(); - } - -public: - explicit fence_assert_insertert(instrumentert &instr): - fence_insertert(instr) - { - } - - fence_assert_insertert(instrumentert &instr, memory_modelt _model): - fence_insertert(instr, _model) - { - } -}; - -#endif // CPROVER_MUSKETEER_FENCE_ASSERT_H diff --git a/src/musketeer/fence_inserter.cpp b/src/musketeer/fence_inserter.cpp deleted file mode 100644 index 10de10049eb..00000000000 --- a/src/musketeer/fence_inserter.cpp +++ /dev/null @@ -1,1107 +0,0 @@ -/*******************************************************************\ - -Module: ILP construction for all cycles and resolution - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP construction for all cycles and resolution - -#include "fence_inserter.h" - -#include - -#include -#include - -#ifdef HAVE_GLPK -#include -#include -#endif - -#include "ilp.h" - -class abstract_eventt; - -unsigned fence_insertert::fence_cost(fence_typet f) const -{ - switch(f) - { - case Fence: - return 3; - case Lwfence: - return 2; - case Dp: - return 1; - case Branching: - return 2; - case Ctlfence: - return 1; - } - UNREACHABLE; - return 0; -} - -void fence_insertert::compute() -{ - compute_fence_options(); - instrumenter.message.status() << "Preprocessing" << messaget::eom; - preprocess(); - instrumenter.message.status() << "Solving" << messaget::eom; - if(unique>0) - solve(); - else - instrumenter.message.result() << "no cycle concerned" << messaget::eom; -} - -void fence_insertert::preprocess() -{ - process_cycles_selection(); - - cycles_visitor.po_edges(po); - - /* TODO: replace lists by sets and carefully count the number of constraints - _with_ removing the existing ones (i.e., those which are not inserted) */ - - instrumenter.message.status() << "Preparing cycles" << messaget::eom; - for(std::set::const_iterator - C_j=instrumenter.set_of_cycles.begin(); - C_j!=instrumenter.set_of_cycles.end(); - ++C_j) - { - /* filtering */ - if(filter_cycles(C_j->id)) - continue; - - std::set new_wr_set; - cycles_visitor.powr_constraint(*C_j, new_wr_set); - powr_constraints.push_back(new_wr_set); - - std::set new_ww_set; - cycles_visitor.poww_constraint(*C_j, new_ww_set); - poww_constraints.push_back(new_ww_set); - - std::set new_rw_set; - cycles_visitor.porw_constraint(*C_j, new_rw_set); - porw_constraints.push_back(new_rw_set); - - std::set new_rr_set; - cycles_visitor.porr_constraint(*C_j, new_rr_set); - porr_constraints.push_back(new_rr_set); - - if(model==Power || model==Unknown) - { - std::set new_comset; - cycles_visitor.com_constraint(*C_j, new_comset); - com_constraints.push_back(new_comset); - } - - assert(powr_constraints.size()==poww_constraints.size()); - assert(poww_constraints.size()==porw_constraints.size()); - assert(porw_constraints.size()==porr_constraints.size()); - } - - // Note: not true if filters - // assert(non_powr_constraints.size()==instrumenter.set_of_cycles.size()); - - // NEW - /* first, powr constraints: for all C_j */ - for(std::list >::const_iterator - e_i=powr_constraints.begin(); - e_i!=powr_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_c_it=e_i->begin(); - e_c_it!=e_i->end(); - ++e_c_it) - { - std::set pt_set; - assert(map_to_e.find(*e_c_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_c_it)->second, pt_set); - } - } - - /* then, poww constraints: for all C_j */ - for(std::list >::const_iterator - e_i=poww_constraints.begin(); - e_i!=poww_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_nc_it=e_i->begin(); - e_nc_it!=e_i->end(); - ++e_nc_it) - { - std::set pt_set; - assert(map_to_e.find(*e_nc_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_nc_it)->second, pt_set); - } - } - - /* then, porw constraints: for all C_j */ - for(std::list >::const_iterator - e_i=porw_constraints.begin(); - e_i!=porw_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_nc_it=e_i->begin(); - e_nc_it!=e_i->end(); - ++e_nc_it) - { - std::set pt_set; - assert(map_to_e.find(*e_nc_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_nc_it)->second, pt_set); - } - } - - /* then, porr constraints: for all C_j */ - for(std::list >::const_iterator - e_i=porr_constraints.begin(); - e_i!=porr_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_nc_it=e_i->begin(); - e_nc_it!=e_i->end(); - ++e_nc_it) - { - std::set pt_set; - assert(map_to_e.find(*e_nc_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_nc_it)->second, pt_set); - } - } - - if(model==Power || model==Unknown) - { - /* finally, Power/ARM constraints for Rfes: for all C_j */ - for(std::list >::const_iterator - e_i=com_constraints.begin(); - e_i!=com_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_c_it=e_i->begin(); - e_c_it!=e_i->end(); - ++e_c_it) - { - std::set ct_set; - assert(invisible_var.map_to_e.find(*e_c_it)!= - invisible_var.map_to_e.end()); - const_graph_visitor.CT(invisible_var.map_to_e.find(*e_c_it)->second, - ct_set); - - std::set ct_not_powr_set; - const_graph_visitor.CT_not_powr( - invisible_var.map_to_e.find(*e_c_it)->second, ct_not_powr_set); - } - } - } -} - -void inline fence_insertert::mip_set_var( - ilpt &ilp, - unsigned &i) -{ -#ifdef HAVE_GLPK - glp_add_cols(ilp.lp, unique*fence_options); - // unsigned i=1; - for(; i<=unique*fence_options; i+=fence_options) - { - const bool has_cost=1; // (po_plus.find(i)==po_plus.end()); - /* has_cost==0 => invisible variable */ - assert(has_cost); // not useful for this problem - - /* computes the sum of the frequencies of the cycles in which - this event appears, if requested */ - float freq_sum=0; - if(with_freq) - { - assert(instrumenter.set_of_cycles.size()==freq_table.size()); - freq_sum += epsilon; - for(std::set::const_iterator - C_j=instrumenter.set_of_cycles.begin(); - C_j!=instrumenter.set_of_cycles.end(); - ++C_j) - { - /* filters */ - if(filter_cycles(C_j->id)) - continue; - - /* if(C_j->find( col_to_var(i) )!=C_j->end()) */ - std::list::const_iterator it; - for(it=C_j->begin(); it!=C_j->end() && col_to_var(i)!=*it; ++it) - { - } - - if(it!=C_j->end()) - freq_sum += freq_table[C_j->id]; - } - } - else - freq_sum=1; - - if(model==Power || model==Unknown) - { - /* dp variable for e */ - const std::string name_dp="dp_"+std::to_string(i); - glp_set_col_name(ilp.lp, i, name_dp.c_str()); - glp_set_col_bnds(ilp.lp, i, GLP_LO, 0.0, 0.0); - glp_set_obj_coef(ilp.lp, i, (has_cost?fence_cost(Dp):0)*freq_sum); - glp_set_col_kind(ilp.lp, i, GLP_BV); - - /* fence variable for e */ - const std::string name_f="f_"+std::to_string(i); - glp_set_col_name(ilp.lp, i+1, name_f.c_str()); - glp_set_col_bnds(ilp.lp, i+1, GLP_LO, 0.0, 0.0); - glp_set_obj_coef(ilp.lp, i+1, (has_cost?fence_cost(Fence):0)*freq_sum); - glp_set_col_kind(ilp.lp, i+1, GLP_BV); - -// Note: uncomment for br and cf fences -#if 0 - /* br variable for e */ - const std::string name_br="br_"+std::to_string(i); - glp_set_col_name(ilp.lp, i+2, name_br.c_str()); - glp_set_col_bnds(ilp.lp, i+2, GLP_LO, 0.0, 0.0); - glp_set_obj_coef( - ilp.lp, i+2, (has_cost?fence_cost(Branching):0)*freq_sum); - glp_set_col_kind(ilp.lp, i+2, GLP_BV); - - /* cf variable for e */ - const std::string name_cf="cf_"+std::to_string(i); - glp_set_col_name(ilp.lp, i+3, name_cf.c_str()); - glp_set_col_bnds(ilp.lp, i+3, GLP_LO, 0.0, 0.0); - glp_set_obj_coef(ilp.lp, i+3, (has_cost?fence_cost(Ctlfence):0)*freq_sum); - glp_set_col_kind(ilp.lp, i+3, GLP_BV); -#endif - - if(model==Power) - { - /* lwf variable for e */ - const std::string name_lwf="lwf_"+std::to_string(i); - glp_set_col_name(ilp.lp, i+2/*4*/, name_lwf.c_str()); - glp_set_col_bnds(ilp.lp, i+2/*4*/, GLP_LO, 0.0, 0.0); - glp_set_obj_coef(ilp.lp, i+2/*4*/, - (has_cost?fence_cost(Lwfence):0)*freq_sum); - glp_set_col_kind(ilp.lp, i+2/*4*/, GLP_BV); - } - } - else - { - /* fence variable for e */ - const std::string name_f="f_"+std::to_string(i); - glp_set_col_name(ilp.lp, i, name_f.c_str()); - glp_set_col_bnds(ilp.lp, i, GLP_LO, 0.0, 0.0); - glp_set_obj_coef(ilp.lp, i, (has_cost?fence_cost(Fence):0)*freq_sum); - glp_set_col_kind(ilp.lp, i, GLP_BV); - } - } -#else - throw "sorry, musketeer requires glpk; please recompile musketeer with glpk"; -#endif -} - -void inline fence_insertert::mip_set_cst(ilpt &ilp, unsigned &i) -{ -#ifdef HAVE_GLPK - glp_add_rows(ilp.lp, constraints_number); - i=1; - - /* first the powr: for all C_j */ - for( - std::list >::const_iterator c_wr_it = - powr_constraints.begin(); - c_wr_it!=powr_constraints.end(); - ++c_wr_it) - { - /* for all e */ - for(std::size_t j=1; j<=c_wr_it->size(); ++j) - { - std::string name="C_"+std::to_string(i)+"_c_wr_"+std::to_string(j); - glp_set_row_name(ilp.lp, i, name.c_str()); - glp_set_row_bnds(ilp.lp, i, GLP_LO, 1.0, 0.0); /* >= 1*/ - ++i; - } - } - - /* then the poww: for all C_j */ - for(std::list >::const_iterator - c_ww_it=poww_constraints.begin(); - c_ww_it!=poww_constraints.end(); - ++c_ww_it) - { - /* for all e */ - for(std::size_t j=1; j<=c_ww_it->size(); ++j) - { - std::string name="C_"+std::to_string(i)+"_c_ww_"+std::to_string(j); - glp_set_row_name(ilp.lp, i, name.c_str()); - glp_set_row_bnds(ilp.lp, i, GLP_LO, 1.0, 0.0); /* >= 1*/ - ++i; - } - } - - /* then the porw: for all C_j */ - for(std::list >::const_iterator - c_rw_it=porw_constraints.begin(); - c_rw_it!=porw_constraints.end(); - ++c_rw_it) - { - /* for all e */ - for(std::size_t j=1; j<=c_rw_it->size(); ++j) - { - std::string name="C_"+std::to_string(i)+"_c_rw_"+std::to_string(j); - glp_set_row_name(ilp.lp, i, name.c_str()); - glp_set_row_bnds(ilp.lp, i, GLP_LO, 1.0, 0.0); /* >= 1*/ - ++i; - } - } - - /* and finally the porr: for all C_j */ - for( - std::list >::const_iterator c_rr_it = - porr_constraints.begin(); - c_rr_it!=porr_constraints.end(); - ++c_rr_it) - { - /* for all e */ - for(std::size_t j=1; j<=c_rr_it->size(); ++j) - { - std::string name="C_"+std::to_string(i)+"_c_rr_"+std::to_string(j); - glp_set_row_name(ilp.lp, i, name.c_str()); - glp_set_row_bnds(ilp.lp, i, GLP_LO, 1.0, 0.0); /* >= 1*/ - ++i; - } - } - - if(model==Power || model==Unknown) - { - for(std::list >::const_iterator - c_it=com_constraints.begin(); - c_it!=com_constraints.end(); - ++c_it) - { - /* for all e */ - for(std::size_t j=1; j<=c_it->size(); ++j) - { - std::string name="C_"+std::to_string(i)+"_c_"+std::to_string(j); - glp_set_row_name(ilp.lp, i, name.c_str()); - glp_set_row_bnds(ilp.lp, i, GLP_LO, 1.0, 0.0); /* >= 1*/ - ++i; - } - } - } -#else - throw "sorry, musketeer requires glpk; please recompile musketeer with glpk"; -#endif -} - -void inline fence_insertert::mip_fill_matrix( - ilpt &ilp, - unsigned &i, - unsigned const_constraints_number, - unsigned const_unique) -{ -#ifdef HAVE_GLPK - unsigned col=1; - unsigned row=1; - i=1; - - /* first, powr constraints: for all C_j */ - for(std::list >::const_iterator - e_i=powr_constraints.begin(); - e_i!=powr_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_c_it=e_i->begin(); - e_c_it!=e_i->end(); - ++e_c_it) - { - std::set pt_set; - assert(map_to_e.find(*e_c_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_c_it)->second, pt_set); - /* sum_e' f_e' */ - for(col=1; col<=unique*fence_options; ++col) - { - assert(row<=const_constraints_number); - assert(col<=const_unique*fence_options); - ilp.imat[i]=row; - ilp.jmat[i]=col; - if(model==Power || model==Unknown) - { - if(pt_set.find(col_to_var(col))!=pt_set.end() - && col_to_fence(col)==Fence) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - else - { - if(pt_set.find(col_to_var(col))!=pt_set.end() && - col_to_fence(col)==Fence) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - ++i; - } - ++row; - } - } - - /* then, poww constraints: for all C_j */ - for(std::list >::const_iterator - e_i=poww_constraints.begin(); - e_i!=poww_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_nc_it=e_i->begin(); - e_nc_it!=e_i->end(); - ++e_nc_it) - { - std::set pt_set; - assert(map_to_e.find(*e_nc_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_nc_it)->second, pt_set); - /* sum_e' (f_e' + lwf_e') */ - for(col=1; col<=unique*fence_options; ++col) - { - assert(row<=const_constraints_number); - assert(col<=const_unique*fence_options); - ilp.imat[i]=row; - ilp.jmat[i]=col; - if(model==Power) - { - if(pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Lwfence || col_to_fence(col)==Fence)) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - else - { - if(pt_set.find(col_to_var(col))!=pt_set.end() && - col_to_fence(col)==Fence) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - ++i; - } - ++row; - } - } - - /* then, porw constraints: for all C_j */ - for(std::list >::const_iterator - e_i=porw_constraints.begin(); - e_i!=porw_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_nc_it=e_i->begin(); - e_nc_it!=e_i->end(); - ++e_nc_it) - { - std::set pt_set; - assert(map_to_e.find(*e_nc_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_nc_it)->second, pt_set); - /* dp_e + sum_e' (f_e' + lwf_e' + br_e') */ - for(col=1; col<=unique*fence_options; ++col) - { - assert(row<=const_constraints_number); - assert(col<=const_unique*fence_options); - ilp.imat[i]=row; - ilp.jmat[i]=col; - if(model==Power) - { - if(col==var_fence_to_col(Dp, *e_nc_it) || - (pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Lwfence || - col_to_fence(col)==Fence -#if 0 - || col_to_fence(col)==Branching -#endif - ))) // NOLINT(whitespace/parens) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - else if(model==Unknown) - { - if(col==var_fence_to_col(Dp, *e_nc_it) || - (pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Fence -#if 0 - || col_to_fence(col)==Branching -#endif - ))) // NOLINT(whitespace/parens) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - else - { - if(pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Fence -#if 0 - || col_to_fence(col)==Branching -#endif - )) // NOLINT(whitespace/parens) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - ++i; - } - ++row; - } - } - - /* then, porr constraints: for all C_j */ - for(std::list >::const_iterator - e_i=porr_constraints.begin(); - e_i!=porr_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_nc_it=e_i->begin(); - e_nc_it!=e_i->end(); - ++e_nc_it) - { - std::set pt_set; - assert(map_to_e.find(*e_nc_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_nc_it)->second, pt_set); -// uncomment for cf -#if 0 - std::set it_set; - IT(map_to_e.find(*e_nc_it)->second, it_set); -#endif - /* dp_e + sum_e' (f_e' + lwf_e') + sum_e'' cf_e'') */ - for(col=1; col<=unique*fence_options; ++col) - { - assert(row<=const_constraints_number); - assert(col<=const_unique*fence_options); - ilp.imat[i]=row; - ilp.jmat[i]=col; - if(model==Power) - { - if(col==var_fence_to_col(Dp, *e_nc_it) || - (pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Lwfence || col_to_fence(col)==Fence)) -#if 0 - || (it_set.find(col_to_var(col))!=it_set.end() - && col_to_fence(col)==Ctlfence) -#endif - ) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - else if(model==Unknown) - { - if(col==var_fence_to_col(Dp, *e_nc_it) || - (pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Fence)) -#if 0 - || (it_set.find(col_to_var(col))!=it_set.end() - && col_to_fence(col)==Ctlfence) -#endif - ) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - else - { - if(pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Fence)) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - ++i; - } - ++row; - } - } - - if(model==Power || model==Unknown) - { - /* finally, Power/ARM constraints for Rfes: for all C_j */ - for(std::list >::const_iterator - e_i=com_constraints.begin(); - e_i!=com_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_c_it=e_i->begin(); - e_c_it!=e_i->end(); - ++e_c_it) - { - unsigned possibilities_met=0; - - std::set ct_set; - assert(invisible_var.map_to_e.find(*e_c_it)!= - invisible_var.map_to_e.end()); - const_graph_visitor.CT(invisible_var.map_to_e.find(*e_c_it)->second, - ct_set); - - std::set ct_not_powr_set; - const_graph_visitor.CT_not_powr(invisible_var.map_to_e.find( - *e_c_it)->second, ct_not_powr_set); - - instrumenter.message.statistics() << "size of CT for " - << invisible_var.map_to_e.find(*e_c_it)->second.first << "," - << invisible_var.map_to_e.find(*e_c_it)->second.second << ": " - << ct_set.size() << messaget::eom; - - /* sum_e' f_e' + sum_e'' lwf_e'' */ - for(col=1; col<=unique*fence_options; ++col) - { - assert(row<=const_constraints_number); - assert(col<=const_unique*fence_options); - ilp.imat[i]=row; - ilp.jmat[i]=col; - if((ct_set.find(col_to_var(col))!=ct_set.end() && - col_to_fence(col)==Fence) || - (ct_not_powr_set.find(col_to_var(col))!=ct_not_powr_set.end() && - col_to_fence(col)==Lwfence)) - { - ilp.vmat[i]=1.0; - ++possibilities_met; - } - else - ilp.vmat[i]=0.0; - ++i; - } - ++row; - assert(possibilities_met); - } - } - } - instrumenter.message.debug() << "3: " << i << " row: " << row - << messaget::eom; -#else - throw "sorry, musketeer requires glpk; please recompile musketeer with glpk"; -#endif -} - -void fence_insertert::solve() -{ -#ifdef HAVE_GLPK - ilpt ilp; - - instrumenter.message.statistics() << "po^+ edges considered:" - << unique << " cycles:" << instrumenter.set_of_cycles.size() - << messaget::eom; - - /* sets the variables and coefficients */ - // nb of po+ considered * types of fences (_e) - unsigned i=1; - mip_set_var(ilp, i); - - /* sets the constraints */ - mip_set_cst(ilp, i); - - instrumenter.message.debug() << "3: " << i << messaget::eom; - assert(i-1==constraints_number); - - const std::size_t const_constraints_number=constraints_number; - const unsigned const_unique=unique; - - const std::size_t mat_size= - // NOLINTNEXTLINE(whitespace/operators) - const_unique*fence_options*const_constraints_number; - instrumenter.message.statistics() << "size of the system: " << mat_size - << messaget::eom; - instrumenter.message.statistics() << "# of constraints: " - << const_constraints_number << messaget::eom; - instrumenter.message.statistics() << "# of variables: " - << const_unique*fence_options << messaget::eom; - - ilp.set_size(mat_size); - -#ifdef DEBUG - print_vars(); -#endif - - /* fills the constraints coeff */ - /* tables read from 1 in glpk -- first row/column ignored */ - mip_fill_matrix(ilp, i, const_constraints_number, const_unique); - - instrumenter.message.statistics() << "i: " << i << " mat_size: " << mat_size - << messaget::eom; - // assert(i-1==mat_size); - -#ifdef DEBUG - for(i=1; i<=mat_size; ++i) - instrumenter.message.debug() << i << "[" << ilp.imat[i] << "," - << ilp.jmat[i] << "]=" << ilp.vmat[i] << messaget::eom; -#endif - - /* solves MIP by branch-and-cut */ - ilp.solve(); - -#ifdef DEBUG - print_vars(); -#endif - - /* checks optimality */ - switch(glp_mip_status(ilp.lp)) - { - case GLP_OPT: - instrumenter.message.result() << "Optimal solution found" - << messaget::eom; - break; - case GLP_UNDEF: - instrumenter.message.result() << "Solution undefined" << messaget::eom; - UNREACHABLE; - case GLP_FEAS: - instrumenter.message.result() << "Solution feasible, " - << "yet not proven optimal, " - << "due to early termination" - << messaget::eom; - break; - case GLP_NOFEAS: - instrumenter.message.result() - << "No feasible solution, the system is UNSAT" << messaget::eom; - UNREACHABLE; - } - - event_grapht &egraph=instrumenter.egraph; - - /* loads results (x_i) */ - instrumenter.message.statistics() << "minimal cost: " - << glp_mip_obj_val(ilp.lp) << messaget::eom; - for(unsigned j=1; j<=const_unique*fence_options; ++j) - { - if(glp_mip_col_val(ilp.lp, j)>=1) - { - /* insert that fence */ - assert(map_to_e.find(col_to_var(j))!=map_to_e.end()); - const edget &delay=map_to_e.find(col_to_var(j))->second; - instrumenter.message.statistics() << delay.first << " -> " - << delay.second << " : " << to_string(col_to_fence(j)) - << messaget::eom; - instrumenter.message.statistics() << "(between " - << egraph[delay.first].source_location << " and " - << egraph[delay.second].source_location << messaget::eom; - fenced_edges.insert( - std::pair(delay, col_to_fence(j))); - } - } -#else - throw "sorry, musketeer requires glpk; please recompile musketeer with glpk"; -#endif -} - -void fence_insertert::import_freq() -{ - /* TODO */ -} - -void fence_insertert::print_to_file() -{ - /* removes redundant (due to several call to the same fenced function) */ - std::set non_redundant_display; - for(std::map::const_iterator it=fenced_edges.begin(); - it!=fenced_edges.end(); - ++it) - { - std::ostringstream s; - const abstract_eventt &first=instrumenter.egraph[it->first.first]; - - s << to_string(it->second) << "|" << first.source_location.get_file() - << "|" << first.source_location.get_line() << "|" - << first.source_location.get_column() << '\n'; - non_redundant_display.insert(s.str()); - } - - std::ofstream results; - results.open("results.txt"); - for(std::set::const_iterator it=non_redundant_display.begin(); - it!=non_redundant_display.end(); - ++it) - results << *it; - results.close(); -} - -/* prints final results */ -void fence_insertert::print_to_file_2() -{ - /* removes redundant (due to several call to the same fenced function) */ - std::set non_redundant_display; - for(std::map::const_iterator it=fenced_edges.begin(); - it!=fenced_edges.end(); - ++it) - { - std::ostringstream s; - const abstract_eventt &first=instrumenter.egraph[it->first.first]; - const abstract_eventt &second=instrumenter.egraph[it->first.second]; - - s << to_string(it->second) << "|" << first.source_location.get_file() - << "|" << first.source_location.get_line() << "|" - << second.source_location.get_file() - << "|" << second.source_location.get_line() << '\n'; - non_redundant_display.insert(s.str()); - } - - std::ofstream results; - results.open("results.txt"); - for(std::set::const_iterator it=non_redundant_display.begin(); - it!=non_redundant_display.end(); - ++it) - results << *it; - results.close(); -} - -/* prints final results */ -void fence_insertert::print_to_file_3() -{ - /* removes redundant (due to several call to the same fenced function) */ - std::set non_redundant_display; - for(std::map::const_iterator it=fenced_edges.begin(); - it!=fenced_edges.end(); - ++it) - { - std::ostringstream s; - const abstract_eventt &first=instrumenter.egraph[it->first.first]; - const abstract_eventt &second=instrumenter.egraph[it->first.second]; - - try - { - s << to_string(it->second) << "|" << first.source_location.get_file() - << "|" << first.source_location.get_function() << "|" - << first.source_location.get_line() << "|" << first.variable << "|" - << second.source_location.get_file() << "|" - << second.source_location.get_function() << "|" - << second.source_location.get_line() - << "|" << second.variable << '\n'; - non_redundant_display.insert(s.str()); - } - catch(std::string s) - { - instrumenter.message.warning() - << "Couldn't retrieve symbols of variables " << first.variable - << " and " << second.variable << " due to " << s << messaget::eom; - } - } - - std::ofstream results; - results.open("results.txt"); - for(std::set::const_iterator it=non_redundant_display.begin(); - it!=non_redundant_display.end(); - ++it) - results << *it; - results.close(); -} - -/* prints final results */ -void fence_insertert::print_to_file_4() -{ - /* removes redundant (due to several call to the same fenced function) */ - std::set non_redundant_display; - for(std::map::const_iterator it=fenced_edges.begin(); - it!=fenced_edges.end(); - ++it) - { - std::ostringstream s; - const abstract_eventt &first=instrumenter.egraph[it->first.first]; - const abstract_eventt &second=instrumenter.egraph[it->first.second]; - - try - { - s << to_string(it->second) << "|" << first.source_location.get_file() - << "|" << first.source_location.get_function() << "|" - << first.source_location.get_line() - << "|" << first.variable << "|" - << get_type(first.variable).get("#c_type") << "|" - << second.source_location.get_file() << "|" - << second.source_location.get_function() << "|" - << second.source_location.get_line() - << "|" << second.variable << "|" - << get_type(second.variable).get("#c_type") << '\n'; - non_redundant_display.insert(s.str()); - } - catch (std::string s) - { - instrumenter.message.warning() - << "Couldn't retrieve types of variables " << first.variable - << " and " << second.variable << " due to " << s << messaget::eom; - } - } - - std::ofstream results; - results.open("results.txt"); - for(std::set::const_iterator it=non_redundant_display.begin(); - it!=non_redundant_display.end(); - ++it) - results << *it; - results.close(); -} - -std::string fence_insertert::to_string(fence_typet f) const -{ - switch(f) - { - case Fence: return "fence"; - case Lwfence: return "lwfence"; - case Dp: return "dp"; - case Branching: return "branching"; - case Ctlfence: return "ctlfence"; - } - UNREACHABLE; -} - -inline unsigned fence_insertert::col_to_var(unsigned u) const -{ - return (u-u%fence_options)/fence_options+(u%fence_options!=0?1:0); -} - -inline fence_insertert::fence_typet fence_insertert::col_to_fence(unsigned u) - const -{ - switch(u%fence_options) - { - case 0: return Fence; - case 1: return Dp; - case 2: return Lwfence; - case 3: return Branching; - case 4: return Ctlfence; - } - UNREACHABLE; -} - -inline unsigned fence_insertert::var_fence_to_col(fence_typet f, unsigned var) - const -{ - switch(f) - { - case Fence: return var*fence_options; - case Dp: return (var-1)*fence_options+1; - case Lwfence: return (var-1)*fence_options+2; - case Branching: return (var-1)*fence_options+3; - case Ctlfence: return (var-1)*fence_options+4; - } - UNREACHABLE; -} - -void fence_insertert::compute_fence_options() -{ - switch(model) - { - case TSO: - case PSO: - case RMO: - fence_options=1; // 2: f, br - break; - case Power: - fence_options=3; // 5: f, lwf, dp, cf, br - break; - case Unknown: /* including ARM */ - fence_options=2; // 4: f, dp, cf, br - break; - } -} - -void fence_insertert::print_vars() const -{ - instrumenter.message.statistics() - << "---- pos/pos+ (visible) variables ----" << messaget::eom; - for(std::map::const_iterator it=map_from_e.begin(); - it!=map_from_e.end(); ++it) - instrumenter.message.statistics() << it->first.first << "," - << it->first.second << messaget::eom; - instrumenter.message.statistics() << "---- cmp (invisible) variables ----" - << messaget::eom; - for(std::map::const_iterator it= - invisible_var.map_from_e.begin(); - it!=invisible_var.map_from_e.end(); ++it) - instrumenter.message.statistics() << it->first.first << "," - << it->first.second << messaget::eom; - instrumenter.message.statistics() << "-----------------------------------" - << messaget::eom; -} - -typet fence_insertert::get_type(const irep_idt &id) -{ - std::string copy=id2string(id); - /* if we picked an array, removes [] that rw_set added */ - if(copy.find("[]")!=std::string::npos) - copy=copy.substr(0, copy.find_last_of("[]")-1); - try - { - return instrumenter.ns.lookup(copy).type; - } - catch(...) - { - std::list fields; - std::string current; - - /* collects the consecutive fields */ - std::string::const_iterator it=copy.begin(); - std::string::const_iterator next=it; - for(; it!=copy.end(); ++it) - { - next=it; - ++next; - if(!(*it=='.' || (next!=copy.end() && *it=='-' && *next=='>'))) - { - current+=*it; - instrumenter.message.debug() << current << messaget::eom; - } - else - { - fields.push_back(current); - current.clear(); - if(*it!='.') - ++it; - /* safe as next!=copy.end() */ - assert(next!=copy.end()); - } - } - - /* retrieves the type of the accessed field */ - typet field=type_component(fields.begin(), fields.end(), - instrumenter.ns.lookup(fields.front()).type); - return field; - } -} - -typet fence_insertert::type_component( - std::list::const_iterator it, - std::list::const_iterator end, - const typet &type) -{ - if(it==end) - return type; - - if(type.id()==ID_struct) - { - const struct_union_typet &str=to_struct_union_type(type); - typet comp_type=str.component_type(*it); - ++it; - return type_component(it, end, comp_type); - } - - if(type.id()==ID_symbol) - { - return type; - } - - UNREACHABLE; -} diff --git a/src/musketeer/fence_inserter.h b/src/musketeer/fence_inserter.h deleted file mode 100644 index e24a32dbc11..00000000000 --- a/src/musketeer/fence_inserter.h +++ /dev/null @@ -1,196 +0,0 @@ -/*******************************************************************\ - -Module: ILP construction for all cycles and resolution - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP construction for all cycles and resolution - -#ifndef CPROVER_MUSKETEER_FENCE_INSERTER_H -#define CPROVER_MUSKETEER_FENCE_INSERTER_H - -#include -#include - -// Note: no forward declaration for instrumentert as we derive fence_insertert -#include - -#include -#include - -#include "graph_visitor.h" -#include "cycles_visitor.h" - -class abstract_eventt; -class ilpt; - -// TODO: can be indirectly replaced by a list without redundancy -// (not a set though) -struct mip_vart -{ - typedef event_grapht::critical_cyclet::delayt edget; - - unsigned unique; - - std::map map_to_e; - std::map map_from_e; - - unsigned add_edge(const edget &e) - { - if(map_from_e.find(e) != map_from_e.end()) - return map_from_e[e]; - else - { - ++unique; - map_to_e.insert(std::pair(unique, e)); - map_from_e[e] = unique; - return unique; - } - } - - mip_vart():unique(0) - { - } -}; - -/* in essence: cycles + goto-prog -> ilp */ -class fence_insertert -{ -public: - typedef event_grapht::critical_cyclet::delayt edget; - - instrumentert &instrumenter; - - /// normal variables used almost every time - std::map &map_to_e; - std::map &map_from_e; - unsigned add_edge(const edget &e) { return var.add_edge(e); } - unsigned add_invisible_edge(const edget &e) - { - return invisible_var.add_edge(e); - } - - /// number of constraints - std::size_t constraints_number; - const memory_modelt model; - - /// to retrieve the concrete graph edges involved in the (abstract) cycles - const_graph_visitort const_graph_visitor; - -protected: - unsigned &unique; - unsigned fence_options; - - /* MIP variables to edges in po^+/\C */ - mip_vart var; - - /* MIP invisible variables (com) */ - mip_vart invisible_var; - - /* MIP matrix construction */ - void mip_set_var(ilpt &ilp, unsigned &i); - void mip_set_cst(ilpt &ilp, unsigned &i); - void mip_fill_matrix( - ilpt &ilp, - unsigned &i, - unsigned const_constraints_number, - unsigned const_unique); - - /* preprocessing (necessary as glpk static) and solving */ - void preprocess(); - void solve(); - - enum fence_typet { Fence=0, Dp=1, Lwfence=2, Branching=3, Ctlfence=4 }; - virtual unsigned fence_cost(fence_typet e) const; - - std::string to_string(fence_typet f) const; - - /* for the preprocessing */ - std::set po; - std::list > powr_constraints; - std::list > poww_constraints; - std::list > porw_constraints; - std::list > porr_constraints; - std::list > com_constraints; - - /* to retrieve the edges involved in the cycles */ - cycles_visitort cycles_visitor; - - /* conversion column <-> (MIP variable, fence type) */ - unsigned col_to_var(unsigned u) const; - fence_typet col_to_fence(unsigned u) const; - unsigned var_fence_to_col(fence_typet f, unsigned var) const; - - /* for the frequencies sum */ - const float epsilon; - const bool with_freq; - std::map freq_table; - - void import_freq(); - - /* computes the fence options */ - void compute_fence_options(); - - /* debug */ - void print_vars() const; - - /* storing final results */ - std::map fenced_edges; - -public: - explicit fence_insertert(instrumentert &instr): - instrumenter(instr), map_to_e(var.map_to_e), map_from_e(var.map_from_e), - constraints_number(0), model(TSO), const_graph_visitor(*this), - unique(var.unique), fence_options(0), cycles_visitor(*this), - epsilon(0.001), with_freq(false) - { - } - - fence_insertert(instrumentert &instr, memory_modelt _model): - instrumenter(instr), map_to_e(var.map_to_e), map_from_e(var.map_from_e), - constraints_number(0), model(_model), const_graph_visitor(*this), - unique(var.unique), fence_options(0), cycles_visitor(*this), - epsilon(0.001), with_freq(false) - { - } - - /* do it */ - void compute(); - - /* selection methods */ - // Note: process_selection updates the selection of cycles in instrumenter, - // whereas filter just ignores some - virtual void process_cycles_selection() { } - virtual bool filter_cycles(unsigned cycle_id) const { return false; } - - /* prints final results */ - void print_to_file(); - void print_to_file_2(); - void print_to_file_3(); - void print_to_file_4(); - - /* TODO: to be replaced eventually by ns.lookup and basename */ - static std::string remove_extra(const irep_idt &id) - { - const std::string copy=id2string(id); - return remove_extra(copy); - } - - static std::string remove_extra(std::string copy) - { - if(copy.find("::")==std::string::npos) - return copy; - return copy.substr(copy.find_last_of("::")+1); - } - - typet get_type(const irep_idt &id); - typet type_component( - std::list::const_iterator it, - std::list::const_iterator end, - const typet &type); -}; - -#endif // CPROVER_MUSKETEER_FENCE_INSERTER_H diff --git a/src/musketeer/fence_shared.cpp b/src/musketeer/fence_shared.cpp deleted file mode 100644 index 01b608cc1e6..00000000000 --- a/src/musketeer/fence_shared.cpp +++ /dev/null @@ -1,591 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Vincent Nimal - -\*******************************************************************/ - -#include "fence_shared.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -// #include - -#ifdef LOCAL_MAY -#include -#endif - -#define OUTPUT(s, fence, file, line, id, type) \ - s< writes; - std::list reads; - } fenced_edges; - - virtual void compute()=0; - - /* prints final results */ - void print_to_file() const - { - source_locationt emptyloc; - - /* removes redundant (due to several call to the same fenced function) */ - std::set non_redundant_display; - - for(std::list::const_iterator it=fenced_edges.writes.begin(); - it!=fenced_edges.writes.end(); - ++it) - { - std::ostringstream s; - - if(it->source_location().as_string().empty()) - continue; - - OUTPUT( - s, - "fence", - it->source_location().get_file(), - it->source_location().get_line(), - ns.lookup(it->get_identifier()).base_name, - "Write"); - non_redundant_display.insert(s.str()); - } - - for(std::list::const_iterator it=fenced_edges.reads.begin(); - it!=fenced_edges.reads.end(); - ++it) - { - std::ostringstream s; - - if(it->source_location().as_string().empty()) - continue; - - OUTPUT( - s, - "fence", - it->source_location().get_file(), - it->source_location().get_line(), - ns.lookup(it->get_identifier()).base_name, - "Read"); - non_redundant_display.insert(s.str()); - } - - std::ofstream results; - results.open("results.txt"); - for(std::set::const_iterator it=non_redundant_display.begin(); - it!=non_redundant_display.end(); - ++it) - results << *it; - results.close(); - } - -public: - explicit simple_insertiont( - messaget &_message, - value_setst &_value_sets, - const goto_modelt &_goto_model): - message(_message), value_sets(_value_sets), - symbol_table(_goto_model.symbol_table), - ns(_goto_model.symbol_table), - goto_functions(_goto_model.goto_functions) - {} - - virtual ~simple_insertiont() {} - - void do_it() - { - compute(); - print_to_file(); - } -}; - -/* fence insertion for all shared accesses */ -class fence_all_sharedt:public simple_insertiont -{ -protected: - void compute(); - -public: - fence_all_sharedt( - messaget &_message, - value_setst &_value_sets, - const goto_modelt &_goto_model): - simple_insertiont(_message, _value_sets, _goto_model) - {} -}; - -/* fence insertion for all shared accesses */ -class fence_all_shared_aegt:public fence_all_sharedt -{ -protected: - void compute(); - std::set visited_functions; - void fence_all_shared_aeg_explore(const goto_programt &code -#ifdef LOCAL_MAY - , local_may_aliast &local_may -#endif - ); // NOLINT(whitespace/parens) - -public: - fence_all_shared_aegt( - messaget &_message, - value_setst &_value_sets, - const goto_modelt &_goto_model): - fence_all_sharedt(_message, _value_sets, _goto_model) - {} -}; - -/* fence insertion for volatile accesses (a la MSVC) */ -class fence_volatilet:public simple_insertiont -{ -protected: - void compute(); - bool is_volatile(const typet &src) const; - -public: - fence_volatilet( - messaget &_message, - value_setst &_value_sets, - const goto_modelt &_goto_model): - simple_insertiont(_message, _value_sets, _goto_model) - {} -}; - -/// we can determine whether an access is volatile just by looking at the type -/// of the variables involved in the expression. We assume that the program is -/// correctly typed (i.e., volatile-marked) -bool fence_volatilet::is_volatile(const typet &src) const -{ - if(src.get_bool(ID_C_volatile)) - return true; - -// std::cout << "type: " << src << " has sub: " -// << src.subtypes().empty() /*src.has_subtypes()*/ << '\n'; - if(src.id()==ID_symbol) - { - symbol_tablet::symbolst::const_iterator s_it= - symbol_table.symbols.find(to_symbol_type(src).get_identifier()); - assert(s_it!=symbol_table.symbols.end()); - return is_volatile(s_it->second.type); - } - else if(src.has_subtype()) - { - /* if a pointer points to a volatile variable, then any access through this - pointer has also to be considered as volatile (conservative) */ - if(is_volatile(src.subtype())) - return true; - } - else if(src.has_subtypes()) - { - /* if a pointer points to a volatile variable, then any access through this - pointer has also to be considered as volatile (conservative) */ - bool vol=false; - for(typet::subtypest::const_iterator it=src.subtypes().begin(); - it!=src.subtypes().end(); - ++it) - { - // std::cout << *it << '\n'; - vol|=is_volatile(*it); - if(vol) - break; - } - return vol; - } - - return false; -} - -void fence_volatilet::compute() -{ - std::cout << "--------\n"; - - forall_goto_functions(f_it, goto_functions) - { - #ifdef LOCAL_MAY - local_may_aliast local_may(f_it->second); - #endif - - forall_goto_program_instructions(i_it, f_it->second.body) - { - rw_set_loct rw_set(ns, value_sets, i_it - #ifdef LOCAL_MAY - , local_may - #endif - ); // NOLINT(whitespace/parens) - forall_rw_set_w_entries(w_it, rw_set) - { - if(has_prefix(id2string(w_it->second.object), CPROVER_PREFIX)) - continue; - - try - { - message.debug() << "debug: " - << id2string(w_it->second.object) << messaget::eom; - const symbolt &var=ns.lookup(w_it->second.object); - if(is_volatile(var.type)) - { - message.debug() << "volatile: " - << id2string(w_it->second.object) << messaget::eom; - fenced_edges.writes.push_front(w_it->second.symbol_expr); - } - } - catch(std::string s) - { - message.warning() << "failed to find" << s - << messaget::eom; - continue; - } - } - forall_rw_set_r_entries(r_it, rw_set) - { - if(has_prefix(id2string(r_it->second.object), CPROVER_PREFIX)) - continue; - - try - { - message.debug() << "debug: " - << id2string(r_it->second.object) << messaget::eom; - const symbolt &var=ns.lookup(r_it->second.object); - #if 0 - // NOLINTNEXTLINE(readability/braces) - if(var.is_volatile && !var.is_thread_local) - #endif - if(is_volatile(var.type)) - { - message.debug() << "volatile: " - << id2string(r_it->second.object) << messaget::eom; - fenced_edges.reads.push_front(r_it->second.symbol_expr); - } - } - catch (std::string s) - { - message.warning() << "failed to find" << s - << messaget::eom; - continue; - } - } - } - } -} - -void fence_all_sharedt::compute() -{ - std::cout << "--------\n"; - - forall_goto_functions(f_it, goto_functions) - { -#ifdef LOCAL_MAY - local_may_aliast local_may(f_it->second); -#endif - - forall_goto_program_instructions(i_it, f_it->second.body) - { - if(i_it->is_function_call()) - continue; - - rw_set_with_trackt rw_set(ns, value_sets, i_it -#ifdef LOCAL_MAY - , local_may -#endif - ); // NOLINT(whitespace/parens) - forall_rw_set_w_entries(w_it, rw_set) - { - if(has_prefix(id2string(w_it->second.object), CPROVER_PREFIX)) - continue; - - try - { - const symbolt &var=ns.lookup(w_it->second.object); - message.debug() << "debug: " - << id2string(w_it->second.object) << " shared: " << var.is_shared() - << " loc: " << w_it->second.symbol_expr.source_location() - << messaget::eom; - if(var.is_shared()) - { - /* this variable has perhaps been discovered after dereferencing - a pointer. We want to report this pointer */ - std::map &ref= - rw_set.dereferenced_from; - if(ref.find(w_it->second.object)!=ref.end()) - { - const irep_idt from=ref[w_it->second.object]; - const rw_set_baset::entryt &entry= - rw_set.set_reads.find(from)!=rw_set.set_reads.end() ? - rw_set.r_entries[from] : - rw_set.w_entries[from]; - message.debug() << "shared: (through " - << id2string(w_it->second.object) << ") " << entry.object - << messaget::eom; - fenced_edges.writes.push_front(entry.symbol_expr); - } - else - { - message.debug() << "shared: " - << id2string(w_it->second.object) << " -> " - << w_it->second.object << messaget::eom; - fenced_edges.writes.push_front(w_it->second.symbol_expr); - } - } - } - catch(std::string s) - { - message.warning() << "failed to find" << s - << messaget::eom; - continue; - } - } - forall_rw_set_r_entries(r_it, rw_set) - { - if(has_prefix(id2string(r_it->second.object), CPROVER_PREFIX)) - continue; - - try - { - const symbolt &var=ns.lookup(r_it->second.object); - message.debug() << "debug: " - << id2string(r_it->second.object) << " shared: " - << var.is_shared() << " loc: " - << r_it->second.symbol_expr.source_location() << messaget::eom; - if(var.is_shared()) - { - /* this variable has perhaps been discovered after dereferencing - a pointer. We want to report this pointer */ - std::map& - ref=rw_set.dereferenced_from; - if(ref.find(r_it->second.object)!=ref.end()) - { - const irep_idt from=ref[r_it->second.object]; - const rw_set_baset::entryt &entry= - rw_set.set_reads.find(from)!=rw_set.set_reads.end() ? - rw_set.r_entries[from] : - rw_set.w_entries[from]; - - message.debug() << "shared: (through " - << id2string(r_it->second.object) << ") " << entry.object - << messaget::eom; - fenced_edges.reads.push_front(entry.symbol_expr); - } - else - { - message.debug() << "shared: " - << id2string(r_it->second.object) << " -> " - << r_it->second.object << messaget::eom; - fenced_edges.reads.push_front(r_it->second.symbol_expr); - } - } - } - catch(std::string s) - { - message.warning() << "failed to find" << s - << messaget::eom; - continue; - } - } - } - } -} - -void fence_all_shared_aegt::compute() -{ - message.status() << "--------" << messaget::eom; - - const goto_functionst::goto_functiont &main= - goto_functions.function_map.find(goto_functionst::entry_point())->second; - #ifdef LOCAL_MAY - local_may_aliast local_may(main); - #endif - - fence_all_shared_aeg_explore(main.body -#ifdef LOCAL_MAY - , local_may -#endif - ); // NOLINT(whitespace/parens) -} - -void fence_all_shared_aegt::fence_all_shared_aeg_explore( - const goto_programt &code -#ifdef LOCAL_MAY - , local_may_aliast &local_may -#endif -) -{ - forall_goto_program_instructions(i_it, code) - { - if(i_it->is_function_call()) - { - const exprt &fun=to_code_function_call(i_it->code).function(); - - if(fun.id()!=goto_functionst::entry_point()) - continue; - - const irep_idt &fun_id=to_symbol_expr(fun).get_identifier(); - - if(visited_functions.find(fun_id)!=visited_functions.end()) - continue; - - visited_functions.insert(fun_id); - fence_all_shared_aeg_explore( - goto_functions.function_map.find(fun_id)->second.body -#ifdef LOCAL_MAY - , local_may -#endif - ); // NOLINT(whitespace/parens) - visited_functions.erase(fun_id); - } - - rw_set_with_trackt rw_set(ns, value_sets, i_it - #ifdef LOCAL_MAY - , local_may - #endif - ); // NOLINT(whitespace/parens) - forall_rw_set_w_entries(w_it, rw_set) - { - if(has_prefix(id2string(w_it->second.object), CPROVER_PREFIX)) - continue; - - try - { - const symbolt &var=ns.lookup(w_it->second.object); - message.debug() << "debug: " - << id2string(w_it->second.object) << " shared: " - << var.is_shared() << " loc: " - << w_it->second.symbol_expr.source_location() << messaget::eom; - if(var.is_shared()) - { - /* this variable has perhaps been discovered after dereferencing - a pointer. We want to report this pointer */ - std::map& - ref=rw_set.dereferenced_from; - if(ref.find(w_it->second.object)!=ref.end()) - { - const irep_idt from=ref[w_it->second.object]; - const rw_set_baset::entryt &entry= - rw_set.set_reads.find(from)!=rw_set.set_reads.end() ? - rw_set.r_entries[from] : - rw_set.w_entries[from]; - - message.debug() << "shared: (through " - << id2string(w_it->second.object) << ") " << entry.object - << messaget::eom; - fenced_edges.writes.push_front(entry.symbol_expr); - } - else - { - message.debug() << "shared: " - << id2string(w_it->second.object) << " -> " - << w_it->second.object << messaget::eom; - fenced_edges.writes.push_front(w_it->second.symbol_expr); - } - } - } - catch(std::string s) - { - message.warning() << "failed to find" << s - << messaget::eom; - continue; - } - } - forall_rw_set_r_entries(r_it, rw_set) - { - if(has_prefix(id2string(r_it->second.object), CPROVER_PREFIX)) - continue; - - try - { - const symbolt &var=ns.lookup(r_it->second.object); - message.debug() << "debug: " - << id2string(r_it->second.object) << " shared: " - <second.symbol_expr.source_location() << messaget::eom; - if(var.is_shared() && var.type.id()!=ID_code) - { - /* this variable has perhaps been discovered after dereferencing - a pointer. We want to report this pointer */ - std::map& - ref=rw_set.dereferenced_from; - if(ref.find(r_it->second.object)!=ref.end()) - { - const irep_idt from=ref[r_it->second.object]; - const rw_set_baset::entryt &entry= - rw_set.set_reads.find(from)!=rw_set.set_reads.end() ? - rw_set.r_entries[from] : - rw_set.w_entries[from]; - - message.debug() << "shared: (through " - << id2string(r_it->second.object) << ") " << entry.object - << messaget::eom; - fenced_edges.reads.push_front(entry.symbol_expr); - } - else - { - message.debug() << "shared: " - << id2string(r_it->second.object) << " -> " - << r_it->second.object << messaget::eom; - fenced_edges.reads.push_front(r_it->second.symbol_expr); - } - } - } - catch(std::string s) - { - message.warning() << "failed to find" << s - << messaget::eom; - continue; - } - } - } -} - -void fence_all_shared( - message_handlert &message_handler, - value_setst &value_sets, - goto_modelt &goto_model) -{ - messaget message(message_handler); - fence_all_sharedt instrumenter(message, value_sets, goto_model); - instrumenter.do_it(); -} - -void fence_all_shared_aeg( - message_handlert &message_handler, - value_setst &value_sets, - goto_modelt &goto_model) -{ - messaget message(message_handler); - fence_all_shared_aegt instrumenter(message, value_sets, goto_model); - instrumenter.do_it(); -} - -void fence_volatile( - message_handlert &message_handler, - value_setst &value_sets, - goto_modelt &goto_model) -{ - messaget message(message_handler); - fence_volatilet instrumenter(message, value_sets, goto_model); - instrumenter.do_it(); -} diff --git a/src/musketeer/fence_shared.h b/src/musketeer/fence_shared.h deleted file mode 100644 index 2aab83ab713..00000000000 --- a/src/musketeer/fence_shared.h +++ /dev/null @@ -1,39 +0,0 @@ -/*******************************************************************\ - -Module: (naive) Fence insertion - -Purpose: fences all the shared or volatile-declared variables - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// (naive) Fence insertion - -#ifndef CPROVER_MUSKETEER_FENCE_SHARED_H -#define CPROVER_MUSKETEER_FENCE_SHARED_H - -class value_setst; -class goto_modelt; -class message_handlert; - -/* finds all the shared variables (including static, global and dynamic) */ -void fence_all_shared( - message_handlert &, - value_setst &, - goto_modelt &); - -/* finds all the shared variables (including static, global and dynamic) */ -void fence_all_shared_aeg( - message_handlert &, - value_setst &, - goto_modelt &); - -/* finds all the volatile-declared variables */ -void fence_volatile( - message_handlert &, - value_setst &, - goto_modelt &); - -#endif // CPROVER_MUSKETEER_FENCE_SHARED_H diff --git a/src/musketeer/fence_user_def.cpp b/src/musketeer/fence_user_def.cpp deleted file mode 100644 index 8bf57a99b8c..00000000000 --- a/src/musketeer/fence_user_def.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/*******************************************************************\ - -Module: ILP construction for cycles affecting user-assertions - and resolution - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP construction for cycles affecting user-assertions and resolution - -#include "fence_user_def.h" - -bool fence_user_def_insertert::contains_user_def( - const event_grapht::critical_cyclet &cycle) const -{ - /* DEPRECATED: user-inserted fences now detected at cycle collection */ - #if 0 - /* if a fence already appears in the representation of the cycle, ok */ - for(event_grapht::critical_cyclet::const_iterator it=cycle.begin(); - it!=cycle.end(); ++it) - if(egraph[*it].is_fence()) - return true; - - /* we collect the fences back in the graph; indeed, in the cycles we extract, - it is possible that some lwfence have been ignored, as they had no effect - (in the case of WR) */ - #endif - - return cycle.has_user_defined_fence; -} - -void fence_user_def_insertert::process_cycles_selection() -{ - for(std::set::const_iterator - C_j=instrumenter.set_of_cycles.begin(); - C_j!=instrumenter.set_of_cycles.end(); - ++C_j) - { - if( contains_user_def(*C_j) ) - selected_cycles.insert(C_j->id); - } -} diff --git a/src/musketeer/fence_user_def.h b/src/musketeer/fence_user_def.h deleted file mode 100644 index 04a1236fd46..00000000000 --- a/src/musketeer/fence_user_def.h +++ /dev/null @@ -1,52 +0,0 @@ -/*******************************************************************\ - -Module: ILP construction for cycles containing user-placed fences - and resolution - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP construction for cycles containing user-placed fences and resolution - -#ifndef CPROVER_MUSKETEER_FENCE_USER_DEF_H -#define CPROVER_MUSKETEER_FENCE_USER_DEF_H - -#include - -#include - -#include "fence_inserter.h" - -class instrumentert; - -class fence_user_def_insertert:public fence_insertert -{ -protected: - std::set selected_cycles; - - bool contains_user_def(const event_grapht::critical_cyclet &cycle) const; - - // overload for base class - virtual void process_cycles_selection(); - - // overload for base class - virtual bool filter_cycles(unsigned cycles_id) const - { - return selected_cycles.find(cycles_id)==selected_cycles.end(); - } - -public: - explicit fence_user_def_insertert(instrumentert &instr): - fence_insertert(instr) - { - } - - fence_user_def_insertert(instrumentert &instr, memory_modelt _model): - fence_insertert(instr, _model) - { - } -}; - -#endif // CPROVER_MUSKETEER_FENCE_USER_DEF_H diff --git a/src/musketeer/fencer.cpp b/src/musketeer/fencer.cpp deleted file mode 100644 index 0c8619e3003..00000000000 --- a/src/musketeer/fencer.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/*******************************************************************\ - -Module: Fence inference: Main - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// Fence inference: Main - -#include "fencer.h" - -#include -#include - -#include -#include -#include - -#include "fence_inserter.h" -#include "fence_user_def.h" -#include "fence_assert.h" - -void fence_weak_memory( - memory_modelt model, - value_setst &value_sets, - goto_modelt &goto_model, - bool SCC, - instrumentation_strategyt event_strategy, - unsigned unwinding_bound, - bool no_cfg_kill, - bool no_dependencies, - loop_strategyt duplicate_body, - unsigned input_max_var, - unsigned input_max_po_trans, - bool render_po, - bool render_file, - bool render_function, - bool cav11_option, - bool hide_internals, - bool print_graph, - infer_modet mode, - message_handlert &message_handler, - bool ignore_arrays) -{ - messaget message(message_handler); - - message.status() << "--------" << messaget::eom; - - // all access to shared variables is pushed into assignments - Forall_goto_functions(f_it, goto_model.goto_functions) - if(f_it->first!=CPROVER_PREFIX "initialize" && - f_it->first!=goto_functionst::entry_point()) - introduce_temporaries(value_sets, goto_model.symbol_table, f_it->first, - f_it->second.body, -#ifdef LOCAL_MAY - f_it->second, -#endif - message); - message.status() << "Temporary variables added" << messaget::eom; - - unsigned max_thds = 0; - instrumentert instrumenter(goto_model, message); - max_thds=instrumenter.goto2graph_cfg(value_sets, model, - no_dependencies, duplicate_body); - ++max_thds; - message.status() << "Abstract event graph computed" << messaget::eom; - - // collects cycles, directly or by SCCs - if(input_max_var!=0 || input_max_po_trans!=0) - instrumenter.set_parameters_collection(input_max_var, input_max_po_trans, - ignore_arrays); - else - instrumenter.set_parameters_collection(max_thds, 0, ignore_arrays); - - if(SCC) - { - instrumenter.collect_cycles_by_SCCs(model); - message.statistics() << "cycles collected: " << messaget::eom; - std::size_t interesting_scc = 0; - std::size_t total_cycles = 0; - for(std::size_t i=0; i=4) - { - message.statistics() << "SCC #" << i << ": " - < -#include - -#include "infer_mode.h" - -class message_handlert; -class value_setst; -class goto_modelt; - -void fence_weak_memory( - memory_modelt model, - value_setst &, - goto_modelt &, - bool SCC, - instrumentation_strategyt event_strategy, - unsigned unwinding_bound, - bool no_cfg_kill, - bool no_dependencies, - loop_strategyt duplicate_body, - unsigned max_var, - unsigned max_po_trans, - bool render_po, - bool render_file, - bool render_function, - bool cav11_option, - bool hide_internals, - bool print_graph, - infer_modet mode, - message_handlert &, - bool ignore_arrays); - -#endif // CPROVER_MUSKETEER_FENCER_H diff --git a/src/musketeer/graph_visitor.cpp b/src/musketeer/graph_visitor.cpp deleted file mode 100644 index 87fe14e0cbf..00000000000 --- a/src/musketeer/graph_visitor.cpp +++ /dev/null @@ -1,484 +0,0 @@ -/*******************************************************************\ - -Module: graph visitor for computing edges involved for fencing - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// graph visitor for computing edges involved for fencing - -#include "graph_visitor.h" - -#include "fence_inserter.h" - -/* implemented: BTWN1, BTWN4 */ -#define BTWN1 - -void const_graph_visitort::graph_explore( - event_grapht &egraph, - event_idt next, - event_idt end, - std::list &old_path, - std::set &edges) -{ - if(next==end) - { - /* inserts all the pos collected from old_path in edges */ - std::list::const_iterator it=old_path.begin(); - std::list::const_iterator next_it=it; - ++next_it; - for( ; next_it!=old_path.end() && it!=old_path.end(); ++it, ++next_it) - { - /* it should be a po_s, and not a po_s^+ */ - assert(egraph.has_po_edge(*it, *next_it)); - edges.insert(fence_inserter.add_edge(edget(*it, *next_it))); - } - } - else if(egraph.po_out(next).empty()) - { - /* this path is not connecting a to b => return */ - } - else - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(next).begin(); - next_it!=egraph.po_out(next).end(); - ++next_it) - { - if(visited_nodes.find(next_it->first)!=visited_nodes.end()) - continue; - visited_nodes.insert(next_it->first); - - old_path.push_back/*front*/(next_it->first); - graph_explore(egraph, next_it->first, end, old_path, edges); - old_path.pop_back/*front*/(); - } - } -} - -void const_graph_visitort::const_graph_explore( - event_grapht &egraph, - event_idt next, - event_idt end, - std::list &old_path) -{ - if(next==end) - { - /* inserts all the pos collected from old_path in edges */ - std::list::const_iterator it=old_path.begin(); - std::list::const_iterator next_it=it; - ++next_it; - for( ; next_it!=old_path.end() && it!=old_path.end(); ++it, ++next_it) - { - /* it should be a po_s, and not a po_s^+ */ - assert(egraph.has_po_edge(*it, *next_it)); - fence_inserter.add_edge(edget(*it, *next_it)); - } - } - else if(egraph.po_out(next).empty()) - { - /* this path is not connecting a to b => return */ - } - else - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(next).begin(); - next_it!=egraph.po_out(next).end(); - ++next_it) - { - if(visited_nodes.find(next_it->first)!=visited_nodes.end()) - continue; - visited_nodes.insert(next_it->first); - - old_path.push_back/*front*/(next_it->first); - const_graph_explore(egraph, next_it->first, end, old_path); - old_path.pop_back/*front*/(); - } - } -} - -void const_graph_visitort::graph_explore_BC( - event_grapht &egraph, - event_idt next, - std::list &old_path, - std::set &edges, - bool porw) -{ - /* TODO: restricts to C_1 U ... U C_n for perf improvement */ - assert(!old_path.empty()); - - fence_inserter.instrumenter.message.debug() << "(BC) explore " - << old_path.front() - << " --...--> " << next - << messaget::eom; - - if(visited_nodes.find(next)!=visited_nodes.end()) - return; - visited_nodes.insert(next); - - /* if all the incoming pos were already visited, add */ - bool no_other_pos = true; - for(wmm_grapht::edgest::const_iterator it= - egraph.po_out(next).begin(); - it!=egraph.po_out(next).end(); - ++it) - if(visited_nodes.find(it->first)==visited_nodes.end()) - { - no_other_pos = false; - break; - } - - if(egraph.po_out(next).empty() || no_other_pos) - { - /* inserts all the pos collected from old_path in edges */ - std::list::const_iterator it=old_path.begin(); - std::list::const_iterator next_it=it; - ++next_it; - for( ; next_it!=old_path.end() && it!=old_path.end(); ++it, ++next_it) - { - const abstract_eventt &e1=egraph[*it]; - const abstract_eventt &e2=egraph[*next_it]; - if(!porw || - (e1.operation==abstract_eventt::operationt::Read && - e2.operation==abstract_eventt::operationt::Write)) - edges.insert(fence_inserter.add_edge(edget(*it, *next_it))); - } - assert(it!=old_path.end()); - } - else - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(next).begin(); - next_it!=egraph.po_out(next).end(); - ++next_it) - { - old_path.push_back/*front*/(next_it->first); - graph_explore_BC(egraph, next_it->first, old_path, edges); - old_path.pop_back/*front*/(); - } - } -} - -void const_graph_visitort::const_graph_explore_BC( - event_grapht &egraph, - event_idt next, - std::list &old_path) -{ - /* TODO: restricts to C_1 U ... U C_n */ - assert(old_path.size() > 0); - - if(visited_nodes.find(next)!=visited_nodes.end()) - return; - visited_nodes.insert(next); - - /* if all the incoming pos were already visited, add */ - bool no_other_pos = true; - for(wmm_grapht::edgest::const_iterator it= - egraph.po_out(next).begin(); - it!=egraph.po_out(next).end(); - ++it) - if(visited_nodes.find(it->first)==visited_nodes.end()) - { - no_other_pos = false; - break; - } - - if(egraph.po_out(next).empty() || no_other_pos) - { - /* inserts all the pos collected from old_path in edges */ - std::list::const_iterator it=old_path.begin(); - std::list::const_iterator next_it=it; - ++next_it; - for( ; next_it!=old_path.end() && it!=old_path.end(); ++it, ++next_it) - { - const abstract_eventt &e1=egraph[*it]; - const abstract_eventt &e2=egraph[*next_it]; - if((e1.operation==abstract_eventt::operationt::Read && - e2.operation==abstract_eventt::operationt::Write)) - fence_inserter.add_edge(edget(*it, *next_it)); - } - // NEW - assert(it!=old_path.end()); - } - else - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(next).begin(); - next_it!=egraph.po_out(next).end(); - ++next_it) - { - old_path.push_back/*front*/(next_it->first); - const_graph_explore_BC(egraph, next_it->first, old_path); - old_path.pop_back/*front*/(); - } - } -} - -void const_graph_visitort::graph_explore_AC( - event_grapht &egraph, - event_idt next, - std::list &old_path, - std::set &edges, - bool porw) -{ - /* TODO: restricts to C_1 U ... U C_n */ - assert(old_path.size() > 0); - - fence_inserter.instrumenter.message.debug() << "(AC) explore " - << old_path.front() << " --...--> " << next << messaget::eom; - - if(visited_nodes.find(next)!=visited_nodes.end()) - return; - visited_nodes.insert(next); - - /* if all the incoming pos were already visited, add */ - bool no_other_pos = true; - for(wmm_grapht::edgest::const_iterator it= - egraph.po_in(next).begin(); - it!=egraph.po_in(next).end(); - ++it) - if(visited_nodes.find(it->first)==visited_nodes.end()) - { - no_other_pos = false; - break; - } - - if(egraph.po_in(next).empty() || no_other_pos) - { - /* inserts all the pos collected from old_path in edges */ - std::list::const_iterator it=old_path.begin(); - std::list::const_iterator next_it=it; - ++next_it; - for( ; next_it!=old_path.end() && it!=old_path.end(); ++it, ++next_it) - { - const abstract_eventt &e1=egraph[*next_it]; - const abstract_eventt &e2=egraph[*it]; - if(!porw || - (e1.operation==abstract_eventt::operationt::Read && - e2.operation==abstract_eventt::operationt::Write)) - edges.insert(fence_inserter.add_edge(edget(*next_it, *it))); - } - assert(it!=old_path.end()); - } - else - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_in(next).begin(); - next_it!=egraph.po_in(next).end(); - ++next_it) - { - old_path.push_back/*front*/(next_it->first); - graph_explore_AC(egraph, next_it->first, old_path, edges); - old_path.pop_back/*front*/(); - } - } -} - -void const_graph_visitort::const_graph_explore_AC( - event_grapht &egraph, - event_idt next, - std::list &old_path) -{ - /* TODO: restricts to C_1 U ... U C_n */ - assert(old_path.size() > 0); - - if(visited_nodes.find(next)!=visited_nodes.end()) - return; - visited_nodes.insert(next); - - /* if all the incoming pos were already visited, add */ - bool no_other_pos = true; - for(wmm_grapht::edgest::const_iterator it= - egraph.po_in(next).begin(); - it!=egraph.po_in(next).end(); - ++it) - if(visited_nodes.find(it->first)==visited_nodes.end()) - { - no_other_pos = false; - break; - } - - /* if beginning of the thread */ - if(egraph.po_in(next).empty() || no_other_pos) - { - /* inserts all the pos collected from old_path in edges */ - std::list::const_iterator it=old_path.begin(); - std::list::const_iterator next_it=it; - ++next_it; - for( ; next_it!=old_path.end() && it!=old_path.end(); ++it, ++next_it) - { - const abstract_eventt &e1=egraph[*next_it]; - const abstract_eventt &e2=egraph[*it]; - if(e1.operation==abstract_eventt::operationt::Read && - e2.operation==abstract_eventt::operationt::Write) - fence_inserter.add_edge(edget(*next_it, *it)); - } - // NEW - assert(it!=old_path.end()); - } - else - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_in(next).begin(); - next_it!=egraph.po_in(next).end(); - ++next_it) - { - old_path.push_back/*front*/(next_it->first); - const_graph_explore_AC(egraph, next_it->first, old_path); - old_path.pop_back/*front*/(); - } - } -} - -void const_graph_visitort::PT( - const edget &e, - std::set &edges) -{ - visited_nodes.clear(); - -// if(!e.is_po) /* e is in po^+\po */ is_po is a flag set manually, do not -// use it for checks!! - const wmm_grapht::edgest &list_po_out= - fence_inserter.instrumenter.egraph.po_out(e.first); - if(list_po_out.find(e.second)==list_po_out.end()) - { -#ifdef BTWN1 - event_grapht &egraph=fence_inserter.instrumenter.egraph; - - /// all the pos in between - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(e.first).begin(); - next_it!=egraph.po_out(e.first).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(e.first); - new_path.push_back(next_it->first); - graph_explore(egraph, next_it->first, e.second, new_path, edges); - } -#elif defined BTWN4 - /* all the pos+ intersections inbetween */ - /* TODO */ - /* when detecting intersections, add them to a map thread->edges - then for BTWN4, enumerates all the edges of the thread of e and - check whether e.first-po-> edge.first /\ edge.second-po->e.second, - using egraph.are_po_ordered. */ -#else - throw "BTWN definition not selected!"; // NOLINT(readability/throw) -#endif - } - else - /* reflexive -- only when in pos */ - edges.insert(fence_inserter.map_from_e[e]); -} - -/// \par parameters: e in comWR /\ C_j (invisible variables) -/// \return e's in po /\ C (problem variables) -void const_graph_visitort::CT( - const edget &edge, - std::set &edges) -{ - event_grapht &egraph=fence_inserter.instrumenter.egraph; - - /* the edge can be in the reversed order (back-edge) */ - const abstract_eventt &test_first=egraph[edge.first]; - const abstract_eventt &test_second=egraph[edge.second]; - assert(test_first.operation!=test_second.operation); - - const event_idt first= - (test_first.operation==abstract_eventt::operationt::Write? - edge.first: - edge.second); - const event_idt second= - (test_second.operation==abstract_eventt::operationt::Read? - edge.second: - edge.first); - - /* TODO: AC + restricts to C_1 U ... U C_n */ - visited_nodes.clear(); - - /* if one event only on this thread of the cycle, discard */ - if(!egraph.po_in(first).empty()) - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_in(first).begin(); - next_it!=egraph.po_in(first).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(first); - new_path.push_back(next_it->first); - graph_explore_AC(egraph, next_it->first, new_path, edges); - } - } - - if(!egraph.po_out(second).empty()) - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(second).begin(); - next_it!=egraph.po_out(second).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(second); - new_path.push_back(next_it->first); - graph_explore_BC(egraph, next_it->first, new_path, edges); - } - } -} - -/// \par parameters: e in comWR /\ C_j (invisible variables) -/// \return e's in poRW/\ C (problem variables) -void const_graph_visitort::CT_not_powr( - const edget &edge, - std::set &edges) -{ - event_grapht &egraph=fence_inserter.instrumenter.egraph; - - /* the edge can be in the reversed order (back-edge) */ - const abstract_eventt &test_first=egraph[edge.first]; - const abstract_eventt &test_second=egraph[edge.second]; - assert(test_first.operation!=test_second.operation); - - const event_idt first= - (test_first.operation==abstract_eventt::operationt::Write? - edge.first: - edge.second); - const event_idt second= - (test_second.operation==abstract_eventt::operationt::Read? - edge.second: - edge.first); - - /* TODO: AC + restricts to C_1 U ... U C_n */ - visited_nodes.clear(); - - if(!egraph.po_in(first).empty()) - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_in(first).begin(); - next_it!=egraph.po_in(first).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(first); - new_path.push_back(next_it->first); - graph_explore_AC(egraph, next_it->first, new_path, edges, true); - } - } - - if(!egraph.po_out(second).empty()) - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(second).begin(); - next_it!=egraph.po_out(second).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(second); - new_path.push_back(next_it->first); - graph_explore_BC(egraph, next_it->first, new_path, edges, true); - } - } -} diff --git a/src/musketeer/graph_visitor.h b/src/musketeer/graph_visitor.h deleted file mode 100644 index 2df40b7e1d3..00000000000 --- a/src/musketeer/graph_visitor.h +++ /dev/null @@ -1,75 +0,0 @@ -/*******************************************************************\ - -Module: graph visitor for computing edges involved for fencing - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// graph visitor for computing edges involved for fencing - -#ifndef CPROVER_MUSKETEER_GRAPH_VISITOR_H -#define CPROVER_MUSKETEER_GRAPH_VISITOR_H - -#include -#include - -#include - -class fence_insertert; - -class const_graph_visitort -{ -protected: - typedef event_grapht::critical_cyclet::delayt edget; - - fence_insertert &fence_inserter; - std::set visited_nodes; - -public: - /* computes the PT (btwn), CT (cml) and IT (cntrl) */ - void PT(const edget &e, std::set &edges); - void CT(const edget &e, std::set &edges); - void CT_not_powr(const edget &e, std::set &edges); - void IT(const edget &e, std::set &edges); - - void const_graph_explore( - event_grapht &graph, - event_idt next, - event_idt end, - std::list &old_path); - void graph_explore(event_grapht &graph, event_idt next, event_idt end, - std::list &old_path, std::set &edges); - void graph_explore_BC(event_grapht &egraph, event_idt next, - std::list &old_path, std::set &edges, bool porw); - void graph_explore_AC(event_grapht &egraph, event_idt next, - std::list &old_path, std::set &edges, bool porw); - void graph_explore_BC( - event_grapht &egraph, event_idt next, - std::list &old_path, - std::set &edges) - { - graph_explore_BC(egraph, next, old_path, edges, false); - } - - void graph_explore_AC( - event_grapht &egraph, - event_idt next, - std::list &old_path, - std::set &edges) - { - graph_explore_AC(egraph, next, old_path, edges, false); - } - - void const_graph_explore_BC(event_grapht &egraph, event_idt next, - std::list &old_path); - void const_graph_explore_AC(event_grapht &egraph, event_idt next, - std::list &old_path); - - explicit const_graph_visitort(fence_insertert &_fence_inserter) - : fence_inserter(_fence_inserter) - {} -}; - -#endif // CPROVER_MUSKETEER_GRAPH_VISITOR_H diff --git a/src/musketeer/ilp.h b/src/musketeer/ilp.h deleted file mode 100644 index c7ce87537a5..00000000000 --- a/src/musketeer/ilp.h +++ /dev/null @@ -1,70 +0,0 @@ -/*******************************************************************\ - -Module: ILP structure - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP structure - -#ifdef HAVE_GLPK -#include -#endif - -#include - -#ifndef CPROVER_MUSKETEER_ILP_H -#define CPROVER_MUSKETEER_ILP_H - -#ifdef HAVE_GLPK -class ilpt -{ -protected: - glp_iocp parm; - unsigned matrix_size; - -public: - glp_prob *lp; - - std::vector imat; - std::vector jmat; - std::vector vmat; - - ilpt() - { - glp_init_iocp(&parm); - parm.msg_lev=GLP_MSG_OFF; - parm.presolve=GLP_ON; - - lp=glp_create_prob(); - glp_set_prob_name(lp, "fence optimisation"); - glp_set_obj_dir(lp, GLP_MIN); - } - - ~ilpt() - { - glp_delete_prob(lp); - } - - void set_size(unsigned mat_size) - { - matrix_size=mat_size; - imat.resize(mat_size+1); - jmat.resize(mat_size+1); - vmat.resize(mat_size+1); - } - - void solve() - { - glp_load_matrix(lp, matrix_size, imat.data(), - jmat.data(), vmat.data()); - glp_intopt(lp, &parm); - } -}; -#else -class ilpt {}; -#endif - -#endif // CPROVER_MUSKETEER_ILP_H diff --git a/src/musketeer/infer_mode.h b/src/musketeer/infer_mode.h deleted file mode 100644 index 66ab97cdf36..00000000000 --- a/src/musketeer/infer_mode.h +++ /dev/null @@ -1,20 +0,0 @@ -/*******************************************************************\ - - Module: - - Author: Vincent Nimal - -\*******************************************************************/ - - -#ifndef CPROVER_MUSKETEER_INFER_MODE_H -#define CPROVER_MUSKETEER_INFER_MODE_H - -enum infer_modet -{ - INFER=0, - USER_DEF=1, - USER_ASSERT=2 -}; - -#endif // CPROVER_MUSKETEER_INFER_MODE_H diff --git a/src/musketeer/languages.cpp b/src/musketeer/languages.cpp deleted file mode 100644 index 8ae85e2e27a..00000000000 --- a/src/musketeer/languages.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/*******************************************************************\ - -Module: Language Registration - -Author: - -\*******************************************************************/ - -/// \file -/// Language Registration - -#include "musketeer_parse_options.h" - -#include - -#include - -void goto_fence_inserter_parse_optionst::register_languages() -{ - register_language(new_ansi_c_language); -} diff --git a/src/musketeer/musketeer_main.cpp b/src/musketeer/musketeer_main.cpp deleted file mode 100644 index b233c0080a0..00000000000 --- a/src/musketeer/musketeer_main.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/*******************************************************************\ - -Module: Main Module - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// Main Module - -#include "musketeer_parse_options.h" - -int main(int argc, const char **argv) -{ - goto_fence_inserter_parse_optionst parse_options(argc, argv); - return parse_options.main(); -} diff --git a/src/musketeer/musketeer_parse_options.cpp b/src/musketeer/musketeer_parse_options.cpp deleted file mode 100644 index 1643ad04f57..00000000000 --- a/src/musketeer/musketeer_parse_options.cpp +++ /dev/null @@ -1,453 +0,0 @@ -/*******************************************************************\ - -Module: Main Module - -Author: - -\*******************************************************************/ - -/// \file -/// Main Module - -#include "musketeer_parse_options.h" - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef POINTER_ANALYSIS_FI -#include -#else -#include -#endif - -#include -#include - -#include - -#include -#include - -#include "propagate_const_function_pointers.h" -#include "version.h" -#include "fencer.h" -#include "fence_shared.h" -#include "pensieve.h" -#include "replace_async.h" -#include "infer_mode.h" - -void goto_fence_inserter_parse_optionst::set_verbosity() -{ - unsigned int v=8; // default - - if(cmdline.isset("verbosity")) - { - v=unsafe_string2unsigned(cmdline.get_value("verbosity")); - if(v>10) - v=10; - } - - ui_message_handler.set_verbosity(v); -} - -/// invoke main modules -int goto_fence_inserter_parse_optionst::doit() -{ - if(cmdline.isset("version")) - { - std::cout << MUSKETEER_VERSION << '\n'; - return 0; - } - - if(cmdline.args.size()!=1 && cmdline.args.size()!=2) - { - help(); - return 0; - } - - set_verbosity(); - - try - { - register_languages(); - - goto_modelt goto_model; - - get_goto_program(goto_model); - - instrument_goto_program(goto_model); - - // write new binary? - if(cmdline.args.size()==2) - { - status() << "Writing GOTO program to " << cmdline.args[1] << eom; - - if(write_goto_binary( - cmdline.args[1], goto_model, get_message_handler())) - return 1; - else - return 0; - } - - // help(); - return 0; - } - - catch(const char *e) - { - error() << e << eom; - return 11; - } - - catch(const std::string e) - { - error() << e << eom; - return 11; - } - - catch(int) - { - return 11; - } - - catch(std::bad_alloc) - { - error() << "Out of memory" << eom; - return 11; - } -} - -void goto_fence_inserter_parse_optionst::get_goto_program( - goto_modelt &goto_model) -{ - status() << "Reading GOTO program from " << cmdline.args[0] << eom; - - if(read_goto_binary( - cmdline.args[0], goto_model, get_message_handler())) - throw 0; -} - -void goto_fence_inserter_parse_optionst::instrument_goto_program( - goto_modelt &goto_model) -{ - optionst options; - - // unwind loops - if(cmdline.isset("unwind")) - { - status() << "Unwinding loops" << eom; - options.set_option("unwind", cmdline.get_value("unwind")); - } - - // we add the library, as some analyses benefit - - link_to_library(goto_model, ui_message_handler); - - namespacet ns(goto_model.symbol_table); - - if( cmdline.isset("mm") - || cmdline.isset("all-shared") - || cmdline.isset("volatile") - || cmdline.isset("pensieve") - || cmdline.isset("naive") - || cmdline.isset("all-shared-aeg") ) - { - if(cmdline.isset("remove-function-pointers")) - { - status() << "remove soundly function pointers" << eom; - remove_function_pointers( - get_message_handler(), - goto_model, - cmdline.isset("pointer-check")); - } - - if(cmdline.isset("async")) - { - status() << "Replace pthread_creates by __CPROVER_ASYNC_0:" << eom; - replace_async(goto_model); - goto_model.goto_functions.update(); - } - - // do partial inlining - status() << "Partial Inlining" << eom; - goto_partial_inline(goto_model, get_message_handler()); - - if(cmdline.isset("const-function-pointer-propagation")) - { - /* propagate const pointers to functions */ - status() << "Propagate Constant Function Pointers" << eom; - propagate_const_function_pointers(goto_model, - get_message_handler()); - } - - // goto_functions.output(ns, std::cout); - // return; -#if 0 - status() << "Function Pointer Removal" << eom; - remove_function_pointers( - get_message_handler(), - goto_model, - cmdline.isset("pointer-check"); -#endif - - status() << "Pointer Analysis" << eom; -#ifdef POINTER_ANALYSIS_FI - value_set_analysis_fit value_set_analysis(ns); -#else - value_set_analysist value_set_analysis(ns); -#endif - -#ifndef LOCAL_MAY - value_set_analysis(goto_model.goto_functions); -#endif - - status() << "Removing asm code" << eom; - remove_asm(goto_model); - goto_model.goto_functions.update(); - - if(cmdline.isset("all-shared")) - { - status() << "Shared variables accesses detection" << eom; - fence_all_shared(get_message_handler(), value_set_analysis, - goto_model); - // simple analysis, coupled with script to insert; - // does not transform the goto-binary - return; - } - if(cmdline.isset("all-shared-aeg")) - { - status() << "Shared variables accesses detection (CF)" << eom; - fence_all_shared_aeg(get_message_handler(), value_set_analysis, - goto_model); - // simple analysis, coupled with script to insert; - // does not transform the goto-binary - return; - } - else if(cmdline.isset("volatile")) - { - status() << "Detection of variables declared volatile" << eom; - - fence_volatile(get_message_handler(), value_set_analysis, - goto_model); - // simple analysis, coupled with script to insert; - // does not transform the goto-binary - return; - } - else if(cmdline.isset("pensieve") || cmdline.isset("naive")) - { - status() << "Delay-set analysis" << eom; - - const unsigned unwind_loops= - cmdline.isset("unwind") ? - unsafe_string2unsigned(cmdline.get_value("unwind")) : 0; - - const unsigned max_po_trans= - cmdline.isset("max-po-trans") ? - unsafe_string2unsigned(cmdline.get_value("max-po-trans")) : 0; - - fence_pensieve( - value_set_analysis, - goto_model, - unwind_loops, - max_po_trans, - !cmdline.isset("no-po-rendering"), - cmdline.isset("render-cluster-file"), - cmdline.isset("render-cluster-function"), - cmdline.isset("naive"), - get_message_handler()); - // simple analysis, coupled with script to insert; - // does not transform the goto-binary - return; - } - else if(cmdline.isset("mm")) - { - std::string mm=cmdline.get_value("mm"); - memory_modelt model; - - status() << "Fence detection for " << mm - << " via critical cycles and ILP" << eom; - - // strategy of instrumentation - instrumentation_strategyt inst_strategy; - if(cmdline.isset("one-event-per-cycle")) - inst_strategy=one_event_per_cycle; - else if(cmdline.isset("minimum-interference")) - inst_strategy=min_interference; - else if(cmdline.isset("read-first")) - inst_strategy=read_first; - else if(cmdline.isset("write-first")) - inst_strategy=write_first; - else if(cmdline.isset("my-events")) - inst_strategy=my_events; - else - /* default: instruments all unsafe pairs */ - inst_strategy=all; - - const unsigned unwind_loops = - cmdline.isset("unwind") ? - unsafe_string2unsigned(cmdline.get_value("unwind")) : 0; - - const unsigned max_var = - cmdline.isset("max-var") ? - unsafe_string2unsigned(cmdline.get_value("max-var")) : 0; - - const unsigned max_po_trans = - cmdline.isset("max-po-trans") ? - unsafe_string2unsigned(cmdline.get_value("max-po-trans")) : 0; - - if(mm=="tso") - { - status() << "Adding weak memory (TSO) Instrumentation" << eom; - model=TSO; - } - else if(mm=="pso") - { - status() << "Adding weak memory (PSO) Instrumentation" << eom; - model=PSO; - } - else if(mm=="rmo") - { - status() << "Adding weak memory (RMO) Instrumentation" << eom; - model=RMO; - } - else if(mm=="power") - { - status() << "Adding weak memory (Power) Instrumentation" << eom; - model=Power; - } - else - { - status/*error*/() << "Unknown weak memory model" << eom; - model=Unknown; - } - - /* inference mode */ - infer_modet infer_mode=INFER; - - if(cmdline.isset("userdef")) - infer_mode=USER_DEF; - - loop_strategyt loops=arrays_only; - - if(cmdline.isset("force-loop-duplication")) - loops=all_loops; - if(cmdline.isset("no-loop-duplication")) - loops=no_loop; - - /*if(model!=Unknown)*/ - fence_weak_memory( - model, - value_set_analysis, - goto_model, - cmdline.isset("scc"), - inst_strategy, - unwind_loops, - !cmdline.isset("cfg-kill"), - cmdline.isset("no-dependencies"), - loops, - max_var, - max_po_trans, - !cmdline.isset("no-po-rendering"), - cmdline.isset("render-cluster-file"), - cmdline.isset("render-cluster-function"), - cmdline.isset("cav11"), - cmdline.isset("hide-internals"), - cmdline.isset("print-graph"), - infer_mode, - get_message_handler(), - cmdline.isset("ignore-arrays")); - } - } - - // add failed symbols - add_failed_symbols(goto_model.symbol_table); - - // recalculate numbers, etc. - goto_model.goto_functions.update(); - - // add loop ids - goto_model.goto_functions.compute_loop_numbers(); - - // label the assertions - label_properties(goto_model); -} - -/// display command line help -void goto_fence_inserter_parse_optionst::help() -{ - std::cout << - "\n" - "* * musketeer " MUSKETEER_VERSION " * *\n" - "\n" - " ~__\n" - " |)\n" - " /|_____\n" - " / |\n" - " /|\n" - " / |\n" - "\n" - "Usage: Purpose:\n" - "\n" - " musketeer [-?] [-h] [--help] show help\n" - "\n" - "Main options:\n" - "\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --mm detects all the fences to insert for a weak\n" - " memory model\n" - "\n" - "Alternative methods:\n" - "\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --all-shared detects and fences all the accesses to shared\n" - " variables (context insensitive)\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --all-shared-aeg detects all the accesses to shared variables\n" - " (context sensitive)\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --volatile detects all the accesses to volatile variables\n" - " --pensieve detects all the pairs to be delayed with\n" - " Pensieve's criteria (context sensitive)\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --naive detects all the pairs to be delayed in a naive\n" - " approach (context sensitive)\n" - "\n" - "Options:\n" - "\n" - " --remove-function-pointers removes soundly function pointers based on\n" - " their signatures\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --async replaces all the pthread_creates by CPROVER_ASYNC\n" - " --const-function-pointer-propagation\n" - // NOLINTNEXTLINE(whitespace/line_length) - " propagates the constant pointers to functions\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --scc detects cycles in parallel (one thread/SCC)\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --force-loop-duplication duplicates the bodies of all the loops, and not\n" - " only those with arrays accesses\n" - " --no-loop-duplication constructs back-edges for all the loops\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --no-dependencies ignores existing dependencies in the program\n" - " --print-graph prints the AEG into graph.dot\n" - " --max-po-var limits the number of variables per cycle\n" - " --max-po-trans limits the size of pos^+ in terms of pos\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --ignore-arrays ignores cycles with multiple accesses to the\n" - " same array\n" - "\n"; -} diff --git a/src/musketeer/musketeer_parse_options.h b/src/musketeer/musketeer_parse_options.h deleted file mode 100644 index e227e4cf4a3..00000000000 --- a/src/musketeer/musketeer_parse_options.h +++ /dev/null @@ -1,57 +0,0 @@ -/*******************************************************************\ - -Module: Command Line Parsing - -Author: - -\*******************************************************************/ - -/// \file -/// Command Line Parsing - -#ifndef CPROVER_MUSKETEER_MUSKETEER_PARSE_OPTIONS_H -#define CPROVER_MUSKETEER_MUSKETEER_PARSE_OPTIONS_H - -#include -#include - -#include -#include - -#define GOTO_FENCE_INSERTER_OPTIONS \ - "(scc)(one-event-per-cycle)(verbosity):" \ - "(mm):(my-events)(unwind):" \ - "(max-var):(max-po-trans):(ignore-arrays)(remove-function-pointers)" \ - "(cfg-kill)(no-dependencies)(force-loop-duplication)(no-loop-duplication)" \ - "(no-po-rendering)(render-cluster-file)(render-cluster-function)" \ - "(cav11)(version)(const-function-pointer-propagation)(print-graph)" \ - "(volatile)(all-shared)(pensieve)(naive)(all-shared-aeg)(async)(userdef)" - -class goto_fence_inserter_parse_optionst: - public parse_options_baset, - public language_uit -{ -public: - virtual int doit(); - virtual void help(); - - goto_fence_inserter_parse_optionst(int argc, const char **argv): - parse_options_baset(GOTO_FENCE_INSERTER_OPTIONS, argc, argv), - language_uit(cmdline, ui_message_handler), - ui_message_handler(cmdline, "musketeer") - { - } - -protected: - ui_message_handlert ui_message_handler; - - virtual void register_languages(); - - void get_goto_program(goto_modelt &); - - void instrument_goto_program(goto_modelt &); - - void set_verbosity(); -}; - -#endif // CPROVER_MUSKETEER_MUSKETEER_PARSE_OPTIONS_H diff --git a/src/musketeer/pensieve.cpp b/src/musketeer/pensieve.cpp deleted file mode 100644 index 4b514dd84d0..00000000000 --- a/src/musketeer/pensieve.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Vincent Nimal - -\*******************************************************************/ - -#include "pensieve.h" - -#include -#include -#include - -#include -#include -#include - -void fence_pensieve( - value_setst &value_sets, - goto_modelt &goto_model, - unsigned unwinding_bound, - unsigned input_max_po_trans, - bool render_po, - bool render_file, - bool render_function, - bool naive_mode, - message_handlert &message_handler) -{ - messaget message(message_handler); - - message.status() << "--------" << messaget::eom; - - // all access to shared variables is pushed into assignments - Forall_goto_functions(f_it, goto_model.goto_functions) - if(f_it->first!=CPROVER_PREFIX "initialize" && - f_it->first!=goto_functionst::entry_point()) - introduce_temporaries(value_sets, goto_model.symbol_table, f_it->first, - f_it->second.body, -#ifdef LOCAL_MAY - f_it->second, -#endif - message); - message.status() << "Temporary variables added" << messaget::eom; - - unsigned max_thds = 0; - - instrumenter_pensievet instrumenter(goto_model, message); - max_thds=instrumenter.goto2graph_cfg(value_sets, Power, true, no_loop); - message.status() << "Abstract event graph computed" << messaget::eom; - - if(input_max_po_trans!=0) - instrumenter.set_parameters_collection(0, input_max_po_trans); - else - instrumenter.set_parameters_collection(max_thds); - - /* necessary for correct printings */ - namespacet ns(goto_model.symbol_table); - - if(naive_mode) - instrumenter.collect_pairs_naive(ns); - else - instrumenter.collect_pairs(ns); - - /* removes potential skips */ - Forall_goto_functions(f_it, goto_model.goto_functions) - remove_skip(f_it->second.body); - - // update counters etc. - goto_model.goto_functions.update(); -} diff --git a/src/musketeer/pensieve.h b/src/musketeer/pensieve.h deleted file mode 100644 index a6bf34bd00c..00000000000 --- a/src/musketeer/pensieve.h +++ /dev/null @@ -1,33 +0,0 @@ -/*******************************************************************\ - -Module: Fence insertion following criteria of Pensieve (PPoPP'05) - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// Fence insertion following criteria of Pensieve (PPoPP'05) - -#ifndef CPROVER_MUSKETEER_PENSIEVE_H -#define CPROVER_MUSKETEER_PENSIEVE_H - -#include -#include - -class value_setst; -class goto_modelt; -class message_handlert; - -void fence_pensieve( - value_setst &value_sets, - goto_modelt &, - unsigned unwinding_bound, - unsigned max_po_trans, - bool render_po, - bool render_file, - bool render_function, - bool naive_mode, - message_handlert &message_handler); - -#endif // CPROVER_MUSKETEER_PENSIEVE_H diff --git a/src/musketeer/propagate_const_function_pointers.cpp b/src/musketeer/propagate_const_function_pointers.cpp deleted file mode 100644 index c7078a50c19..00000000000 --- a/src/musketeer/propagate_const_function_pointers.cpp +++ /dev/null @@ -1,567 +0,0 @@ -/*******************************************************************\ - -Module: Constant Function Pointer Propagation - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// Constant Function Pointer Propagation - -#include "propagate_const_function_pointers.h" - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -class const_function_pointer_propagationt -{ -protected: - symbol_tablet &symbol_table; - goto_functionst &goto_functions; - const namespacet ns; - messaget &message; - - std::unordered_map map_unique; - - /* maps const pointer to function (expression + arguments at call) */ - std::unordered_map pointer_to_fun; - - /* maps const pointer to where it was defined in the call function stack */ - std::unordered_map pointer_to_stack; - - /* where a const function to inline was the first time invoked */ - std::unordered_map fun_id_to_invok; - - /* stack of callsites: provides functions and location in the goto-program */ - goto_programt::const_targetst callsite_stack; - - bool resolve( - const irep_idt &symb, - symbol_exprt &goto_function, - unsigned &stack_scope) - { - message.debug() << "I resolve " << symb << " with " - << pointer_to_fun[symb].get_identifier() << messaget::eom; - if(pointer_to_fun.find(symb)==pointer_to_fun.end()) - return false; - else - { - goto_function=pointer_to_fun[symb]; - stack_scope=pointer_to_stack[symb]; - return true; - } - } - - /* TODO: use the whole name rather than the base one, to avoid - overwriting? - Yes! Pure propagation of pointers only intra-proc. At call, arguments - and pointed functions stored in the table -- no need to keep the match - between two pointers inter-proc. */ - bool add(const irep_idt &symb, const symbol_exprt &goto_function) - { - return add(symb, goto_function, callsite_stack.size()); - } - - bool add(const irep_idt &symb, - const symbol_exprt &goto_function, - unsigned scope) - { - pointer_to_fun[symb]=goto_function; - pointer_to_stack[symb]=scope; - - const symbolt &function_symb=ns.lookup(goto_function.get_identifier()); - if(fun_id_to_invok.find(function_symb.base_name)==fun_id_to_invok.end()) - fun_id_to_invok[function_symb.base_name]=scope; - - return true; - } - - bool remove(const irep_idt &symb) - { - assert(pointer_to_fun.find(symb)!=pointer_to_fun.end()); - pointer_to_fun.erase(symb); - return true; - } - - bool has(const irep_idt &symb) const - { - return pointer_to_fun.find(symb)!=pointer_to_fun.end(); - } - - symbol_exprt get(const irep_idt &symb) - { - return pointer_to_fun[symb]; - } - - /* to keep track of the visited functions and avoid recursion */ - std::set functions_met; - - void propagate(const irep_idt &function); - - void dup_caller_and_inline_callee(const symbol_exprt &function, - unsigned stack_scope); - - /* to keep track of the constant function pointers passed as arguments */ - class arg_stackt final - { - typedef std::set data_typet; - data_typet data; - const_function_pointer_propagationt &cfpp; - - public: - // NOLINTNEXTLINE(readability/identifiers) - typedef data_typet::iterator iterator; - // NOLINTNEXTLINE(readability/identifiers) - typedef data_typet::const_iterator const_iterator; - // NOLINTNEXTLINE(readability/identifiers) - typedef data_typet::value_type value_type; - - std::pair insert(const value_type &t) - { - return data.insert(t); - } - - explicit arg_stackt(const_function_pointer_propagationt &_cfpp): - cfpp(_cfpp) - {} - void add_args(const symbol_exprt &const_function, - goto_programt::instructionst::iterator it); - void remove_args(); - }; - -public: - const_function_pointer_propagationt( - goto_modelt &_goto_model, messaget &_message): - symbol_table(_goto_model.symbol_table), - goto_functions(_goto_model.goto_functions), - ns(_goto_model.symbol_table), message(_message) - {} - - /* Note that it only propagates from MAIN, following the CFG, without - resolving non-constant function pointers. */ - void propagate() - { - propagate(goto_functionst::entry_point()); - } -}; - -/// \par parameters: 'it' pointing to the callsite to update, 'function' the -/// function -/// actually called, 'stack_scope' the place where the constant was -/// defined in the call stack -void const_function_pointer_propagationt::dup_caller_and_inline_callee( - const symbol_exprt &const_function, - unsigned stack_scope) -{ - assert(!callsite_stack.empty()); - - /* for the reconstruction of the {call,callsite}_stacks after the - duplication */ - goto_programt::const_targetst new_callsite_stack; - - goto_programt::const_targetst::const_iterator - callsite=callsite_stack.begin(); - - std::string last_suffix=""; - - for(unsigned current_call=callsite_stack.size(); - current_call>=stack_scope; - --current_call) - { - message.debug() << "current_call=" << current_call << " stack_scope=" - << stack_scope << " callsite_stack.size()=" << callsite_stack.size() - << messaget::eom; - assert(callsite!=callsite_stack.end()); - - message.debug() << callsite_stack.size() << messaget::eom; - - const irep_idt function_id=(*callsite)->function; - - goto_functionst::goto_functiont* pfunction_dup=&goto_functions - .function_map[function_id]; - - std::string suffix="$"; - - if(current_call>stack_scope) - { - /* unique suffix */ - if(map_unique.find(function_id)!=map_unique.end()) - { - suffix+=std::to_string(map_unique[function_id]); - ++map_unique[function_id]; - } - else - { - map_unique[function_id]=0; - suffix+=std::to_string(map_unique[function_id]); - ++map_unique[function_id]; - } - - /* creates a new, unique copy of the function */ - message.debug() << "duplicate function: " << function_id - << messaget::eom; - const irep_idt function_new_id=id2string(function_id)+suffix; - - goto_functionst::goto_functiont &function_dup= - goto_functions.function_map[function_new_id]; - function_dup.copy_from(goto_functions.function_map[function_id]); - pfunction_dup=&function_dup; - - for(goto_programt::targett it=function_dup.body.instructions.begin(); - it!=function_dup.body.instructions.end(); ++it) - it->function=function_new_id; - - assert(goto_functions.function_map[function_new_id].body.empty()); - - /* removes in definition the argument leading to the const_function */ - code_typet::parameterst &args=function_dup.type.parameters(); - for(code_typet::parameterst::iterator it=args.begin(); - it!=args.end(); ++it) - { - if(pointer_to_fun.find(it->get_identifier())!=pointer_to_fun.end() - && pointer_to_fun[it->get_identifier()]==const_function) - args.erase(it); - } - - /* updates the table of symbols */ - const symbolt &fun_symb=ns.lookup(function_id); - symbolt dup_fun_symb; - dup_fun_symb=fun_symb; - dup_fun_symb.name=id2string(dup_fun_symb.name)+suffix; - dup_fun_symb.base_name=id2string(dup_fun_symb.base_name)+suffix; - dup_fun_symb.pretty_name=id2string(dup_fun_symb.pretty_name)+suffix; - symbol_table.add(dup_fun_symb); - - goto_functions.update(); - message.debug() << "new function " << function_new_id << " created." - << messaget::eom; - message.debug() << "new function " - << goto_functions.function_map[function_new_id].body.instructions - .front().function << " created." << messaget::eom; - } - - if(current_callbody.instructions; - goto_programt::targett it=new_instructions.begin(); - // beurk -- should use location_number or something unique per - // instruction but shared between two copies of a same goto-program - for( ; - it->source_location!=(*callsite)->source_location && - it!=new_instructions.end(); - ++it) - { - } - - assert(it->source_location==(*callsite)->source_location); - exprt &function_called=to_code_function_call(it->code).function(); - assert(function_called.id()==ID_symbol); - symbol_exprt &symbol_fun_called=to_symbol_expr(function_called); - symbol_fun_called.set_identifier( - id2string(symbol_fun_called.get_identifier())+last_suffix); - - /* removes the constant pointer from the arguments passed at call */ - code_function_callt::argumentst &args=to_code_function_call(it->code) - .arguments(); - for(code_function_callt::argumentst::iterator arg_it=args.begin(); - arg_it!=args.end(); ++arg_it) - { - if(arg_it->id()==ID_symbol) - { - const symbol_exprt &symb_arg=to_symbol_expr(*arg_it); - if(symb_arg.get_identifier()==const_function.get_identifier() - || (pointer_to_fun.find(symb_arg.get_identifier()) - !=pointer_to_fun.end() - && pointer_to_fun[symb_arg.get_identifier()]==const_function) ) - args.erase(arg_it); - } - else if(arg_it->id()==ID_address_of) - { - const address_of_exprt &add_arg=to_address_of_expr(*arg_it); - if(add_arg.object().id()==ID_symbol - && to_symbol_expr(add_arg.object()).get_identifier() - ==const_function.get_identifier()) - args.erase(arg_it); - } - } - - new_callsite_stack.push_back(it); - } - else - { - message.debug() << "we first modify the first caller" << messaget::eom; - - /* initially, inlines the callee function in the duplicate of the last - caller */ - goto_programt::instructionst &new_instructions= - pfunction_dup->body.instructions; - goto_programt::targett it=new_instructions.begin(); - // beurk -- should use location_number or something unique per - // instruction but shared between two copies of a same goto-program - for( ; - it->source_location!=(*callsite)->source_location && - it!=new_instructions.end(); - ++it) - { - } - - message.debug() << "callsite targeted: " << (*callsite)->source_location - << " function: " << const_function.get_identifier() << messaget::eom; - - assert(it->source_location==(*callsite)->source_location); - message.debug() << it->code.get_statement() << messaget::eom; - to_code_function_call(it->code).function()=const_function; - - new_callsite_stack.push_back(it); - } - - last_suffix=suffix; - ++callsite; - } - - /* and updates the call_stack and callsite_stack */ - // new_callsite_stack.splice(new_callsite_stack.end(), callsite_stack, - // callsite, callsite_stack.end()); - for(goto_programt::const_targetst::const_iterator it=callsite; - it!=callsite_stack.end(); ++it) - new_callsite_stack.push_back(*it); - - assert(callsite_stack.size()==new_callsite_stack.size()); - callsite_stack.swap(new_callsite_stack); -} - -/// adds const pointers (instantiated here or propagated) passed as arguments in -/// the map -void const_function_pointer_propagationt::arg_stackt::add_args( - const symbol_exprt &const_function, - goto_programt::instructionst::iterator it) -{ - /* if constant pointers passed as arguments, add the names of the parameters - in the function definition to the map */ - const code_function_callt::argumentst &arg= - to_code_function_call(it->code).arguments(); - - /* retrieve the corresponding parameters expressions in the - function definition */ - assert(cfpp.goto_functions.function_map.find( - const_function.get_identifier())!=cfpp.goto_functions.function_map.end()); - - goto_functionst::goto_functiont &cor_function= - cfpp.goto_functions.function_map[const_function.get_identifier()]; - - code_typet::parameterst::const_iterator cor_arg_it= - cor_function.type.parameters().begin(); - - for(code_function_callt::argumentst::const_iterator arg_it=arg.begin(); - arg_it!=arg.end(); - ++arg_it, ++cor_arg_it) - { - assert(cor_arg_it!=cor_function.type.parameters().end()); - - if(arg_it->id()!=ID_symbol && arg_it->id()!=ID_address_of) - continue; - - if(arg_it->id()==ID_address_of) - { - if(to_address_of_expr(*arg_it).object().id()!=ID_symbol) - continue; - - const exprt &arg_expr=to_address_of_expr(*arg_it).object(); - assert(arg_expr.id()==ID_symbol); - const symbol_exprt &arg_symbol_expr=to_symbol_expr(arg_expr); - - // const symbolt &arg_symbol= - // cfpp.symbol_table.lookup(arg_symbol_expr.get_identifier()); - - // debug - for(std::unordered_map::const_iterator - it=cfpp.fun_id_to_invok.begin(); - it!=cfpp.fun_id_to_invok.end(); - ++it) - cfpp.message.debug() << it->first << ":" << it->second << " "; - cfpp.message.debug() << messaget::eom; - - cfpp.add(cor_arg_it->get_base_name(), arg_symbol_expr); - insert(cor_arg_it->get_base_name()); - cfpp.message.debug() << "SET: insert " << cor_arg_it->get_base_name() - << messaget::eom; - } - else - { - cfpp.message.debug() << "fun: " << const_function.get_identifier() - << " - arg: (symb) " << cfpp.symbol_table - .lookup(to_symbol_expr(*arg_it).get_identifier()).base_name - << messaget::eom; - - const symbol_exprt &arg_symbol_expr=to_symbol_expr(*arg_it); - const symbolt &arg_symbol= - cfpp.symbol_table.lookup(arg_symbol_expr.get_identifier()); - - if(cfpp.has(arg_symbol.base_name)) - { - cfpp.add(cor_arg_it->get_base_name(), cfpp.get(arg_symbol.base_name), - cfpp.fun_id_to_invok[arg_symbol.base_name]); - insert(cor_arg_it->get_base_name()); - cfpp.message.debug() << "SET: insert " << cor_arg_it->get_base_name() - << messaget::eom; - } - } - } -} - -void const_function_pointer_propagationt::arg_stackt::remove_args() -{ - /* remove the parameter names */ - for(const_iterator arg_it=data.begin(); arg_it!=data.end(); ++arg_it) - { - cfpp.remove(*arg_it); - cfpp.message.debug() << "SET: remove " << *arg_it << messaget::eom; - } -} - -void const_function_pointer_propagationt::propagate( - const irep_idt &function_id) -{ - if(goto_functions.function_map.find(function_id)== - goto_functions.function_map.end()) - return; - - goto_functionst::goto_functiont &function= - goto_functions.function_map[function_id]; - - if(functions_met.find(function_id)!=functions_met.end()) - return; - - functions_met.insert(function_id); - - Forall_goto_program_instructions(it, function.body) - { - if(it->is_assign()) - { - /* is it an assignment of function pointer? */ - const code_assignt &assign=to_code_assign(it->code); - const exprt &lhs=assign.lhs(); - const exprt &rhs=assign.rhs(); - - /* rhs has to be an address to a function */ - if(rhs.id()!=ID_address_of) - continue; - const address_of_exprt &addr_rhs=to_address_of_expr(rhs); - - if(addr_rhs.object().id()!=ID_symbol - || addr_rhs.object().type().id()!=ID_code) - continue; - const symbol_exprt &symbol_rhs=to_symbol_expr(addr_rhs.object()); - - /* lhs must be a pointer */ - if(lhs.id()!=ID_symbol || lhs.type().id()!=ID_pointer) - continue; - const symbol_exprt &symbol_expr_lhs=to_symbol_expr(lhs); - const symbolt &symbol_lhs= - symbol_table.lookup(symbol_expr_lhs.get_identifier()); - - add(symbol_lhs.base_name, symbol_rhs); - } - else if(it->is_function_call()) - { - callsite_stack.push_front(it); - - const exprt &fun=to_code_function_call(it->code).function(); - - /* if it is a function pointer */ - if(fun.id()==ID_dereference) - { - const exprt &fun_pointer=to_dereference_expr(fun).pointer(); - if(fun_pointer.id()!=ID_symbol) - { - callsite_stack.pop_front(); - continue; - } - - const symbol_exprt &fun_symbol_expr=to_symbol_expr(fun_pointer); - const symbolt &fun_symbol= - symbol_table.lookup(fun_symbol_expr.get_identifier()); - symbol_exprt const_function; - unsigned stack_scope=0; - - /* is it a constant pointer? */ - if(resolve(fun_symbol.base_name, const_function, stack_scope)) - { - /* saves the current context (stack of --unduplicated-- callsites) */ - goto_programt::const_targetst context(callsite_stack); - - /* it is. Inline it and explore it. */ - dup_caller_and_inline_callee(const_function, stack_scope); - message.debug() << "I substitute " << const_function.get_identifier() - << messaget::eom; - - arg_stackt arg_stack(*this); - arg_stack.add_args(const_function, it); - - propagate(const_function.get_identifier()); - - arg_stack.remove_args(); - - /* restores the context */ - callsite_stack.swap(context); - } - else - { - /* no. Ignore it and leave it to the remove_function_pointers */ - } - } - else if(fun.id()==ID_symbol) - { - message.debug() << "Propagates through " << to_symbol_expr(fun) - .get_identifier() << messaget::eom; - - /* just propagate */ - const symbol_exprt &fun_symbol_expr=to_symbol_expr(fun); - const irep_idt &fun_id=fun_symbol_expr.get_identifier(); - - arg_stackt arg_stack(*this); - arg_stack.add_args(fun_symbol_expr, it); - - propagate(fun_id); - - arg_stack.remove_args(); - } - - callsite_stack.pop_front(); - } - else if(it->is_end_function()) - { - functions_met.erase(function_id); - return; - } - } - - functions_met.erase(function_id); -} - -void propagate_const_function_pointers( - goto_modelt &goto_model, - message_handlert &message_handler) -{ - messaget message(message_handler); - const_function_pointer_propagationt propagation( - goto_model, message); - propagation.propagate(); - goto_model.goto_functions.update(); -} diff --git a/src/musketeer/propagate_const_function_pointers.h b/src/musketeer/propagate_const_function_pointers.h deleted file mode 100644 index 660f57afbc5..00000000000 --- a/src/musketeer/propagate_const_function_pointers.h +++ /dev/null @@ -1,29 +0,0 @@ -/*******************************************************************\ - -Module: Constant Function Pointer Propagation - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// Constant Function Pointer Propagation - -#ifndef CPROVER_MUSKETEER_PROPAGATE_CONST_FUNCTION_POINTERS_H -#define CPROVER_MUSKETEER_PROPAGATE_CONST_FUNCTION_POINTERS_H - -class goto_modelt; -class message_handlert; - -/* Note that it only propagates from MAIN, following the CFG, without - resolving non-constant function pointers. This is of particular interest - when used in conjunction with goto_partial_inline, so that it explores - inlined functions accepting generic functions (pthread_create in - particular) in their context, preventing a huge overapproximation of a - functions-based exploration in remove_function_pointers. */ - -void propagate_const_function_pointers( - goto_modelt &, - message_handlert &); - -#endif // CPROVER_MUSKETEER_PROPAGATE_CONST_FUNCTION_POINTERS_H diff --git a/src/musketeer/replace_async.h b/src/musketeer/replace_async.h deleted file mode 100644 index 5d4a9eb27ff..00000000000 --- a/src/musketeer/replace_async.h +++ /dev/null @@ -1,83 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Vincent Nimal - -Date: December 2013 - -\*******************************************************************/ - - -#ifndef CPROVER_MUSKETEER_REPLACE_ASYNC_H -#define CPROVER_MUSKETEER_REPLACE_ASYNC_H - -#include -#include - -void replace_async(goto_modelt &goto_model) -{ - const namespacet ns(goto_model.symbol_table); - - Forall_goto_functions(f_it, goto_model.goto_functions) - { - goto_programt &program=f_it->second.body; - - Forall_goto_program_instructions(i_it, program) - { - const goto_programt::instructiont &instruction=*i_it; - - if(instruction.is_function_call()) - { - const code_function_callt &fct=to_code_function_call(instruction.code); - if(fct.function().id() == ID_symbol) - { - const symbol_exprt &fsym=to_symbol_expr(fct.function()); - - if(ns.lookup(fsym.get_identifier()).base_name == "pthread_create") - { - assert(fct.arguments().size()>=4); - code_function_callt new_call; - /* takes the 3rd argument (pointer to the function to call) */ - const exprt &fct_name=fct.arguments()[2]; - - if(fct_name.id()==ID_address_of) - { - /* pointer to function */ - new_call.function()= - to_address_of_expr(fct.arguments()[2]).object(); - } - else - { - /* other (e.g. local copy) */ - new_call.function()=fct_name; - } - - new_call.arguments().resize(1); - /* takes the 4th argument (argument of the function to call) */ - new_call.arguments()[0]=fct.arguments()[3]; - - /* __CPROVER_ASYNC labels only evaluated at C parsing time; we - reproduce here the effects of the evaluation of this label */ - i_it->labels.push_front("__CPROVER_ASYNC_0"); - i_it->clear(START_THREAD); - /* CP_AC_0: f(); -> CP_AC_0: start_th; goto 2; - 1: f(); end_th; 2: ... */ - - goto_programt::targett goto2=program.insert_after(i_it); - goto_programt::targett call=program.insert_after(goto2); - goto_programt::targett end=program.insert_after(call); - goto_programt::targett skip=program.insert_after(end); - - goto2->make_goto(skip); - call->make_function_call(new_call); - end->clear(END_THREAD); - skip->make_skip(); - } - } - } - } - } -} - -#endif // CPROVER_MUSKETEER_REPLACE_ASYNC_H diff --git a/src/musketeer/version.h b/src/musketeer/version.h deleted file mode 100644 index fde0c82ecea..00000000000 --- a/src/musketeer/version.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef CPROVER_MUSKETEER_VERSION_H -#define CPROVER_MUSKETEER_VERSION_H - -#define MUSKETEER_VERSION "0.37" - -#endif // CPROVER_MUSKETEER_VERSION_H From 91e733dc27c9bea5faf990573878fc7aa00ecd7c Mon Sep 17 00:00:00 2001 From: thk123 Date: Wed, 13 Sep 2017 11:26:04 +0100 Subject: [PATCH 57/80] Manually disable some failing tests Only fail on Windows, see #1381 for issue to re-enable --- appveyor.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 2efea4e75c2..4f28cf54254 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -111,6 +111,11 @@ test_script: rmdir /s /q cbmc-java\tableswitch2 rmdir /s /q goto-gcc rmdir /s /q goto-instrument\slice08 + rmdir /s /q symex\va_args_10 + rmdir /s /q symex\va_args_2 + rmdir /s /q symex\va_args_3 + rmdir /s /q symex\va_args_5 + rmdir /s /q symex\va_args_6 make test From 444f2564cb09155d8a5e0bcddbf399e080eb2248 Mon Sep 17 00:00:00 2001 From: Pascal Kesseli Date: Wed, 13 Sep 2017 13:39:34 +0200 Subject: [PATCH 58/80] Add initial value to languaget::generate_opaque_stubs The bool member languaget::generate_opaque_stubs does not receive an initial value, and not all contexts using languaget call its setter. Valgrind thus detects a jump based on an uninitialised value. Added explicit initial value `false`. --- src/util/language.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/language.h b/src/util/language.h index 1b020e03685..ebe10bba1a8 100644 --- a/src/util/language.h +++ b/src/util/language.h @@ -137,7 +137,7 @@ class languaget:public messaget static irep_idt get_stub_return_symbol_name(const irep_idt &function_id); - bool generate_opaque_stubs; + bool generate_opaque_stubs=false; bool language_options_initialized=false; private: From f347a22d54b08967337f2a79042b2e843b445418 Mon Sep 17 00:00:00 2001 From: thk123 Date: Wed, 7 Dec 2016 15:19:09 +0000 Subject: [PATCH 59/80] Cause a regeneration of the entry method if a --function is provided If the user provides a --function argument, tell the languaget to regenerate the entry function to call this function. Previously if the program had been precompiled (using goto-cc), the start function that was used in the original generation would be used again meaning the --function argument was ignored. Removed erroneous comment --- src/cbmc/cbmc_parse_options.cpp | 12 ++++++++++ src/util/language.cpp | 41 +++++++++++++++++++++++++++++++++ src/util/language.h | 5 ++++ 3 files changed, 58 insertions(+) diff --git a/src/cbmc/cbmc_parse_options.cpp b/src/cbmc/cbmc_parse_options.cpp index a3fbd8c99dc..d8e8ecddd2b 100644 --- a/src/cbmc/cbmc_parse_options.cpp +++ b/src/cbmc/cbmc_parse_options.cpp @@ -626,6 +626,18 @@ int cbmc_parse_optionst::get_goto_program( if(initialize_goto_model(goto_model, cmdline, get_message_handler())) return 6; + if(cmdline.isset("function")) + { + const symbolt &desired_entry_function= + symbol_table.lookup(cmdline.get_value("function")); + languaget *language=get_language_from_mode(desired_entry_function.mode); + + language->regenerate_start_function( + desired_entry_function, + symbol_table, + goto_functions); + } + if(cmdline.isset("show-symbol-table")) { show_symbol_table(goto_model, ui_message_handler.get_ui()); diff --git a/src/util/language.cpp b/src/util/language.cpp index 6bd0211d4a4..82467f4705e 100644 --- a/src/util/language.cpp +++ b/src/util/language.cpp @@ -12,11 +12,13 @@ Author: Daniel Kroening, kroening@kroening.com #include "language.h" #include "expr.h" +#include #include #include #include #include #include +#include bool languaget::final(symbol_tablet &symbol_table) { @@ -191,3 +193,42 @@ void languaget::generate_opaque_parameter_symbols( symbol_table.add(param_symbol); } } + +/// To replace an existing _start function with a new one that calls a specified +/// function +/// \param required_entry_function: a code symbol inside the symbol table which +/// is the function that should be used as the entry point. +/// \param symbol_table: the symbol table for the program. The _start symbol +/// will be replaced with a new start function +/// \param goto_functions: the functions for the goto program. The _start +/// function will be erased from this +/// \return Returns false if the new start function is created successfully, +/// true otherwise. +bool languaget::regenerate_start_function( + const symbolt &required_entry_function, + symbol_tablet &symbol_table, + goto_functionst &goto_functions) +{ + // Remove the existing _start function so we can create a new one + symbol_table.remove(goto_functionst::entry_point()); + config.main=required_entry_function.name.c_str(); + + // TODO(tkiley): calling final is not really correct (in fact for example, + // opaque function stubs get generated here). Instead the final method should + // call this to generate the function in the first place. + bool return_code=final(symbol_table); + + // Remove the function from the goto_functions so is copied back in + // from the symbol table + if(!return_code) + { + const auto &start_function= + goto_functions.function_map.find(goto_functionst::entry_point()); + if(start_function!=goto_functions.function_map.end()) + { + goto_functions.function_map.erase(start_function); + } + } + + return return_code; +} diff --git a/src/util/language.h b/src/util/language.h index ebe10bba1a8..fa7d6fa62c6 100644 --- a/src/util/language.h +++ b/src/util/language.h @@ -119,6 +119,11 @@ class languaget:public messaget void set_should_generate_opaque_method_stubs(bool should_generate_stubs); + bool regenerate_start_function( + const class symbolt &required_entry_function, + symbol_tablet &symbol_table, + class goto_functionst &goto_functions); + // constructor / destructor languaget() { } From 2a3d8767266e64ed3f6af554ad19e37389bc75a9 Mon Sep 17 00:00:00 2001 From: thk123 Date: Wed, 7 Dec 2016 15:19:28 +0000 Subject: [PATCH 60/80] Adding explanatory comment --- src/cbmc/cbmc_parse_options.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cbmc/cbmc_parse_options.cpp b/src/cbmc/cbmc_parse_options.cpp index d8e8ecddd2b..a2bf08cdc43 100644 --- a/src/cbmc/cbmc_parse_options.cpp +++ b/src/cbmc/cbmc_parse_options.cpp @@ -624,6 +624,8 @@ int cbmc_parse_optionst::get_goto_program( try { if(initialize_goto_model(goto_model, cmdline, get_message_handler())) + // Remove all binaries from the command line as they + // are already compiled return 6; if(cmdline.isset("function")) From ee5fb9302b595c3c722c502c77920204184cd11c Mon Sep 17 00:00:00 2001 From: thk123 Date: Wed, 7 Dec 2016 17:30:33 +0000 Subject: [PATCH 61/80] Protect against invalid function label Check the symbol actually exists before trying to regenerate the _start function. --- src/cbmc/cbmc_parse_options.cpp | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/cbmc/cbmc_parse_options.cpp b/src/cbmc/cbmc_parse_options.cpp index a2bf08cdc43..c3437fba741 100644 --- a/src/cbmc/cbmc_parse_options.cpp +++ b/src/cbmc/cbmc_parse_options.cpp @@ -630,14 +630,24 @@ int cbmc_parse_optionst::get_goto_program( if(cmdline.isset("function")) { - const symbolt &desired_entry_function= - symbol_table.lookup(cmdline.get_value("function")); - languaget *language=get_language_from_mode(desired_entry_function.mode); - - language->regenerate_start_function( - desired_entry_function, - symbol_table, - goto_functions); + const std::string &function_id=cmdline.get_value("function"); + const auto &desired_entry_function= + symbol_table.symbols.find(function_id); + + if(desired_entry_function!=symbol_table.symbols.end()) + { + languaget *language=get_language_from_mode( + desired_entry_function->second.mode); + language->regenerate_start_function( + desired_entry_function->second, + symbol_table, + goto_functions); + } + else + { + error() << "main symbol `" << function_id; + error() << "' not found" << messaget::eom; + } } if(cmdline.isset("show-symbol-table")) From cd416bc609e7bce2ca531fa2392934c424a062d8 Mon Sep 17 00:00:00 2001 From: thk123 Date: Wed, 7 Dec 2016 17:35:31 +0000 Subject: [PATCH 62/80] Call generate_start_function only when regenerating the start function Rather than calling the final method, call a refactored out method that is just responsible for generating the _start body. --- src/ansi-c/ansi_c_entry_point.cpp | 19 ++++++++++++++++++- src/ansi-c/ansi_c_entry_point.h | 5 +++++ src/ansi-c/ansi_c_language.cpp | 16 ++++++++++++++++ src/ansi-c/ansi_c_language.h | 4 ++++ src/util/language.cpp | 24 ++++++++++++++++++------ src/util/language.h | 6 +++++- 6 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/ansi-c/ansi_c_entry_point.cpp b/src/ansi-c/ansi_c_entry_point.cpp index af1f6c1cb51..7ec84442665 100644 --- a/src/ansi-c/ansi_c_entry_point.cpp +++ b/src/ansi-c/ansi_c_entry_point.cpp @@ -18,6 +18,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include +#include #include #include @@ -190,6 +191,22 @@ bool ansi_c_entry_point( if(static_lifetime_init(symbol_table, symbol.location, message_handler)) return true; + return generate_ansi_c_start_function(symbol, symbol_table, message_handler); +} + + +/// Generate a _start function for a specific function +/// \param entry_function_symbol: The symbol for the function that should be +/// used as the entry point +/// \param symbol_table: The symbol table for the program. The new _start +/// function symbol will be added to this table +/// \return Returns false if the _start method was generated correctly +bool generate_ansi_c_start_function( + const symbolt &symbol, + symbol_tablet &symbol_table, + message_handlert &message_handler) +{ + PRECONDITION(!symbol.value.is_nil()); code_blockt init_code; // build call to initialization function @@ -237,7 +254,7 @@ bool ansi_c_entry_point( const code_typet::parameterst ¶meters= to_code_type(symbol.type).parameters(); - if(symbol.name==standard_main) + if(symbol.name==ID_main) { if(parameters.empty()) { diff --git a/src/ansi-c/ansi_c_entry_point.h b/src/ansi-c/ansi_c_entry_point.h index 835dd31845d..70f028408ac 100644 --- a/src/ansi-c/ansi_c_entry_point.h +++ b/src/ansi-c/ansi_c_entry_point.h @@ -18,4 +18,9 @@ bool ansi_c_entry_point( const std::string &standard_main, message_handlert &message_handler); +bool generate_ansi_c_start_function( + const symbolt &symbol, + symbol_tablet &symbol_table, + message_handlert &message_handler); + #endif // CPROVER_ANSI_C_ANSI_C_ENTRY_POINT_H diff --git a/src/ansi-c/ansi_c_language.cpp b/src/ansi-c/ansi_c_language.cpp index 46024683f96..4d19383bfef 100644 --- a/src/ansi-c/ansi_c_language.cpp +++ b/src/ansi-c/ansi_c_language.cpp @@ -36,6 +36,22 @@ void ansi_c_languaget::modules_provided(std::set &modules) modules.insert(get_base_name(parse_path, true)); } +/// Generate a _start function for a specific function +/// \param entry_function_symbol: The symbol for the function that should be +/// used as the entry point +/// \param symbol_table: The symbol table for the program. The new _start +/// function symbol will be added to this table +/// \return Returns false if the _start method was generated correctly +bool ansi_c_languaget::generate_start_function( + const symbolt &entry_function_symbol, + symbol_tablet &symbol_table) +{ + return generate_ansi_c_start_function( + entry_function_symbol, + symbol_table, + *message_handler); +} + /// ANSI-C preprocessing bool ansi_c_languaget::preprocess( std::istream &instream, diff --git a/src/ansi-c/ansi_c_language.h b/src/ansi-c/ansi_c_language.h index e20593c1f03..6b2f18f2aef 100644 --- a/src/ansi-c/ansi_c_language.h +++ b/src/ansi-c/ansi_c_language.h @@ -73,6 +73,10 @@ class ansi_c_languaget:public languaget void modules_provided(std::set &modules) override; + virtual bool generate_start_function( + const class symbolt &entry_function_symbol, + class symbol_tablet &symbol_table) override; + protected: ansi_c_parse_treet parse_tree; std::string parse_path; diff --git a/src/util/language.cpp b/src/util/language.cpp index 82467f4705e..5feaacb1c30 100644 --- a/src/util/language.cpp +++ b/src/util/language.cpp @@ -194,6 +194,22 @@ void languaget::generate_opaque_parameter_symbols( } } +/// Generate a entry function for a specific function. Should be overriden in +/// derived languagets +/// \param entry_function_symbol: The symbol for the function that should be +/// used as the entry point +/// \param symbol_table: The symbol table for the program. The new _start +/// function symbol will be added to this table +/// \return Returns false if the entry method was generated correctly +bool languaget::generate_start_function( + const symbolt &entry_function_symbol, + symbol_tablet &symbol_table) +{ + // Implement in derived languagets + assert(0); + return true; +} + /// To replace an existing _start function with a new one that calls a specified /// function /// \param required_entry_function: a code symbol inside the symbol table which @@ -205,18 +221,14 @@ void languaget::generate_opaque_parameter_symbols( /// \return Returns false if the new start function is created successfully, /// true otherwise. bool languaget::regenerate_start_function( - const symbolt &required_entry_function, + const symbolt &entry_function_symbol, symbol_tablet &symbol_table, goto_functionst &goto_functions) { // Remove the existing _start function so we can create a new one symbol_table.remove(goto_functionst::entry_point()); - config.main=required_entry_function.name.c_str(); - // TODO(tkiley): calling final is not really correct (in fact for example, - // opaque function stubs get generated here). Instead the final method should - // call this to generate the function in the first place. - bool return_code=final(symbol_table); + bool return_code=generate_start_function(entry_function_symbol, symbol_table); // Remove the function from the goto_functions so is copied back in // from the symbol table diff --git a/src/util/language.h b/src/util/language.h index fa7d6fa62c6..c219ba6b854 100644 --- a/src/util/language.h +++ b/src/util/language.h @@ -119,8 +119,12 @@ class languaget:public messaget void set_should_generate_opaque_method_stubs(bool should_generate_stubs); + virtual bool generate_start_function( + const class symbolt &entry_function_symbol, + class symbol_tablet &symbol_table); + bool regenerate_start_function( - const class symbolt &required_entry_function, + const class symbolt &entry_function_symbol, symbol_tablet &symbol_table, class goto_functionst &goto_functions); From 94b7185eb937f447d9abdc7032d715aeb29b9442 Mon Sep 17 00:00:00 2001 From: thk123 Date: Wed, 7 Dec 2016 18:05:07 +0000 Subject: [PATCH 63/80] Implemented generate_start_function for Java As with the ANSI C version, the Java version undergoes a simmilar refactor: splitting out the start generation from final so that it can be regenerated on demand. 2 The entry function in Java now has some parameters that need to passed to it. Since they are member variables in the java_bytecode_langauge they can just be passed in from the virtual regenerate call. --- src/java_bytecode/java_bytecode_language.cpp | 20 +++++++++++++++ src/java_bytecode/java_bytecode_language.h | 4 +++ src/java_bytecode/java_entry_point.cpp | 26 ++++++++++++++++++++ src/java_bytecode/java_entry_point.h | 9 +++++++ 4 files changed, 59 insertions(+) diff --git a/src/java_bytecode/java_bytecode_language.cpp b/src/java_bytecode/java_bytecode_language.cpp index 7711940b781..3e0195c735c 100644 --- a/src/java_bytecode/java_bytecode_language.cpp +++ b/src/java_bytecode/java_bytecode_language.cpp @@ -106,6 +106,26 @@ void java_bytecode_languaget::modules_provided(std::set &modules) // modules.insert(translation_unit(parse_path)); } +/// Generate a _start function for a specific function. +/// \param entry_function_symbol: The symbol for the function that should be +/// used as the entry point +/// \param symbol_table: The symbol table for the program. The new _start +/// function symbol will be added to this table +/// \return Returns false if the _start method was generated correctly +bool java_bytecode_languaget::generate_start_function( + const symbolt &entry_function_symbol, + symbol_tablet &symbol_table) +{ + return generate_java_start_function( + entry_function_symbol, + symbol_table, + get_message_handler(), + assume_inputs_non_null, + max_nondet_array_length, + max_nondet_tree_depth, + *pointer_type_selector); +} + /// ANSI-C preprocessing bool java_bytecode_languaget::preprocess( std::istream &instream, diff --git a/src/java_bytecode/java_bytecode_language.h b/src/java_bytecode/java_bytecode_language.h index c70e7ce082a..c6596aac427 100644 --- a/src/java_bytecode/java_bytecode_language.h +++ b/src/java_bytecode/java_bytecode_language.h @@ -137,6 +137,10 @@ class java_bytecode_languaget:public languaget virtual void convert_lazy_method( const irep_idt &id, symbol_tablet &) override; + virtual bool generate_start_function( + const class symbolt &entry_function_symbol, + class symbol_tablet &symbol_table) override; + protected: bool do_ci_lazy_method_conversion(symbol_tablet &, lazy_methodst &); const select_pointer_typet &get_pointer_type_selector() const; diff --git a/src/java_bytecode/java_entry_point.cpp b/src/java_bytecode/java_entry_point.cpp index c142f37ddf5..9b3dd0a2f1d 100644 --- a/src/java_bytecode/java_entry_point.cpp +++ b/src/java_bytecode/java_entry_point.cpp @@ -510,6 +510,32 @@ bool java_entry_point( max_nondet_tree_depth, pointer_type_selector); + return generate_java_start_function( + symbol, + symbol_table, + message_handler, + assume_init_pointers_not_null, + max_nondet_array_length, + max_nondet_tree_depth, + pointer_type_selector); +} + +/// Generate a _start function for a specific function +/// \param entry_function_symbol: The symbol for the function that should be +/// used as the entry point +/// \param symbol_table: The symbol table for the program. The new _start +/// function symbol will be added to this table +/// \return Returns false if the _start method was generated correctly +bool generate_java_start_function( + const symbolt &symbol, + symbol_tablet &symbol_table, + message_handlert &message_handler, + bool assume_init_pointers_not_null, + size_t max_nondet_array_length, + size_t max_nondet_tree_depth, + const select_pointer_typet &pointer_type_selector) +{ + messaget message(message_handler); code_blockt init_code; // build call to initialization function diff --git a/src/java_bytecode/java_entry_point.h b/src/java_bytecode/java_entry_point.h index 18e42aafc65..cc03e8480b5 100644 --- a/src/java_bytecode/java_entry_point.h +++ b/src/java_bytecode/java_entry_point.h @@ -40,4 +40,13 @@ main_function_resultt get_main_symbol( message_handlert &, bool allow_no_body=false); +bool generate_java_start_function( + const symbolt &symbol, + class symbol_tablet &symbol_table, + class message_handlert &message_handler, + bool assume_init_pointers_not_null, + size_t max_nondet_array_length, + size_t max_nondet_tree_depth, + const select_pointer_typet &pointer_type_selector); + #endif // CPROVER_JAVA_BYTECODE_JAVA_ENTRY_POINT_H From 71e6800e36b09d35d9556efeeed0c1330249e388 Mon Sep 17 00:00:00 2001 From: thk123 Date: Thu, 8 Dec 2016 11:42:30 +0000 Subject: [PATCH 64/80] Added regression test for using --function on a GOTO program Ensure that despite the prescence of a main method being compiled as the entry point, we can still override it using --function in CBMC. --- regression/Makefile | 1 + regression/goto-cc-cbmc/Makefile | 30 +++++++++++++++++++ regression/goto-cc-cbmc/chain.sh | 12 ++++++++ .../regenerate-entry-function/main.c | 23 ++++++++++++++ .../regenerate-entry-function/test.desc | 9 ++++++ 5 files changed, 75 insertions(+) create mode 100644 regression/goto-cc-cbmc/Makefile create mode 100755 regression/goto-cc-cbmc/chain.sh create mode 100644 regression/goto-cc-cbmc/regenerate-entry-function/main.c create mode 100644 regression/goto-cc-cbmc/regenerate-entry-function/test.desc diff --git a/regression/Makefile b/regression/Makefile index f4d37f8c442..74ae36dd7be 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -5,6 +5,7 @@ DIRS = ansi-c \ cbmc-java-inheritance \ cpp \ goto-analyzer \ + goto-cc-cbmc \ goto-diff \ goto-gcc \ goto-instrument \ diff --git a/regression/goto-cc-cbmc/Makefile b/regression/goto-cc-cbmc/Makefile new file mode 100644 index 00000000000..191f99fcba1 --- /dev/null +++ b/regression/goto-cc-cbmc/Makefile @@ -0,0 +1,30 @@ +default: tests.log + +test: + @if ! ../test.pl -c ../chain.sh ; then \ + ../failed-tests-printer.pl ; \ + exit 1; \ + fi + +tests.log: + @if ! ../test.pl -c ../chain.sh ; then \ + ../failed-tests-printer.pl ; \ + exit 1; \ + fi + +show: + @for dir in *; do \ + if [ -d "$$dir" ]; then \ + vim -o "$$dir/*.c" "$$dir/*.out"; \ + fi; \ + done; + +clean: + @for dir in *; do \ + $(RM) tests.log; \ + if [ -d "$$dir" ]; then \ + cd "$$dir"; \ + $(RM) *.out *.gb; \ + cd ..; \ + fi \ + done diff --git a/regression/goto-cc-cbmc/chain.sh b/regression/goto-cc-cbmc/chain.sh new file mode 100755 index 00000000000..1440e03272d --- /dev/null +++ b/regression/goto-cc-cbmc/chain.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +SRC=../../../src + +GC=$SRC/goto-cc/goto-cc +CBMC=$SRC/cbmc/cbmc + +OPTS=$1 +NAME=${2%.c} + +$GC $NAME.c -o $NAME.gb +$CBMC $NAME.gb $OPTS diff --git a/regression/goto-cc-cbmc/regenerate-entry-function/main.c b/regression/goto-cc-cbmc/regenerate-entry-function/main.c new file mode 100644 index 00000000000..644ef1eb086 --- /dev/null +++ b/regression/goto-cc-cbmc/regenerate-entry-function/main.c @@ -0,0 +1,23 @@ +int fun(int x) +{ + if(x > 0) + { + return x * x; + } + else + { + return x; + } +} + +int main(int argc, char** argv) +{ + if(argc>4) + { + return 0; + } + else + { + return 1; + } +} diff --git a/regression/goto-cc-cbmc/regenerate-entry-function/test.desc b/regression/goto-cc-cbmc/regenerate-entry-function/test.desc new file mode 100644 index 00000000000..fe127f9316b --- /dev/null +++ b/regression/goto-cc-cbmc/regenerate-entry-function/test.desc @@ -0,0 +1,9 @@ +CORE +main.c +"--function fun --cover branch" + +^EXIT=0$ +^SIGNAL=0$ +^x= +-- +^warning: ignoring From f0d6d72b48b62aba9e3b8e583b4fdb58f8e7957c Mon Sep 17 00:00:00 2001 From: thk123 Date: Mon, 12 Dec 2016 11:57:22 +0000 Subject: [PATCH 65/80] Refactored the regenerate function into goto-programs Moved the function for discarding the symbol and GOTO function and calling the languaget::generate_start_function into a class in goto- programs. This was done as util should not depend on goto-programs. --- src/cbmc/cbmc_parse_options.cpp | 21 ++--- src/goto-programs/Makefile | 1 + .../rebuild_goto_start_function.cpp | 84 +++++++++++++++++++ .../rebuild_goto_start_function.h | 32 +++++++ src/util/language.cpp | 36 -------- src/util/language.h | 5 -- 6 files changed, 124 insertions(+), 55 deletions(-) create mode 100644 src/goto-programs/rebuild_goto_start_function.cpp create mode 100644 src/goto-programs/rebuild_goto_start_function.h diff --git a/src/cbmc/cbmc_parse_options.cpp b/src/cbmc/cbmc_parse_options.cpp index c3437fba741..a9040724648 100644 --- a/src/cbmc/cbmc_parse_options.cpp +++ b/src/cbmc/cbmc_parse_options.cpp @@ -51,6 +51,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include +#include #include #include @@ -631,22 +632,14 @@ int cbmc_parse_optionst::get_goto_program( if(cmdline.isset("function")) { const std::string &function_id=cmdline.get_value("function"); - const auto &desired_entry_function= - symbol_table.symbols.find(function_id); + rebuild_goto_start_functiont start_function_rebuilder( + get_message_handler(), + goto_model.symbol_table, + goto_model.goto_functions); - if(desired_entry_function!=symbol_table.symbols.end()) + if(start_function_rebuilder(function_id)) { - languaget *language=get_language_from_mode( - desired_entry_function->second.mode); - language->regenerate_start_function( - desired_entry_function->second, - symbol_table, - goto_functions); - } - else - { - error() << "main symbol `" << function_id; - error() << "' not found" << messaget::eom; + return 6; } } diff --git a/src/goto-programs/Makefile b/src/goto-programs/Makefile index b164beef079..4da25537292 100644 --- a/src/goto-programs/Makefile +++ b/src/goto-programs/Makefile @@ -36,6 +36,7 @@ SRC = basic_blocks.cpp \ property_checker.cpp \ read_bin_goto_object.cpp \ read_goto_binary.cpp \ + rebuild_goto_start_function.cpp \ remove_asm.cpp \ remove_complex.cpp \ remove_const_function_pointers.cpp \ diff --git a/src/goto-programs/rebuild_goto_start_function.cpp b/src/goto-programs/rebuild_goto_start_function.cpp new file mode 100644 index 00000000000..dc73846c8d3 --- /dev/null +++ b/src/goto-programs/rebuild_goto_start_function.cpp @@ -0,0 +1,84 @@ +/*******************************************************************\ + Module: Goto Programs + Author: Thomas Kiley, thomas@diffblue.com +\*******************************************************************/ + +/// \file +/// Goto Programs Author: Thomas Kiley, thomas@diffblue.com + +#include "rebuild_goto_start_function.h" + +#include +#include +#include +#include +#include +#include + +/// To rebuild the _start funciton in the event the program was compiled into +/// GOTO with a different entry function selected. +/// \param _message_handler: The message handler to report any messages with +/// \param symbol_table: The symbol table of the program (to replace the _start +/// functions symbo) +/// \param goto_functions: The goto functions of the program (to replace the +/// body of the _start function). +rebuild_goto_start_functiont::rebuild_goto_start_functiont( + message_handlert &_message_handler, + symbol_tablet &symbol_table, + goto_functionst &goto_functions): + messaget(_message_handler), + symbol_table(symbol_table), + goto_functions(goto_functions) +{ +} + +/// To rebuild the _start function in the event the program was compiled into +/// GOTO with a different entry function selected. It works by discarding the +/// _start symbol and GOTO function and calling on the relevant languaget to +/// generate the _start function again. +/// \param entry_function: The name of the entry function that should be +/// called from _start +/// \return Returns true if either the symbol is not found, or something went +/// wrong with generating the start_function. False otherwise. +bool rebuild_goto_start_functiont::operator()( + const irep_idt &entry_function) +{ + const auto &desired_entry_function= + symbol_table.symbols.find(entry_function); + + // Check the specified entry function is a function in the symbol table + if(desired_entry_function==symbol_table.symbols.end()) + { + error() << "main symbol `" << entry_function + << "' not found" << eom; + return true; + } + + // Remove the existing _start function so we can create a new one + symbol_table.remove(goto_functionst::entry_point()); + + auto language= + std::unique_ptr( + get_language_from_mode( + desired_entry_function->second.mode)); + assert(language); + + bool return_code= + language->generate_start_function( + desired_entry_function->second, + symbol_table); + + // Remove the function from the goto_functions so it is copied back in + // from the symbol table + if(!return_code) + { + const auto &start_function= + goto_functions.function_map.find(goto_functionst::entry_point()); + if(start_function!=goto_functions.function_map.end()) + { + goto_functions.function_map.erase(start_function); + } + } + + return return_code; +} diff --git a/src/goto-programs/rebuild_goto_start_function.h b/src/goto-programs/rebuild_goto_start_function.h new file mode 100644 index 00000000000..f2485228f86 --- /dev/null +++ b/src/goto-programs/rebuild_goto_start_function.h @@ -0,0 +1,32 @@ +/*******************************************************************\ + Module: Goto Programs + Author: Thomas Kiley, thomas@diffblue.com +\*******************************************************************/ + +/// \file +/// Goto Programs Author: Thomas Kiley, thomas@diffblue.com + +#ifndef CPROVER_GOTO_PROGRAMS_REBUILD_GOTO_START_FUNCTION_H +#define CPROVER_GOTO_PROGRAMS_REBUILD_GOTO_START_FUNCTION_H + +#include + +class symbol_tablet; +class goto_functionst; + +class rebuild_goto_start_functiont: public messaget +{ +public: + rebuild_goto_start_functiont( + message_handlert &_message_handler, + symbol_tablet &symbol_table, + goto_functionst &goto_functions); + + bool operator()(const irep_idt &entry_function); + +private: + symbol_tablet &symbol_table; + goto_functionst &goto_functions; +}; + +#endif // CPROVER_GOTO_PROGRAMS_REBUILD_GOTO_START_FUNCTION_H diff --git a/src/util/language.cpp b/src/util/language.cpp index 5feaacb1c30..20a7b4f2d4d 100644 --- a/src/util/language.cpp +++ b/src/util/language.cpp @@ -12,13 +12,11 @@ Author: Daniel Kroening, kroening@kroening.com #include "language.h" #include "expr.h" -#include #include #include #include #include #include -#include bool languaget::final(symbol_tablet &symbol_table) { @@ -210,37 +208,3 @@ bool languaget::generate_start_function( return true; } -/// To replace an existing _start function with a new one that calls a specified -/// function -/// \param required_entry_function: a code symbol inside the symbol table which -/// is the function that should be used as the entry point. -/// \param symbol_table: the symbol table for the program. The _start symbol -/// will be replaced with a new start function -/// \param goto_functions: the functions for the goto program. The _start -/// function will be erased from this -/// \return Returns false if the new start function is created successfully, -/// true otherwise. -bool languaget::regenerate_start_function( - const symbolt &entry_function_symbol, - symbol_tablet &symbol_table, - goto_functionst &goto_functions) -{ - // Remove the existing _start function so we can create a new one - symbol_table.remove(goto_functionst::entry_point()); - - bool return_code=generate_start_function(entry_function_symbol, symbol_table); - - // Remove the function from the goto_functions so is copied back in - // from the symbol table - if(!return_code) - { - const auto &start_function= - goto_functions.function_map.find(goto_functionst::entry_point()); - if(start_function!=goto_functions.function_map.end()) - { - goto_functions.function_map.erase(start_function); - } - } - - return return_code; -} diff --git a/src/util/language.h b/src/util/language.h index c219ba6b854..83429b8cc75 100644 --- a/src/util/language.h +++ b/src/util/language.h @@ -123,11 +123,6 @@ class languaget:public messaget const class symbolt &entry_function_symbol, class symbol_tablet &symbol_table); - bool regenerate_start_function( - const class symbolt &entry_function_symbol, - symbol_tablet &symbol_table, - class goto_functionst &goto_functions); - // constructor / destructor languaget() { } From 2aea88d80c7704c5ec8754737f14c683772bf5dd Mon Sep 17 00:00:00 2001 From: thk123 Date: Mon, 12 Dec 2016 12:34:09 +0000 Subject: [PATCH 66/80] Made generate_start_function abstract Made the generat_start_function abstract to ensure new langugages are at least aware they should provide implemention for this method. CPP and JSIL languages have stub method that asserts for now. --- src/cpp/cpp_language.cpp | 16 ++++++++++++++++ src/cpp/cpp_language.h | 4 ++++ src/jsil/jsil_language.cpp | 16 ++++++++++++++++ src/jsil/jsil_language.h | 4 ++++ src/util/language.cpp | 17 ----------------- src/util/language.h | 2 +- 6 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/cpp/cpp_language.cpp b/src/cpp/cpp_language.cpp index baa06dbcd48..f37c33be1b3 100644 --- a/src/cpp/cpp_language.cpp +++ b/src/cpp/cpp_language.cpp @@ -53,6 +53,22 @@ void cpp_languaget::modules_provided(std::set &modules) modules.insert(get_base_name(parse_path, true)); } +/// Generate a _start function for a specific function +/// \param entry_function_symbol: The symbol for the function that should be +/// used as the entry point +/// \param symbol_table: The symbol table for the program. The new _start +/// function symbol will be added to this table +/// \return Returns false if the _start method was generated correctly +bool cpp_languaget::generate_start_function( + const symbolt &entry_function_symbol, + symbol_tablet &symbol_table) +{ + return generate_ansi_c_start_function( + entry_function_symbol, + symbol_table, + *message_handler); +} + /// ANSI-C preprocessing bool cpp_languaget::preprocess( std::istream &instream, diff --git a/src/cpp/cpp_language.h b/src/cpp/cpp_language.h index c43f9304a98..0404d12b646 100644 --- a/src/cpp/cpp_language.h +++ b/src/cpp/cpp_language.h @@ -85,6 +85,10 @@ class cpp_languaget:public languaget void modules_provided(std::set &modules) override; + virtual bool generate_start_function( + const class symbolt &entry_function_symbol, + class symbol_tablet &symbol_table) override; + protected: cpp_parse_treet cpp_parse_tree; std::string parse_path; diff --git a/src/jsil/jsil_language.cpp b/src/jsil/jsil_language.cpp index f0c5ad38c13..4ba8203a1e2 100644 --- a/src/jsil/jsil_language.cpp +++ b/src/jsil/jsil_language.cpp @@ -41,6 +41,22 @@ bool jsil_languaget::interfaces(symbol_tablet &symbol_table) return false; } +/// Generate a _start function for a specific function +/// \param entry_function_symbol: The symbol for the function that should be +/// used as the entry point +/// \param symbol_table: The symbol table for the program. The new _start +/// function symbol will be added to this table +/// \return Returns false if the _start method was generated correctly +bool jsil_languaget::generate_start_function( + const symbolt &entry_function_symbol, + symbol_tablet &symbol_table) +{ + // TODO(tkiley): This should be implemented if this language + // is used. + UNREACHABLE; + return true; +} + bool jsil_languaget::preprocess( std::istream &instream, const std::string &path, diff --git a/src/jsil/jsil_language.h b/src/jsil/jsil_language.h index da889e111a1..b5fb8076183 100644 --- a/src/jsil/jsil_language.h +++ b/src/jsil/jsil_language.h @@ -69,6 +69,10 @@ class jsil_languaget:public languaget virtual void modules_provided(std::set &modules); virtual bool interfaces(symbol_tablet &symbol_table); + virtual bool generate_start_function( + const class symbolt &entry_function_symbol, + class symbol_tablet &symbol_table) override; + protected: jsil_parse_treet parse_tree; std::string parse_path; diff --git a/src/util/language.cpp b/src/util/language.cpp index 20a7b4f2d4d..6bd0211d4a4 100644 --- a/src/util/language.cpp +++ b/src/util/language.cpp @@ -191,20 +191,3 @@ void languaget::generate_opaque_parameter_symbols( symbol_table.add(param_symbol); } } - -/// Generate a entry function for a specific function. Should be overriden in -/// derived languagets -/// \param entry_function_symbol: The symbol for the function that should be -/// used as the entry point -/// \param symbol_table: The symbol table for the program. The new _start -/// function symbol will be added to this table -/// \return Returns false if the entry method was generated correctly -bool languaget::generate_start_function( - const symbolt &entry_function_symbol, - symbol_tablet &symbol_table) -{ - // Implement in derived languagets - assert(0); - return true; -} - diff --git a/src/util/language.h b/src/util/language.h index 83429b8cc75..88db199fee7 100644 --- a/src/util/language.h +++ b/src/util/language.h @@ -121,7 +121,7 @@ class languaget:public messaget virtual bool generate_start_function( const class symbolt &entry_function_symbol, - class symbol_tablet &symbol_table); + class symbol_tablet &symbol_table)=0; // constructor / destructor From 71dec3dbc588aa7c19e311a37b84bd9ec6f5160f Mon Sep 17 00:00:00 2001 From: thk123 Date: Mon, 12 Dec 2016 12:44:54 +0000 Subject: [PATCH 67/80] Use ID_main as the default name for entry function Rather than have a parameter which specifies the entry function, use the appropriate ID. This saves having three seperate places with the string "main" hard coded. --- src/ansi-c/ansi_c_entry_point.cpp | 3 +-- src/ansi-c/ansi_c_entry_point.h | 1 - src/ansi-c/ansi_c_language.cpp | 3 +-- src/cpp/cpp_language.cpp | 2 +- src/goto-cc/compile.cpp | 2 +- 5 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/ansi-c/ansi_c_entry_point.cpp b/src/ansi-c/ansi_c_entry_point.cpp index 7ec84442665..25612bc4d93 100644 --- a/src/ansi-c/ansi_c_entry_point.cpp +++ b/src/ansi-c/ansi_c_entry_point.cpp @@ -121,7 +121,6 @@ void record_function_outputs( bool ansi_c_entry_point( symbol_tablet &symbol_table, - const std::string &standard_main, message_handlert &message_handler) { // check if entry point is already there @@ -168,7 +167,7 @@ bool ansi_c_entry_point( main_symbol=matches.front(); } else - main_symbol=standard_main; + main_symbol=ID_main; // look it up symbol_tablet::symbolst::const_iterator s_it= diff --git a/src/ansi-c/ansi_c_entry_point.h b/src/ansi-c/ansi_c_entry_point.h index 70f028408ac..fe0ed04a2c1 100644 --- a/src/ansi-c/ansi_c_entry_point.h +++ b/src/ansi-c/ansi_c_entry_point.h @@ -15,7 +15,6 @@ Author: Daniel Kroening, kroening@kroening.com bool ansi_c_entry_point( symbol_tablet &symbol_table, - const std::string &standard_main, message_handlert &message_handler); bool generate_ansi_c_start_function( diff --git a/src/ansi-c/ansi_c_language.cpp b/src/ansi-c/ansi_c_language.cpp index 4d19383bfef..ce28fa1e70c 100644 --- a/src/ansi-c/ansi_c_language.cpp +++ b/src/ansi-c/ansi_c_language.cpp @@ -143,8 +143,7 @@ bool ansi_c_languaget::typecheck( bool ansi_c_languaget::final(symbol_tablet &symbol_table) { generate_opaque_method_stubs(symbol_table); - - if(ansi_c_entry_point(symbol_table, "main", get_message_handler())) + if(ansi_c_entry_point(symbol_table, get_message_handler())) return true; return false; diff --git a/src/cpp/cpp_language.cpp b/src/cpp/cpp_language.cpp index f37c33be1b3..c14b46b7d7a 100644 --- a/src/cpp/cpp_language.cpp +++ b/src/cpp/cpp_language.cpp @@ -152,7 +152,7 @@ bool cpp_languaget::typecheck( bool cpp_languaget::final(symbol_tablet &symbol_table) { - if(ansi_c_entry_point(symbol_table, "main", get_message_handler())) + if(ansi_c_entry_point(symbol_table, get_message_handler())) return true; return false; diff --git a/src/goto-cc/compile.cpp b/src/goto-cc/compile.cpp index 71f0d81160e..03cdd8544f6 100644 --- a/src/goto-cc/compile.cpp +++ b/src/goto-cc/compile.cpp @@ -368,7 +368,7 @@ bool compilet::link() symbol_table.remove(goto_functionst::entry_point()); compiled_functions.function_map.erase(goto_functionst::entry_point()); - if(ansi_c_entry_point(symbol_table, "main", get_message_handler())) + if(ansi_c_entry_point(symbol_table, get_message_handler())) return true; // entry_point may (should) add some more functions. From 0732580578b91f46e35677e1f223b25e96d767dc Mon Sep 17 00:00:00 2001 From: thk123 Date: Tue, 24 Jan 2017 10:57:04 +0000 Subject: [PATCH 68/80] Adding missing overrides Clang warns for files that inconsistently use the override keyword so added the missing ones to jsil_language. --- src/jsil/jsil_language.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/jsil/jsil_language.h b/src/jsil/jsil_language.h index b5fb8076183..a49b727d662 100644 --- a/src/jsil/jsil_language.h +++ b/src/jsil/jsil_language.h @@ -25,19 +25,19 @@ class jsil_languaget:public languaget virtual bool preprocess( std::istream &instream, const std::string &path, - std::ostream &outstream); + std::ostream &outstream) override; virtual bool parse( std::istream &instream, - const std::string &path); + const std::string &path) override; virtual bool typecheck( symbol_tablet &context, - const std::string &module); + const std::string &module) override; - virtual bool final(symbol_tablet &context); + virtual bool final(symbol_tablet &context) override; - virtual void show_parse(std::ostream &out); + virtual void show_parse(std::ostream &out) override; virtual ~jsil_languaget(); jsil_languaget() { } @@ -45,29 +45,29 @@ class jsil_languaget:public languaget virtual bool from_expr( const exprt &expr, std::string &code, - const namespacet &ns); + const namespacet &ns) override; virtual bool from_type( const typet &type, std::string &code, - const namespacet &ns); + const namespacet &ns) override; virtual bool to_expr( const std::string &code, const std::string &module, exprt &expr, - const namespacet &ns); + const namespacet &ns) override; - virtual std::unique_ptr new_language() + virtual std::unique_ptr new_language() override { return util_make_unique(); } - virtual std::string id() const { return "jsil"; } - virtual std::string description() const + virtual std::string id() const override { return "jsil"; } + virtual std::string description() const override { return "Javascript Intermediate Language"; } - virtual std::set extensions() const; + virtual std::set extensions() const override; - virtual void modules_provided(std::set &modules); - virtual bool interfaces(symbol_tablet &symbol_table); + virtual void modules_provided(std::set &modules) override; + virtual bool interfaces(symbol_tablet &symbol_table) override; virtual bool generate_start_function( const class symbolt &entry_function_symbol, From 1ccd1a2c861324afaa58cadae4786805491a8b95 Mon Sep 17 00:00:00 2001 From: thk123 Date: Fri, 3 Feb 2017 14:52:07 +0000 Subject: [PATCH 69/80] Add support for using the --function flag to goto-analyze and symex symex and goto-analyze (through the goto_modelt class) now support setting the --function flag on precompiled .gb files. Refactored out the function flag and its help function to rebuild_goto_start_functions. Used this extracted flag in goto-analyze, symex and CBMC. Added tests that check both goto-analyze and symex when ran with the --function flag actually generate the correct _start function. Also added tests for when it isn't a precompiled binary. Added these new folders to the overal test suite --- regression/Makefile | 2 ++ .../regenerate-entry-function/main.c | 16 ++++++++++ .../regenerate-entry-function/test.desc | 8 +++++ .../regenerate-entry-function/test.desc | 1 - regression/goto-cc-goto-analyzer/Makefile | 32 +++++++++++++++++++ regression/goto-cc-goto-analyzer/chain.sh | 12 +++++++ .../regenerate-entry-function/main.c | 16 ++++++++++ .../regenerate-entry-function/test.desc | 8 +++++ regression/goto-cc-symex/Makefile | 32 +++++++++++++++++++ regression/goto-cc-symex/chain.sh | 12 +++++++ .../regenerate-entry-function/main.c | 16 ++++++++++ .../regenerate-entry-function/test.desc | 8 +++++ .../symex/regenerate-entry-function/main.c | 16 ++++++++++ .../symex/regenerate-entry-function/test.desc | 8 +++++ src/cbmc/cbmc_parse_options.cpp | 2 +- src/cbmc/cbmc_parse_options.h | 4 ++- .../goto_analyzer_parse_options.cpp | 1 + .../goto_analyzer_parse_options.h | 3 +- .../rebuild_goto_start_function.cpp | 2 +- .../rebuild_goto_start_function.h | 6 ++++ src/symex/symex_parse_options.cpp | 2 +- src/symex/symex_parse_options.h | 3 +- 22 files changed, 203 insertions(+), 7 deletions(-) create mode 100644 regression/goto-analyzer/regenerate-entry-function/main.c create mode 100644 regression/goto-analyzer/regenerate-entry-function/test.desc create mode 100644 regression/goto-cc-goto-analyzer/Makefile create mode 100755 regression/goto-cc-goto-analyzer/chain.sh create mode 100644 regression/goto-cc-goto-analyzer/regenerate-entry-function/main.c create mode 100644 regression/goto-cc-goto-analyzer/regenerate-entry-function/test.desc create mode 100644 regression/goto-cc-symex/Makefile create mode 100755 regression/goto-cc-symex/chain.sh create mode 100644 regression/goto-cc-symex/regenerate-entry-function/main.c create mode 100644 regression/goto-cc-symex/regenerate-entry-function/test.desc create mode 100644 regression/symex/regenerate-entry-function/main.c create mode 100644 regression/symex/regenerate-entry-function/test.desc diff --git a/regression/Makefile b/regression/Makefile index 74ae36dd7be..0e791995ec2 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -6,6 +6,8 @@ DIRS = ansi-c \ cpp \ goto-analyzer \ goto-cc-cbmc \ + goto-cc-goto-analyzer \ + goto-cc-goto-symex \ goto-diff \ goto-gcc \ goto-instrument \ diff --git a/regression/goto-analyzer/regenerate-entry-function/main.c b/regression/goto-analyzer/regenerate-entry-function/main.c new file mode 100644 index 00000000000..6a035127022 --- /dev/null +++ b/regression/goto-analyzer/regenerate-entry-function/main.c @@ -0,0 +1,16 @@ +#include + +int fun(int x) +{ + int i; + if(i>=20) + assert(i>=10); +} + +int main(int argc, char** argv) +{ + int i; + + if(i>=5) + assert(i>=10); +} diff --git a/regression/goto-analyzer/regenerate-entry-function/test.desc b/regression/goto-analyzer/regenerate-entry-function/test.desc new file mode 100644 index 00000000000..289b7cbd276 --- /dev/null +++ b/regression/goto-analyzer/regenerate-entry-function/test.desc @@ -0,0 +1,8 @@ +CORE +main.c +--function fun --show-goto-functions +^\s*fun\(x\);$ +^EXIT=6$ +^SIGNAL=0$ +-- +^warning: ignoring diff --git a/regression/goto-cc-cbmc/regenerate-entry-function/test.desc b/regression/goto-cc-cbmc/regenerate-entry-function/test.desc index fe127f9316b..ced965563f8 100644 --- a/regression/goto-cc-cbmc/regenerate-entry-function/test.desc +++ b/regression/goto-cc-cbmc/regenerate-entry-function/test.desc @@ -1,7 +1,6 @@ CORE main.c "--function fun --cover branch" - ^EXIT=0$ ^SIGNAL=0$ ^x= diff --git a/regression/goto-cc-goto-analyzer/Makefile b/regression/goto-cc-goto-analyzer/Makefile new file mode 100644 index 00000000000..18f4d370eb8 --- /dev/null +++ b/regression/goto-cc-goto-analyzer/Makefile @@ -0,0 +1,32 @@ + +default: tests.log + +test: + @if ! ../test.pl -c ../chain.sh ; then \ + ../failed-tests-printer.pl ; \ + exit 1; \ + fi + +tests.log: + pwd + @if ! ../test.pl -c ../chain.sh ; then \ + ../failed-tests-printer.pl ; \ + exit 1; \ + fi + +show: + @for dir in *; do \ + if [ -d "$$dir" ]; then \ + vim -o "$$dir/*.c" "$$dir/*.out"; \ + fi; \ + done; + +clean: + @for dir in *; do \ + rm -f tests.log; \ + if [ -d "$$dir" ]; then \ + cd "$$dir"; \ + rm -f *.out *.gb; \ + cd ..; \ + fi \ + done diff --git a/regression/goto-cc-goto-analyzer/chain.sh b/regression/goto-cc-goto-analyzer/chain.sh new file mode 100755 index 00000000000..b34d0e7750e --- /dev/null +++ b/regression/goto-cc-goto-analyzer/chain.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +src=../../../src + +gc=$src/goto-cc/goto-cc +goto_analyzer=$src/goto-analyzer/goto-analyzer + +options=$1 +name=${2%.c} + +$gc $name.c -o $name.gb +$goto_analyzer $name.gb $options diff --git a/regression/goto-cc-goto-analyzer/regenerate-entry-function/main.c b/regression/goto-cc-goto-analyzer/regenerate-entry-function/main.c new file mode 100644 index 00000000000..6a035127022 --- /dev/null +++ b/regression/goto-cc-goto-analyzer/regenerate-entry-function/main.c @@ -0,0 +1,16 @@ +#include + +int fun(int x) +{ + int i; + if(i>=20) + assert(i>=10); +} + +int main(int argc, char** argv) +{ + int i; + + if(i>=5) + assert(i>=10); +} diff --git a/regression/goto-cc-goto-analyzer/regenerate-entry-function/test.desc b/regression/goto-cc-goto-analyzer/regenerate-entry-function/test.desc new file mode 100644 index 00000000000..0dd59956634 --- /dev/null +++ b/regression/goto-cc-goto-analyzer/regenerate-entry-function/test.desc @@ -0,0 +1,8 @@ +CORE +main.c +"--function fun --show-goto-functions" +^\s*fun\(x\);$ +^EXIT=6$ +^SIGNAL=0$ +-- +^warning: ignoring diff --git a/regression/goto-cc-symex/Makefile b/regression/goto-cc-symex/Makefile new file mode 100644 index 00000000000..18f4d370eb8 --- /dev/null +++ b/regression/goto-cc-symex/Makefile @@ -0,0 +1,32 @@ + +default: tests.log + +test: + @if ! ../test.pl -c ../chain.sh ; then \ + ../failed-tests-printer.pl ; \ + exit 1; \ + fi + +tests.log: + pwd + @if ! ../test.pl -c ../chain.sh ; then \ + ../failed-tests-printer.pl ; \ + exit 1; \ + fi + +show: + @for dir in *; do \ + if [ -d "$$dir" ]; then \ + vim -o "$$dir/*.c" "$$dir/*.out"; \ + fi; \ + done; + +clean: + @for dir in *; do \ + rm -f tests.log; \ + if [ -d "$$dir" ]; then \ + cd "$$dir"; \ + rm -f *.out *.gb; \ + cd ..; \ + fi \ + done diff --git a/regression/goto-cc-symex/chain.sh b/regression/goto-cc-symex/chain.sh new file mode 100755 index 00000000000..25217b24e2a --- /dev/null +++ b/regression/goto-cc-symex/chain.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +src=../../../src + +gc=$src/goto-cc/goto-cc +symex=$src/symex/symex + +options=$1 +name=${2%.c} + +$gc $name.c -o $name.gb +$symex $name.gb $options diff --git a/regression/goto-cc-symex/regenerate-entry-function/main.c b/regression/goto-cc-symex/regenerate-entry-function/main.c new file mode 100644 index 00000000000..6a035127022 --- /dev/null +++ b/regression/goto-cc-symex/regenerate-entry-function/main.c @@ -0,0 +1,16 @@ +#include + +int fun(int x) +{ + int i; + if(i>=20) + assert(i>=10); +} + +int main(int argc, char** argv) +{ + int i; + + if(i>=5) + assert(i>=10); +} diff --git a/regression/goto-cc-symex/regenerate-entry-function/test.desc b/regression/goto-cc-symex/regenerate-entry-function/test.desc new file mode 100644 index 00000000000..709ad39e859 --- /dev/null +++ b/regression/goto-cc-symex/regenerate-entry-function/test.desc @@ -0,0 +1,8 @@ +CORE +main.c +"--function fun --show-goto-functions" +^\s*return.=fun\(x\);$ +^EXIT=6$ +^SIGNAL=0$ +-- +^warning: ignoring diff --git a/regression/symex/regenerate-entry-function/main.c b/regression/symex/regenerate-entry-function/main.c new file mode 100644 index 00000000000..6a035127022 --- /dev/null +++ b/regression/symex/regenerate-entry-function/main.c @@ -0,0 +1,16 @@ +#include + +int fun(int x) +{ + int i; + if(i>=20) + assert(i>=10); +} + +int main(int argc, char** argv) +{ + int i; + + if(i>=5) + assert(i>=10); +} diff --git a/regression/symex/regenerate-entry-function/test.desc b/regression/symex/regenerate-entry-function/test.desc new file mode 100644 index 00000000000..722900f544e --- /dev/null +++ b/regression/symex/regenerate-entry-function/test.desc @@ -0,0 +1,8 @@ +CORE +main.c +--function fun --show-goto-functions +fun\(x\);$ +^EXIT=6$ +^SIGNAL=0$ +-- +^warning: ignoring diff --git a/src/cbmc/cbmc_parse_options.cpp b/src/cbmc/cbmc_parse_options.cpp index a9040724648..265759fc698 100644 --- a/src/cbmc/cbmc_parse_options.cpp +++ b/src/cbmc/cbmc_parse_options.cpp @@ -1009,7 +1009,7 @@ void cbmc_parse_optionst::help() " --round-to-plus-inf rounding towards plus infinity\n" " --round-to-minus-inf rounding towards minus infinity\n" " --round-to-zero rounding towards zero\n" - " --function name set main function name\n" + HELP_FUNCTIONS "\n" "Program representations:\n" " --show-parse-tree show parse tree\n" diff --git a/src/cbmc/cbmc_parse_options.h b/src/cbmc/cbmc_parse_options.h index e0d23a986c0..85461fef191 100644 --- a/src/cbmc/cbmc_parse_options.h +++ b/src/cbmc/cbmc_parse_options.h @@ -14,6 +14,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include +#include #include @@ -26,7 +27,8 @@ class goto_functionst; class optionst; #define CBMC_OPTIONS \ - "(program-only)(function):(preprocess)(slice-by-trace):" \ + "(program-only)(preprocess)(slice-by-trace):" \ + OPT_FUNCTIONS \ "(no-simplify)(unwind):(unwindset):(slice-formula)(full-slice)" \ "(debug-level):(no-propagation)(no-simplify-if)" \ "(document-subgoals)(outfile):(test-preprocessor)" \ diff --git a/src/goto-analyzer/goto_analyzer_parse_options.cpp b/src/goto-analyzer/goto_analyzer_parse_options.cpp index b7f0b60a1d0..033dfddd025 100644 --- a/src/goto-analyzer/goto_analyzer_parse_options.cpp +++ b/src/goto-analyzer/goto_analyzer_parse_options.cpp @@ -494,6 +494,7 @@ void goto_analyzer_parse_optionst::help() " --classpath dir/jar set the classpath\n" " --main-class class-name set the name of the main class\n" JAVA_BYTECODE_LANGUAGE_OPTIONS_HELP + HELP_FUNCTIONS "\n" "Program representations:\n" " --show-parse-tree show parse tree\n" diff --git a/src/goto-analyzer/goto_analyzer_parse_options.h b/src/goto-analyzer/goto_analyzer_parse_options.h index 3fbaab18b1b..62a5932cdb2 100644 --- a/src/goto-analyzer/goto_analyzer_parse_options.h +++ b/src/goto-analyzer/goto_analyzer_parse_options.h @@ -17,6 +17,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include +#include #include @@ -27,7 +28,7 @@ class goto_functionst; class optionst; #define GOTO_ANALYSER_OPTIONS \ - "(function):" \ + OPT_FUNCTIONS \ "D:I:(std89)(std99)(std11)" \ "(classpath):(cp):(main-class):" \ "(16)(32)(64)(LP64)(ILP64)(LLP64)(ILP32)(LP32)" \ diff --git a/src/goto-programs/rebuild_goto_start_function.cpp b/src/goto-programs/rebuild_goto_start_function.cpp index dc73846c8d3..94425fb362d 100644 --- a/src/goto-programs/rebuild_goto_start_function.cpp +++ b/src/goto-programs/rebuild_goto_start_function.cpp @@ -69,7 +69,7 @@ bool rebuild_goto_start_functiont::operator()( symbol_table); // Remove the function from the goto_functions so it is copied back in - // from the symbol table + // from the symbol table during goto_convert if(!return_code) { const auto &start_function= diff --git a/src/goto-programs/rebuild_goto_start_function.h b/src/goto-programs/rebuild_goto_start_function.h index f2485228f86..0e21d5d0d6c 100644 --- a/src/goto-programs/rebuild_goto_start_function.h +++ b/src/goto-programs/rebuild_goto_start_function.h @@ -14,6 +14,12 @@ class symbol_tablet; class goto_functionst; +#define OPT_FUNCTIONS \ + "(function):" + +#define HELP_FUNCTIONS \ + " --function name set main function name\n" + class rebuild_goto_start_functiont: public messaget { public: diff --git a/src/symex/symex_parse_options.cpp b/src/symex/symex_parse_options.cpp index 5d96f2d5949..e85a369340e 100644 --- a/src/symex/symex_parse_options.cpp +++ b/src/symex/symex_parse_options.cpp @@ -587,7 +587,7 @@ void symex_parse_optionst::help() " --round-to-plus-inf IEEE floating point rounding mode\n" " --round-to-minus-inf IEEE floating point rounding mode\n" " --round-to-zero IEEE floating point rounding mode\n" - " --function name set main function name\n" + HELP_FUNCTIONS "\n" "Java Bytecode frontend options:\n" JAVA_BYTECODE_LANGUAGE_OPTIONS_HELP diff --git a/src/symex/symex_parse_options.h b/src/symex/symex_parse_options.h index a3fb841f20b..c2aec7a175b 100644 --- a/src/symex/symex_parse_options.h +++ b/src/symex/symex_parse_options.h @@ -17,6 +17,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include +#include #include @@ -28,7 +29,7 @@ class goto_functionst; class optionst; #define SYMEX_OPTIONS \ - "(function):" \ + OPT_FUNCTIONS \ "D:I:" \ "(depth):(context-bound):(branch-bound):(unwind):(max-search-time):" \ OPT_GOTO_CHECK \ From dee89b011b3ee1ec528c477b5f1e914d34e3ea06 Mon Sep 17 00:00:00 2001 From: thk123 Date: Thu, 7 Sep 2017 17:10:19 +0100 Subject: [PATCH 70/80] Fixing the method to work with java_bytecode The java bytecode entry point relied on things working a little differently. Firstly, the function name is transformed to allow simpler function names to be passed in. As such the rebuild_entry_point cannot be responsible for looking up the symbol. This in turn involved a new way of identifying the mode to use (using the existing entry points mode) Secondly, as the lanuages are destroyed after the parsing phase, we must re-provide the message handler as this is used by the entry point generation. Finally, the java_bytecode_entry_point adds a new symbol to the symbol table, so we remove all symbols that are in the scope of the original entry point. --- src/ansi-c/ansi_c_language.cpp | 4 +- src/ansi-c/ansi_c_language.h | 2 +- src/cpp/cpp_language.cpp | 4 +- src/cpp/cpp_language.h | 2 +- .../rebuild_goto_start_function.cpp | 65 +++++++++++++------ .../rebuild_goto_start_function.h | 4 ++ src/java_bytecode/java_bytecode_language.cpp | 8 ++- src/java_bytecode/java_bytecode_language.h | 2 +- src/jsil/jsil_language.cpp | 2 +- src/jsil/jsil_language.h | 2 +- src/util/language.h | 2 +- 11 files changed, 65 insertions(+), 32 deletions(-) diff --git a/src/ansi-c/ansi_c_language.cpp b/src/ansi-c/ansi_c_language.cpp index ce28fa1e70c..70e5226c135 100644 --- a/src/ansi-c/ansi_c_language.cpp +++ b/src/ansi-c/ansi_c_language.cpp @@ -43,11 +43,11 @@ void ansi_c_languaget::modules_provided(std::set &modules) /// function symbol will be added to this table /// \return Returns false if the _start method was generated correctly bool ansi_c_languaget::generate_start_function( - const symbolt &entry_function_symbol, + const irep_idt &entry_function_symbol_id, symbol_tablet &symbol_table) { return generate_ansi_c_start_function( - entry_function_symbol, + symbol_table.symbols.at(entry_function_symbol_id), symbol_table, *message_handler); } diff --git a/src/ansi-c/ansi_c_language.h b/src/ansi-c/ansi_c_language.h index 6b2f18f2aef..b86499954c2 100644 --- a/src/ansi-c/ansi_c_language.h +++ b/src/ansi-c/ansi_c_language.h @@ -74,7 +74,7 @@ class ansi_c_languaget:public languaget void modules_provided(std::set &modules) override; virtual bool generate_start_function( - const class symbolt &entry_function_symbol, + const irep_idt &entry_function_symbol_id, class symbol_tablet &symbol_table) override; protected: diff --git a/src/cpp/cpp_language.cpp b/src/cpp/cpp_language.cpp index c14b46b7d7a..846ebef4164 100644 --- a/src/cpp/cpp_language.cpp +++ b/src/cpp/cpp_language.cpp @@ -60,11 +60,11 @@ void cpp_languaget::modules_provided(std::set &modules) /// function symbol will be added to this table /// \return Returns false if the _start method was generated correctly bool cpp_languaget::generate_start_function( - const symbolt &entry_function_symbol, + const irep_idt &entry_function_symbol_id, symbol_tablet &symbol_table) { return generate_ansi_c_start_function( - entry_function_symbol, + symbol_table.lookup(entry_function_symbol_id), symbol_table, *message_handler); } diff --git a/src/cpp/cpp_language.h b/src/cpp/cpp_language.h index 0404d12b646..36093b8ba8a 100644 --- a/src/cpp/cpp_language.h +++ b/src/cpp/cpp_language.h @@ -86,7 +86,7 @@ class cpp_languaget:public languaget void modules_provided(std::set &modules) override; virtual bool generate_start_function( - const class symbolt &entry_function_symbol, + const irep_idt &entry_function_symbol_id, class symbol_tablet &symbol_table) override; protected: diff --git a/src/goto-programs/rebuild_goto_start_function.cpp b/src/goto-programs/rebuild_goto_start_function.cpp index 94425fb362d..0949c1da73f 100644 --- a/src/goto-programs/rebuild_goto_start_function.cpp +++ b/src/goto-programs/rebuild_goto_start_function.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -43,30 +44,18 @@ rebuild_goto_start_functiont::rebuild_goto_start_functiont( bool rebuild_goto_start_functiont::operator()( const irep_idt &entry_function) { - const auto &desired_entry_function= - symbol_table.symbols.find(entry_function); + const irep_idt &mode=get_entry_point_mode(); - // Check the specified entry function is a function in the symbol table - if(desired_entry_function==symbol_table.symbols.end()) - { - error() << "main symbol `" << entry_function - << "' not found" << eom; - return true; - } + // Get the relevant languaget to generate the new entry point with + std::unique_ptr language=get_language_from_mode(mode); + INVARIANT(language, "No language found for mode: "+id2string(mode)); + language->set_message_handler(get_message_handler()); - // Remove the existing _start function so we can create a new one - symbol_table.remove(goto_functionst::entry_point()); - - auto language= - std::unique_ptr( - get_language_from_mode( - desired_entry_function->second.mode)); - assert(language); + // To create a new entry point we must first remove the old one + remove_existing_entry_point(); bool return_code= - language->generate_start_function( - desired_entry_function->second, - symbol_table); + language->generate_start_function(entry_function, symbol_table); // Remove the function from the goto_functions so it is copied back in // from the symbol table during goto_convert @@ -82,3 +71,39 @@ bool rebuild_goto_start_functiont::operator()( return return_code; } + +/// Find out the mode of the current entry point to determine the mode of the +/// replacement entry point +/// \return A mode string saying which language to use +irep_idt rebuild_goto_start_functiont::get_entry_point_mode() const +{ + const symbolt ¤t_entry_point= + symbol_table.lookup(goto_functionst::entry_point()); + return current_entry_point.mode; +} + +/// Eliminate the existing entry point function symbol and any symbols created +/// in that scope from the symbol table. +void rebuild_goto_start_functiont::remove_existing_entry_point() +{ + // Remove the function itself + symbol_table.remove(goto_functionst::entry_point()); + + // And any symbols created in the scope of the entry point + std::vector entry_point_symbols; + for(const auto &symbol_entry : symbol_table.symbols) + { + const bool is_entry_point_symbol= + has_prefix( + id2string(symbol_entry.first), + id2string(goto_functionst::entry_point())); + + if(is_entry_point_symbol) + entry_point_symbols.push_back(symbol_entry.first); + } + + for(const irep_idt &entry_point_symbol : entry_point_symbols) + { + symbol_table.remove(entry_point_symbol); + } +} diff --git a/src/goto-programs/rebuild_goto_start_function.h b/src/goto-programs/rebuild_goto_start_function.h index 0e21d5d0d6c..870e05a61f6 100644 --- a/src/goto-programs/rebuild_goto_start_function.h +++ b/src/goto-programs/rebuild_goto_start_function.h @@ -31,6 +31,10 @@ class rebuild_goto_start_functiont: public messaget bool operator()(const irep_idt &entry_function); private: + irep_idt get_entry_point_mode() const; + + void remove_existing_entry_point(); + symbol_tablet &symbol_table; goto_functionst &goto_functions; }; diff --git a/src/java_bytecode/java_bytecode_language.cpp b/src/java_bytecode/java_bytecode_language.cpp index 3e0195c735c..a642c699662 100644 --- a/src/java_bytecode/java_bytecode_language.cpp +++ b/src/java_bytecode/java_bytecode_language.cpp @@ -113,11 +113,15 @@ void java_bytecode_languaget::modules_provided(std::set &modules) /// function symbol will be added to this table /// \return Returns false if the _start method was generated correctly bool java_bytecode_languaget::generate_start_function( - const symbolt &entry_function_symbol, + const irep_idt &entry_function_symbol_id, symbol_tablet &symbol_table) { + const auto res= + get_main_symbol( + symbol_table, entry_function_symbol_id, get_message_handler()); + return generate_java_start_function( - entry_function_symbol, + res.main_function, symbol_table, get_message_handler(), assume_inputs_non_null, diff --git a/src/java_bytecode/java_bytecode_language.h b/src/java_bytecode/java_bytecode_language.h index c6596aac427..21cacce6465 100644 --- a/src/java_bytecode/java_bytecode_language.h +++ b/src/java_bytecode/java_bytecode_language.h @@ -138,7 +138,7 @@ class java_bytecode_languaget:public languaget const irep_idt &id, symbol_tablet &) override; virtual bool generate_start_function( - const class symbolt &entry_function_symbol, + const irep_idt &entry_function_symbol_id, class symbol_tablet &symbol_table) override; protected: diff --git a/src/jsil/jsil_language.cpp b/src/jsil/jsil_language.cpp index 4ba8203a1e2..42537a7b2e0 100644 --- a/src/jsil/jsil_language.cpp +++ b/src/jsil/jsil_language.cpp @@ -48,7 +48,7 @@ bool jsil_languaget::interfaces(symbol_tablet &symbol_table) /// function symbol will be added to this table /// \return Returns false if the _start method was generated correctly bool jsil_languaget::generate_start_function( - const symbolt &entry_function_symbol, + const irep_idt &entry_function_symbol_id, symbol_tablet &symbol_table) { // TODO(tkiley): This should be implemented if this language diff --git a/src/jsil/jsil_language.h b/src/jsil/jsil_language.h index a49b727d662..6ff0c852bdb 100644 --- a/src/jsil/jsil_language.h +++ b/src/jsil/jsil_language.h @@ -70,7 +70,7 @@ class jsil_languaget:public languaget virtual bool interfaces(symbol_tablet &symbol_table) override; virtual bool generate_start_function( - const class symbolt &entry_function_symbol, + const irep_idt &entry_function_symbol_id, class symbol_tablet &symbol_table) override; protected: diff --git a/src/util/language.h b/src/util/language.h index 88db199fee7..d3b25165c3b 100644 --- a/src/util/language.h +++ b/src/util/language.h @@ -120,7 +120,7 @@ class languaget:public messaget void set_should_generate_opaque_method_stubs(bool should_generate_stubs); virtual bool generate_start_function( - const class symbolt &entry_function_symbol, + const irep_idt &entry_function_symbol_id, class symbol_tablet &symbol_table)=0; // constructor / destructor From 15b89fcf1525ceefa0144356e7f031400ce77c4f Mon Sep 17 00:00:00 2001 From: thk123 Date: Fri, 8 Sep 2017 12:42:18 +0100 Subject: [PATCH 71/80] Weaked the tests for pointer-function-parameters As we now regenerate the entry point, variable names have changed. This means these tests don't fail for this. --- regression/cbmc/pointer-function-parameters-2/test.desc | 8 ++++---- regression/cbmc/pointer-function-parameters/test.desc | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/regression/cbmc/pointer-function-parameters-2/test.desc b/regression/cbmc/pointer-function-parameters-2/test.desc index c67211d7387..be81dbdc393 100644 --- a/regression/cbmc/pointer-function-parameters-2/test.desc +++ b/regression/cbmc/pointer-function-parameters-2/test.desc @@ -4,9 +4,9 @@ main.c ^\*\* 7 of 7 covered \(100.0%\)$ ^\*\* Used 4 iterations$ ^Test suite:$ -^a=\(\(signed int \*\*\)NULL\), tmp\$1=[^,]*, tmp\$2=[^,]*$ -^a=&tmp\$1!0, tmp\$1=\(\(signed int \*\)NULL\), tmp\$2=[^,]*$ -^a=&tmp\$1!0, tmp\$1=&tmp\$2!0, tmp\$2=([012356789][0-9]*|4[0-9]+)$ -^a=&tmp\$1!0, tmp\$1=&tmp\$2!0, tmp\$2=4$ +^a=\(\(signed int \*\*\)NULL\), tmp\$\d+=[^,]*, tmp\$\d+=[^,]*$ +^a=&tmp\$\d+!0, tmp\$\d+=\(\(signed int \*\)NULL\), tmp\$\d+=[^,]*$ +^a=&tmp\$\d+!0, tmp\$\d+=&tmp\$\d+!0, tmp\$\d+=([012356789][0-9]*|4[0-9]+)$ +^a=&tmp\$\d+!0, tmp\$\d+=&tmp\$\d+!0, tmp\$\d+=4$ -- ^warning: ignoring diff --git a/regression/cbmc/pointer-function-parameters/test.desc b/regression/cbmc/pointer-function-parameters/test.desc index b9aa6240dea..89fbd70531a 100644 --- a/regression/cbmc/pointer-function-parameters/test.desc +++ b/regression/cbmc/pointer-function-parameters/test.desc @@ -4,8 +4,8 @@ main.c ^\*\* 5 of 5 covered \(100\.0%\)$ ^\*\* Used 3 iterations$ ^Test suite:$ -^a=\(\(signed int \*\)NULL\), tmp\$1=[^,]*$ -^a=&tmp\$1!0, tmp\$1=4$ -^a=&tmp\$1!0, tmp\$1=([012356789][0-9]*|4[0-9]+)$ +^a=\(\(signed int \*\)NULL\), tmp\$\d+=[^,]*$ +^a=&tmp\$\d+!0, tmp\$\d+=4$ +^a=&tmp\$\d+!0, tmp\$\d+=([012356789][0-9]*|4[0-9]+)$ -- ^warning: ignoring From e37d3d5fc067bf1fd2d3c569667b1d740b65d1a3 Mon Sep 17 00:00:00 2001 From: thk123 Date: Fri, 8 Sep 2017 12:46:28 +0100 Subject: [PATCH 72/80] Disable failing test in the symex directory --- regression/symex/show-trace1/test.desc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/regression/symex/show-trace1/test.desc b/regression/symex/show-trace1/test.desc index 930f344a07a..23a9f62e3ae 100644 --- a/regression/symex/show-trace1/test.desc +++ b/regression/symex/show-trace1/test.desc @@ -1,4 +1,4 @@ -CORE +KNOWNBUG main.c --trace ^EXIT=10$ @@ -9,3 +9,5 @@ main.c ^ k=6 .*$ -- ^warning: ignoring +-- +diffblue/cbmc#1361 \ No newline at end of file From c6f1430a5e2f8c9efbb6940bb17d791fff5df996 Mon Sep 17 00:00:00 2001 From: thk123 Date: Fri, 8 Sep 2017 13:59:31 +0100 Subject: [PATCH 73/80] Ensure symex and goto-analyzer regenerate functions --- src/goto-programs/initialize_goto_model.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/goto-programs/initialize_goto_model.cpp b/src/goto-programs/initialize_goto_model.cpp index 1706643206f..753dff36edb 100644 --- a/src/goto-programs/initialize_goto_model.cpp +++ b/src/goto-programs/initialize_goto_model.cpp @@ -21,6 +21,8 @@ Author: Daniel Kroening, kroening@kroening.com #include #include +#include + #include "goto_convert_functions.h" #include "read_goto_binary.h" @@ -131,6 +133,20 @@ bool initialize_goto_model( return true; } + if(cmdline.isset("function")) + { + const std::string &function_id=cmdline.get_value("function"); + rebuild_goto_start_functiont start_function_rebuilder( + msg.get_message_handler(), + goto_model.symbol_table, + goto_model.goto_functions); + + if(start_function_rebuilder(function_id)) + { + return 6; + } + } + msg.status() << "Generating GOTO Program" << messaget::eom; goto_convert( From 92a52a562dce4247dc78833ee80bfd44d6138a6e Mon Sep 17 00:00:00 2001 From: thk123 Date: Fri, 8 Sep 2017 16:55:24 +0100 Subject: [PATCH 74/80] Corrected doxygen errors --- src/ansi-c/ansi_c_entry_point.cpp | 3 ++- src/ansi-c/ansi_c_language.cpp | 2 +- src/cpp/cpp_language.cpp | 2 +- src/java_bytecode/java_bytecode_language.cpp | 2 +- src/java_bytecode/java_entry_point.cpp | 19 +++++++++++++------ src/jsil/jsil_language.cpp | 2 +- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/ansi-c/ansi_c_entry_point.cpp b/src/ansi-c/ansi_c_entry_point.cpp index 25612bc4d93..fc25290079a 100644 --- a/src/ansi-c/ansi_c_entry_point.cpp +++ b/src/ansi-c/ansi_c_entry_point.cpp @@ -195,10 +195,11 @@ bool ansi_c_entry_point( /// Generate a _start function for a specific function -/// \param entry_function_symbol: The symbol for the function that should be +/// \param symbol: The symbol for the function that should be /// used as the entry point /// \param symbol_table: The symbol table for the program. The new _start /// function symbol will be added to this table +/// \param message_handler: The message handler /// \return Returns false if the _start method was generated correctly bool generate_ansi_c_start_function( const symbolt &symbol, diff --git a/src/ansi-c/ansi_c_language.cpp b/src/ansi-c/ansi_c_language.cpp index 70e5226c135..19696264996 100644 --- a/src/ansi-c/ansi_c_language.cpp +++ b/src/ansi-c/ansi_c_language.cpp @@ -37,7 +37,7 @@ void ansi_c_languaget::modules_provided(std::set &modules) } /// Generate a _start function for a specific function -/// \param entry_function_symbol: The symbol for the function that should be +/// \param entry_function_symbol_id: The symbol for the function that should be /// used as the entry point /// \param symbol_table: The symbol table for the program. The new _start /// function symbol will be added to this table diff --git a/src/cpp/cpp_language.cpp b/src/cpp/cpp_language.cpp index 846ebef4164..f329e9986c0 100644 --- a/src/cpp/cpp_language.cpp +++ b/src/cpp/cpp_language.cpp @@ -54,7 +54,7 @@ void cpp_languaget::modules_provided(std::set &modules) } /// Generate a _start function for a specific function -/// \param entry_function_symbol: The symbol for the function that should be +/// \param entry_function_symbol_id: The symbol for the function that should be /// used as the entry point /// \param symbol_table: The symbol table for the program. The new _start /// function symbol will be added to this table diff --git a/src/java_bytecode/java_bytecode_language.cpp b/src/java_bytecode/java_bytecode_language.cpp index a642c699662..8ea79aafa6d 100644 --- a/src/java_bytecode/java_bytecode_language.cpp +++ b/src/java_bytecode/java_bytecode_language.cpp @@ -107,7 +107,7 @@ void java_bytecode_languaget::modules_provided(std::set &modules) } /// Generate a _start function for a specific function. -/// \param entry_function_symbol: The symbol for the function that should be +/// \param entry_function_symbol_id: The symbol for the function that should be /// used as the entry point /// \param symbol_table: The symbol table for the program. The new _start /// function symbol will be added to this table diff --git a/src/java_bytecode/java_entry_point.cpp b/src/java_bytecode/java_entry_point.cpp index 9b3dd0a2f1d..12e806b8e2f 100644 --- a/src/java_bytecode/java_entry_point.cpp +++ b/src/java_bytecode/java_entry_point.cpp @@ -520,12 +520,19 @@ bool java_entry_point( pointer_type_selector); } -/// Generate a _start function for a specific function -/// \param entry_function_symbol: The symbol for the function that should be -/// used as the entry point -/// \param symbol_table: The symbol table for the program. The new _start -/// function symbol will be added to this table -/// \return Returns false if the _start method was generated correctly +/// Generate a _start function for a specific function. See +/// java_entry_point for more details. +/// \param symbol: The symbol representing the function to call +/// \param symbol_table: Global symbol table +/// \param message_handler: Where to write output to +/// \param assume_init_pointers_not_null: When creating pointers, assume they +/// always take a non-null value. +/// \param max_nondet_array_length: The length of the arrays to create when +/// filling them +/// \param max_nondet_tree_depth: defines the maximum depth of the object tree +/// (see java_entry_points documentation for details) +/// \param pointer_type_selector: Logic for substituting types of pointers +/// \returns true if error occurred on entry point search, false otherwise bool generate_java_start_function( const symbolt &symbol, symbol_tablet &symbol_table, diff --git a/src/jsil/jsil_language.cpp b/src/jsil/jsil_language.cpp index 42537a7b2e0..94f16cc5cb8 100644 --- a/src/jsil/jsil_language.cpp +++ b/src/jsil/jsil_language.cpp @@ -42,7 +42,7 @@ bool jsil_languaget::interfaces(symbol_tablet &symbol_table) } /// Generate a _start function for a specific function -/// \param entry_function_symbol: The symbol for the function that should be +/// \param entry_function_symbol_id: The symbol for the function that should be /// used as the entry point /// \param symbol_table: The symbol table for the program. The new _start /// function symbol will be added to this table From 22f06fd5e83445d404a3ea8b2c59c666216e8f56 Mon Sep 17 00:00:00 2001 From: thk123 Date: Tue, 12 Sep 2017 11:22:50 +0100 Subject: [PATCH 75/80] Correcting windows build --- appveyor.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 4f28cf54254..dff05f85412 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -74,6 +74,21 @@ test_script: sed -i "13i mv $NAME.exe $NAME.gb" goto-instrument-typedef/chain.sh || true cat goto-instrument-typedef/chain.sh || true + sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" goto-cc-cbmc/chain.sh || true + sed -i "11s/.*/$GC $NAME.c/" goto-cc-cbmc/chain.sh || true + sed -i "12i mv $NAME.exe $NAME.gb" goto-cc-cbmc/chain.sh || true + cat goto-cc-cbmc/chain.sh || true + + sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" goto-cc-goto-analyzer/chain.sh || true + sed -i "11s/.*/$gc $name.c/" goto-cc-goto-analyzer/chain.sh || true + sed -i "12i mv $name.exe $name.gb" goto-cc-goto-analyzer/chain.sh || true + cat goto-cc-goto-analyzer/chain.sh || true + + sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" goto-cc-symex/chain.sh || true + sed -i "11s/.*/$gc $name.c/" goto-cc-symex/chain.sh || true + sed -i "12i mv $name.exe $name.gb" goto-cc-symex/chain.sh || true + cat goto-cc-symex/chain.sh || true + rem HACK disable failing tests rmdir /s /q ansi-c\arch_flags_mcpu_bad rmdir /s /q ansi-c\arch_flags_mcpu_good From a46ad62985ff5f07b6d0d9d974715972e0443683 Mon Sep 17 00:00:00 2001 From: reuk Date: Tue, 12 Sep 2017 18:45:02 +0100 Subject: [PATCH 76/80] Regenerate malformed binary blobs --- .../ansi-c/arch_flags_mcpu_bad/object.intel | Bin 4392 -> 4483 bytes .../ansi-c/arch_flags_mcpu_good/object.arm | Bin 4174 -> 4208 bytes .../ansi-c/arch_flags_mcpu_good/test.desc | 4 ++++ .../ansi-c/arch_flags_mthumb_bad/object.intel | Bin 4392 -> 4485 bytes .../ansi-c/arch_flags_mthumb_good/object.arm | Bin 4174 -> 4268 bytes .../ansi-c/arch_flags_mthumb_good/test.desc | 4 ++++ 6 files changed, 8 insertions(+) diff --git a/regression/ansi-c/arch_flags_mcpu_bad/object.intel b/regression/ansi-c/arch_flags_mcpu_bad/object.intel index cc6ea40a25e16bfd5f54e674940b2a56dd1a79ae..e32d04e4c5675da66bdfac403dd8587ddfac4357 100644 GIT binary patch literal 4483 zcmbtYU345}8UDUq0^LbqwGo9>F%YX&3CSjDy4AYYP6CK^fUZSUaG2fsHko#JW;;9E zB-L7eL@E?4O`HE8^3$J4s6dENtv#Njhf^=?O>V4hsI`~g`BN`M@%iSPo!!WpdcmI4 zoYR@v=Y5~&d*A1MXZPK+A|uyN-q;-Y ziMe+WB-&80iguc*Su3qMhGmi)2vJsNj4UIo4ktFHibmEk%tp;lcN-2%J4Kr{7986! zy9xRXvuy6Sq{|u<@*A_Yvvuk*01d$C_+bOfj=bXS-R}%IBEr zG&!u`Gqc?%~Dy261jI_b!BJo_R$xWj{@v|0~ zx_@viej1~QKgy$jNJRheU~qJt0#ATPUoE27J|(TMjJ|p}D0;eEv;CmM2s+Gze#E0J zM{gE@)i@Q8$;}f%Sh`hARVXpo90`=qniL_Ost{DnKO<7jf2OI+65C{B(0K8s~-X;J)`OgR% zudL2(13`c&Y8}P4hmpm^0PqGlUcE2$?E>$Pe??j=@opas!h2uI3<7izpbac3>8-CpPj{)OCY*s_4JZ{8?)Ah1nktacfz3Db$W@`JLFxG1 zGF7&3-HHoquSn%y%CQ_8RLwGNCx~5}5Z?eGZ#-lgS)>FnBwrAiUwlVuE0x)$_vh$U)g|P13At@z$uDh|qY3fdFaJSm z6}E~7E*&k|4CxGr7=&F_4fmsB+3sB_(SLJ?@*aOEB|ECD~7>+(Dl-sr(immXq2ag6Rr)4qc`GiBz zqtNUqH;kkR`i=cH*9;0bCJpV_m~P^u9hIha71UfhUsO|? z-Xuo)UDykhTG5^4yJr(=E0@Q9q7(ASLL#NvNNNE|EhI=iQ3cJ%UJ5)~Z{oWuYeI_D z3sMY6UG_O`GDr&7yZ>igP9pdu6iKIr*CZPi-ED0BU22#a!!%&zN|^B-Z5`YrGhSNf zN|OMMBS*WC49u?kmr`q~zTK1K>q9;kLaPX8L|jkl|Oa?8;ts1W)|IxfY0 z&pb;TvSPark>pcUWbi}!n-7)(QsEhd_u}8vlqL7_Iwj-@Iu~@NyjLOf9L{nMXSw@F z^lh4ahSn$d(rrO3rDe+OZ2=a(F=4^YAJP$ ze3rV>l-Q8x>3k3ii`&^eILw2?PpBAbqEI?X{2+%%KR!uaUzn(U`GECPbN4x;Akx?)CG5VI&;@6;< z+e4I$(o+=~3tv(VZb_$*?J0@G$+!oGt$V`Dc9I^HVx^79eZiWbQ$b0WY^n5$H-)69 z+@xPZs#E1ur@d5X=&z(!UuQqnX?mt2Rg?8PYGuA>knb6&J4@>@&W`efJLUl%r!!JZ zDP4l$w$Z&8KSpOO5V^%0nELK3!Yt5cB~srOUw<{Sn7A5Q3SW(o1HTTD6Xk^GJUM6I2e4MnD*NY%?_?0GNuSLj%Ed&w?cspsiBUVIlDvty$!e8ZIN|Q8ATP*ldOG{O1i#m=oj#}+F&Nv1YNWzzV35)>|%pY~?@7;HA?;^9| z4{s)!$?o3o`906`dw%b;*?9ZP+oJPHRl&-e>nvt;ZXn7I+HD$c7oi6uO^t-e4@c`$ zwv~5v%O#QVND`O!RMe+5w>QT~^r=YkyPAmy2&srzW`-zH@Ae#AAQDlk(`JT|*bCCl zodq-FE;g;jx?z~E3E*1^QED=##Yp8|DY+bf?VrWPNDb)NdRb|j{>#pU?*BKQselA6#+RN4z(jes@e`io^% zwOEg%B)5~-_s$2|3&0rNV6`>rXeQD~%$ zdEL1(ta8%l0Ci3xt?y3hj-&SywVs!3{zRnJtJr%+OBG9X=?<^Fk>@NDuhXKOP@4sn zywK3Xd!H_9p{&4ie4*g>zD=>FVoOnpg`{F(f2`EQEX#5wPbd0gW6}N?XRDu!$@p*DmU8aj^DL8C#-gPiOVze55E)_{ZXVqlM zWTM2W{99VS%XVC@8cjIBbYe0w7M)CxhDAxit#NbZEZiCzz>afk;@p&)=08fwW#uYs zIvo~T)JC&&%+W1F^Lj9yIF0b9dH9{z4`BnS*wM5@oL>7 zLf<+WNzQ20EvLdlV^Y>xS>~C+DFi*mgMP>lD#up{zz_dPNmsL**}o(JY?<|jhbkFAj79l*t5p>Bya1+E9bKnps^#}R$C(ss`z)T$Rf=80fp#@JP1IDKX&J1CsK$0GY%tgm;N&c&rUmStinU<7 z4&_*&v~~UCN|QSKASaXPIAi{%#Q?oxX-zwZH3=T$>L_<9Z2r6F#5&uD;`J3kjF9PF?WLq zjD@CKN1_!iv;$@NNX=dCdc~(uh0HPY7CV6xmT(B z`8xFr+aczS(2Qbyk&53M-1uJ$ee2 zm_j8MeTCD)ZkLzio2W=cII&mSO>|!vO!+at4`};{i+X*DnG=b z;X@D8$79Vi>_Yuo@hQl0jrZh3bfm2ISHfBoz9Z=q%N zPXtdykN8P`gZ@V1LsxR~N9fV8Ts`M9>_TUT1?F`WIUnT}{HD*~4mrNX2d^%nZlOoQ zQ2z(;2mp@&aDaMixg3AgFPh(vH)uV7=P+2BY^A%Tk_Yl-N5iWVmcZ*s#bf@r2I)|& zxi}}omlxDuk%m#oVP41~KMe?B*iYke`b#M|HTdc`Ob>@8lgD_JRp&60IgDgRC{v%H z@QhKP)|2$HSaVQ!;TpL26pubaxp9or!OPj&oey9&g>VPKcaZaax>WXUKHqQAUr00d z#clLp7+!LK9r2&jpd? z_)Z`7dHS*x7&!0mPC6cj%8%zj`{O_z=cq6Es1VIAAM{1~qEwWf=OMf3{xDFyrU$$F zeqingCgmGn^ar$7{h<&3Bl_>q(dK6Z#v6i?iADKe$D-lnrNXOn^5neEIh zNobW?D?(c=l~gL1a4Bf3RUf$%2=`0$!SEx$N&_PD&!1lK2R`_oIkT6*GwJ@==h@kr z_xs-Wyx(P3JU;)i=zXNhHM=clq?ZwSJMA?MuZPe}k+xPsQv0Vg>Z;eDXC$&QB5qSn z%OiwDyL8)fJq>eiCsqHB zHTT##*6grCnpw>TTgI|>KF2Jt*<-HP)QyW-Gu^DGb2@J7c9`n|zFD(evq^8(9KA=) zWVLQr&FT4q+HKng_@@3u8`GN0NNkOiY{7-8gVR(swQ$jsPj@X+9lKx|Jdd1hFfy7D z)X3npv1kh4WR4Uo0KP0Ug|yQKBgKml0S^mht7mXIbUj&`)nD2i1Et2a#mM zHJ3B;nd`KOg%n`B29d#MN2NAlp(<|122$5>z9Nwv%W*S}Ce9=9d5N^%!}2y#VGdCm z=doPg>&H{~3atAsO6{dXSrx72bwtVMp!Gd+=jSg{dGUe;$mrfnl>xLYjIY}1CGaic zTtb{nAULxskhT_DM#vY$fqn64;v*`Giyyxq`F!b*2~j(|bl_#vLx6(Anq1F;Lq!!e zt&@^%mB)Vnkwn=-m5-@hPStePqE(UWk;GW^NP@J?5;ll83mIxrk8tG;+Qcoyqbg>gp{S3u?pC-YEnwyF5Tg3KcqBgvvC{o;Q3L>L(@i)O-m8jj-x zD4YO=nO_lr^Hx_+YL;XR`d2Fcs0ccLgOr?IsoRs53H@_!Ng{8{Sjy20dYX{;fWO#}T^mT!VcDg_yeq+6qe4r9>!SOJ}jM>KwHDfy% z4z|X1KMvUAfR%NnLpGkgPW}F}Q1JieVW|x=`?*5wg`{rba0O-2Rb7?!p+0$+9tP`S zuwGQJ^ARHdk2(xxYl-Pg^o2Xcu*mpzL3!ETpnW;W9+GOi8Q+7XyP1lKbIg4v+A0!#YPj?Vq?*3G4lGc$jomEjh=b? z_Q^~H5BVl~R_OTc8?n-1^MiSIZ<(i7s>j z3SHm|{e<6-YH(8Vl^hwP_NVkUsRYa&x{?lsW$R+osNgDyex8hzEiADiu2j-zi?BGnChZ0BG@R0!4mC*HzD*khmOum6A1dpt`)AAp!?)REUy%PKf>?l;eQc?ey=*xu)n5% znRJ4|CjL9XyFB({KK}2@6fE6;vwn|a)|cx{j{b($6L~&f-#z9pk-w$SiFJef3<&2E z@6zh`dE^ec^LO+V^&Gs|<8uR_I3d5M5&s_gJ{6ZRrT>7l2e7=tG_aSN858eH?+K_F IZli?!ALiP`UjP6A literal 4174 zcmai1eQ+FQ9e&@tbT0wwVWMIZ)MDy^Xh<#zX+W&Cn--P2U{{LY%jWjIX6fDTb#Jdp zs#w2TsugJoNk{`|5k;^Clo|cQah!3O4myrAPDtA{Nk8nTr8;S>opA;RpLgHAy*-(2 z^G9cTyZ8K_=lOl!mOEFjjxQy3C97zzx0unli6~Fg0n>2%2|W_)>>xzm9&gFmR?*ch zm&9gbX?*nCnwE^_4iy-QKM^Z`S2OVfAvH0}%n>E-Jzj(lh(wh7teImZu}`|AuVm)j zR?}+L4a0Oz052y*X~>xtBehdf`ZoM;deMOGY%s0$nqfLD&gfh(xfXULl!kYX z)b@0HV(W$?HVe_x?xfL<-@t7q%Xu8pw5*LVj9o(AC_2hv|l98u0NF z47>#U8f!iKw#Q@K71AW2o9C~Nb|LLO;x=55@b7yqCGyYH?_~N-7s)L-thMMm$hN42 z_rEN4hWTB8FjcW3{4F>tlxm`07g7gPlktNo(*A*r?l}4oQI~LoZkUbrcs2XM-4&NI z{kp?_Hj3tEMq1vW<>KKbASag!vp%#n(OJ$BG%O`GOSdH|Z1OD6OLHN$EioD2mLMIC zDdEYD|Bd!USb`+W$(y(*N<)1m88;n?5^LC{z8njr9)Z*&klOg+Ai*~aw2%B%O5Ykb z@aB_Im|1g>8CuqMv~14SdCQyx>`B0WG^4gI>a*<}x9FBPsAo!>Fs1$9QYYwpq#>e> z)U;g;m5->LqQ(Z1US2*IQ9c)W`K0}Vk&_*QYUis`8WW}>zvEaG)d8L`%??Ymg;e6^jbg5<*HH!^sqJ|by z<4Ep!0{m|a;BOcFKlT?X-4*74`-v;@2X=X0!kQCMae`;@4gvk~9ktQDgeRySUN_4{ z_)q*zN-qnCUw%3&yr@*oE-**849zS0h16+;Kh49h5aB=h_ta&>g8&b|QiPW$r8F9= zlD(B@qQW!FFm=mf#UezXLDVyd+RF+y<`i>?x@rZ>7u+FWuNH~Bb9bUEa25l{d-5r; z>{WU{Jx7&$*Q`PJuAT@d&ud04$Mg*dGJ&K`@T7glmnJ9g613OM#nR=T#@wwZcb$r& zt>>^5^URyMr@;CYSTFvp0K`O91lPM?OLSKODpMg^4raE&S6SXR7>G@Q*i?e_+|!id zA1H59hhYXkm}8Q9+t6P@_^ zH&YoqU%;L<2w6Ly>cfCrNX>)xe2Oe-yjRd(cQ$%5i30N~>^|Yu7k(#IjgtGOqpb4U zvpk2V5p)_}eNpVEo zQMkNV`Apf&92*%q56ttxG@6imwn9#3h0^siQb$=SK^ZLKPinHWA&2;NW1=Xru@+LZ z(qw#ALT38~w`MtM3U0p7ytd7$C|2maV3`qV_290YvyZQwIpycrMC4n-8*cufk*6#fteNGze>DIb23lRZSLlnt_XQSxxGYJIGg5X&Y+)A0c zjiS^Zq9Ui;>0^nmpnS!A#k22of?Fv@EP05IyuI7(z6Wry0eA%cHp2Vu2fm~m<>U^I zjcewIbib4iuz3;gphu&KdMDifoi<0o`Y2dG4Awv5tRL}N@1&0=y2=&9>k6LW*)GoE zVUP7AbU4J?;1_Jbc^I6BIp;@x&S;onpYvn%k5W~Q57W6Q%0&$G&>=PlwsTmT>^@1{EwodHduAI~Ou;4x4CINepPpWidO zIKy^9|1Pfo37;r(_M}hrDf$Pg>XLYp&P37mQuemfdj_OuxD7w{(SJh!dAUvFUBSGl z_xKc^roWe}w&)&uIEq5C-*#O78z=DWFv1_^;eYCfUneJ@@sWQHQUbg}M%Y(cF%YX&3CSjDy4AYYP6CK^fUZSUaG2fsHko#JW;;9E zB-L7eL@E?4O`HE8^3$J4s6dENtv#Njhf^=?O>V4hsI`~g`BN`M@%iSPo!!WpdcmI4 zoYR@v=Y5~&d*A1MXZPK+A|uyN-q;-Y ziMe+WB-&80iguc*Su3qMhGmi)2vJsNj4UIo4ktFHibmEk%tp;lcN-2%J4Kr{7986! zy9xRXvuy6Sq{|u<@*A_Yvvuk*01d$C_+bOfj=bXS-R}%IBEr zG&!u`Gatm(fIONsvtTr)n|NR~lhwKkYR>5{=2B`()1iU&UY_)D5eO{WsBQaWy& z4pvMEhB$KcCg`(Dsf|7(ZE!hDJeO*6(`ZoqtOZ5fKR7-=jZwrO<9L@e$ZhA9p*tl;!&2PHw(aOoSw(z=7}II-72Okl$-$C z1V{U*K>OI(wJ5j}atgPIh_^m1wO3NOWh5wUq1&<@Ui&_e5kwy0k?TD1Q=3^X@AN^{wSfQhKO&-I8+ps> zy1_eI^yz2*EVcQ<><@>y1+BXjYR5J5S>)KDbbM}^D%-bi#f7z3q;fCiSPqS>W|_7V z#I8t7;VTk|ecl)9PC+bG*67Y7L7XZN@d)S~0iDJweiVeJoChgxof<zIv!;qfdx?s}k-Y_x9J6HO?D(rlzeTuoe^j zHA~_C8q$0pOMVTiY!x71|D)6f#}q~BtD+#*eO#5T7gnmGt5#|UW)|=+K$QzzmHS0v z4;)MUpCaVrI{KhcZrgGww!+sQJQ}2&mPLK>Nr<3Fq1jPx7)cTI8~ban85C~HgKif= z9~zcoE2h!*<3T~acDC}&)=b~8jwAeW9{!siXF2+?fd1B~6pNR1V{^T z7~mju0*EJo`0cv1r8A=Zo7xQ9gDF;;D&=B0ui09T!Nv;YJ4E?Qh-I@zzF-tc2*e&i z^haOyhV@-(Bv32*j(qoQB5mdJ*if(sJhG5TX*R+wAlyQN)Du+@c%~IGyZAKf^)#T&l3Oxc23vMfN)fY=N#i>zN3IRR}>Ni8cB%bg5@=0k3&;&BROCg*bb%Zv>-%G8f?t(TBi96>iv=POP zAm^aTIf=CFX2~9|`Yvvah|zm6RD#A)kiNGm#w1@kRVzc1d+H5SXT2o(y(ub|T$qfv zl`G-zr;~dH7I2W-51(}WFPG?fPofv-q|{RC z82K!9r75u?&(rxJ78W#9z)~u@TP^ar zwwRbe-A$kuUxbQ>=w>}dziRHu}O3MIV=1o4p zzro*DsZM*T&d^^;t-j8Fs?+pLMXDz2b=1my&miA3P9Rv>bVH!#oL<$o4vvl6Lqi?6>LSxj7wEQPN|$bnyn$cb{obDkVO zrH7>0imi2yP6x^1n)FJGo`xdRP^9YRGWNWe`zv&;y1itVuGI5%yt=$b+1Q|T{=S~$ zBYH70UcD3^uO@NIXKMH)txNvQ1AUdgam^0KOoixj^fey&Q9i40%@obF`-{Ts6oa{3 zqDpvy))8e3e(Z3VyZyXD9}~NQhp>=%jn*vk$c;+J&*^WeW8()6eBQ$+O30h&aQ+Nk gq~a2#WfR%lQj)ls|7ZIN|Q8ATP*ldOG{O1i#m=oj#}+F&Nv1YNWzzV35)>|%pY~?@7;HA?;^9| z4{s)!$?o3o`906`dw%b;*?9ZP+oJPHRl&-e>nvt;ZXn7I+HD$c7oi6uO^t-e4@c`$ zwv~5v%O#QVND`O!RMe+5w>QT~^r=YkyPAmy2&srzW`-zH@Ae#AAQDlk(`JT|*bCCl zodq-FE;g;jx?z~E3E*1^QED=##Yp8|DY+bf?VrWPNDb)NdRb|j{>#pU?*BKQselA6#+RN4z(jes@e`io^% zwOEg%B)5~-_s$2|3&0rNV6`>rXeQD~%$ zdEL1(ta8%l0Ci3xt?y3hj-&SywVs!3{zRnJtJr%+OBG9X=?<^Fk>@NDuhXKOP@4sn zywK3Xd!H_9p{&4ie4*g>zD=>FVoOnpg`{F(f2`EQEX#5wPbd0gW6}N?XRDu!$@p*DmU8aj^DL8C#-gPiOVze55E)_{ZXVqlM zWTM2W{99VS%XVC@8cjIBbYe0w7M)CxhDAxit#NbZEZiCzz>afk;@p&)=08fwW#uYs zIvo~T)JC&&%+W1F^Lj9yIF0b9dH9{z4`BnS*wM5@oL>7 zLf<+WNzQ20EvLdlV^Y>xS>~C+DFi*mgMP>lD#up{zz_dPNmsL**}o(JY?<|jhbkFAj79l*t5p>Bya1+E9bKnps^#}R$C(ss`z)T$Rf=80fp#@JP1IDKX&J1CsK$0GY%tgm;N&c&rUmStinU<7 z4&_*&v~~UCN|QSKASaXPIAi{%#Q?oxX-zwZH3=T$>L_<9Z2r6F#5&uD;`J3kjF9PF?WLq zjD@CKN1_!iv;$@NNX=dCdc~(uh0HPY7CV6xmT(B z`8xFr+aczS(2Qbyk&53M-1uJ$ee2 zm_j8MeTCD)ZkLzio2W=cII&mSO>|!vO!+at4`};{i+X*DnG=b z;X@D8$79Vi>_Yuo@hQl0jrZh3bfm2ISHfBoz9Z=q%N zPXtdykN8P`gZ@V1LsxR~N9fV8Ts`M9>_TUT1?F`WIUnT}{HD*~4mrNX2d^%nZlOoQ zQ2z(;2mp@&aDaMixg3AgFPh(vH)uV7=P+2BY^A%Tk_Yl-N5iWVmcZ*s#bf@r2I)|& zxi}}omlxDuk%m#oVP41~KMe?B*iYke`b#M|HTdc`Ob>@8lgD_JRp&60IgDgRC{v%H z@QhKP)|2$HSaVQ!;TpL26pubaxp9or!OPj&oey9&g>VPKcaZaax>WXUKHqQAUr00d z#clLp7+!LK9r2&jpd? z_)Z`7dHS*x7&!0mPC6cj%8%zj`{O_z=cq6Es1VIAAM{1~qEwWf=OMf3{xDFyrU$$F zeqingCgmGn^ar$7{h<&3Bl_>q(dK6Z#v6i?CiSkvHG;C_do9@6Mf_-Pkj6&q>b7 z%|P?z&|X7#dkDQ8NwyG@J``=xEYopS(|*Zz=|E6LQPe;8{89JyEp=h!kIm61j7)nkzDL>tw2V^$#bB zH#k<&)|isBG}SdMliWs#yspd0F|y`p>XB^G$hn5usM=bO;WEuF+N{xWZNuz#Qh2g9 zXPAt{`lUn?e|=chYuS5nPtgq<4_o#=BK3S}t#Y(V?p!;& zHq^F+xWj$B9WJerYvXT83HXT0B`&C%+&&g2B4=@5tYS9D6w&;})EMZ;IQb_8`5jZ? zx?IVfqhVq3Zm_qSWD85BgZCl+(GRZ35M);|F#<$*}hS_D92HZfH zq~ja8A#!coZ>1y>%IhNJY$WXw)5zfw><+T=Tt&HVkIhuwQCJ_+mgm$tRD2E|cB{$P`%TeZwKfdw46_PEgawUevQsszti@O6Iu@3Fp)Hl+<+Ovj%PU43#wN(5zn zKpS#m{zXV;yYB#u-iDuVu*^13GI?S?tnYkmp!Rt*dLE6IS>~zD>G%#|;5R>#T1#!@ zW(WgzfJCNp(IHBBrCD4c`BIVdFG7l_JhHLGq|%sAfK-GWse zkrFG?YWHjytDh5Af!V4VXO;ndRf{i_(^K(qz(s`av zR4+v*s!0c{)A$AXKh$P83Yp@3RwXY-3#zT=8Ag~xx`_O@2+QS+f@3%&f^xdS*>lD} zb3CM>-L(-B2F80S&B_;W+`^Hjdm)v@##&4*K=wk4)IZPn3ibEh!=!zW(EgWnln<%ijzzJbeOk1mw6KIXSM~*(@=Ms_tX-Y zcckM5f%(FXm^cRdhoQni805$1$^bwI0BVbpFjFkPV@|<{Q{3H`XkhQl zRG|89@X_@$Jr)L2Ij)ZZ?HJHrp)B)bii|kOp)ituLN7_JLH~o4c$JgBLU~Rcq?bQ# zUXW;)Vc%ug_fx864$)GkzeY#OBdIhc^q>+Of>g-SYa z?8A-=;JF}?7V<{fjyHWf-l9jPM5)tWc)m%;!(1s%^wQCL9L|ixnIoQfK2DF)iL&_8 z0!4$5(e;^rpS>v^AMlG9q`#3`f}G_&k)uZ_8K7q?>Jal>G59Dyi&D-?q=Ovy!4R)Q zeksHBQY2Aw#4BZp&V-es=I|E7U!VXwgED5kGEP9|NLl8nFLR9kPD%!i4rGqf^A$2p z*5@jfTF*o4d9-(&)*gaJ;aU518=V-fW zx$K3anj@L{vLz?|3Qp0#NUbY^ito;3I*tcU(yJ9!_>qC^Gg&X*DfyvqF?AK?T!lH5 zr*-sgT9-NPll+{%yJ}`&yrC88_!+LGhfjffx{9Xey?DPv5&7kVz8qbkbwu8R{|UIv zYxcWzx0pIU!b0i{ty$#ENxAbE^bgdv@!pTmO?={n{1UOlpP`FXT*6`dSLi2zopA;RpLgHAy*-(2 z^G9cTyZ8K_=lOl!mOEFjjxQy3C97zzx0unli6~Fg0n>2%2|W_)>>xzm9&gFmR?*ch zm&9gbX?*nCnwE^_4iy-QKM^Z`S2OVfAvH0}%n>E-Jzj(lh(wh7teImZu}`|AuVm)j zR?}+L4a0Oz052y*X~>xtBehdf`ZoM;deMOGY%s0$nqfLD&gfh(xfXULl!kYX z)b@0HV(W$?HVe_x?xfL<-@t7q%Xu8pw5*LVj9o(AC_2hv|l98u0NF z47>#U8f!iKw#Q@K71AW2o9C~Nb|LLO;x=55@b7yqCGyYH?_~N-7s)L-thMMm$hN42 z_rEN4hWTB8FjcW3{4F>tlxm`07g7gPlktNo(*A*r?l}4oQI~LoZkUbrcs2XM-4&NI z{kp?_Hj3tEMq1vW<>KKbASag!vp%#n(OJ$BG%O`GOSdH|Z1OD6OLHN$EioD2mLMIC zDdEYD|Bd!USb`+W$(y(*N<)1m88;n?5^LC{z8njr9)Z*&klOg+Ai*~aw2%B%O5Ykb z@aB_Im|1g>8CuqMv~14SdCQyx>`B0WG^4gI>a*<}x9FBPsAo!>Fs1$9QYYwpq#>e> z)U;g;m5->LqQ(Z1US2*IQ9c)W`K0}Vk&_*QYUis`8WW}>zvEaG)d8L`%??Ymg;e6^jbg5<*HH!^sqJ|by z<4Ep!0{m|a;BOcFKlT?X-4*74`-v;@2X=X0!kQCMae`;@4gvk~9ktQDgeRySUN_4{ z_)q*zN-qnCUw%3&yr@*oE-**849zS0h16+;Kh49h5aB=h_ta&>g8&b|QiPW$r8F9= zlD(B@qQW!FFm=mf#UezXLDVyd+RF+y<`i>?x@rZ>7u+FWuNH~Bb9bUEa25l{d-5r; z>{WU{Jx7&$*Q`PJuAT@d&ud04$Mg*dGJ&K`@T7glmnJ9g613OM#nR=T#@wwZcb$r& zt>>^5^URyMr@;CYSTFvp0K`O91lPM?OLSKODpMg^4raE&S6SXR7>G@Q*i?e_+|!id zA1H59hhYXkm}8Q9+t6P@_^ zH&YoqU%;L<2w6Ly>cfCrNX>)xe2Oe-yjRd(cQ$%5i30N~>^|Yu7k(#IjgtGOqpb4U zvpk2V5p)_}eNpVEo zQMkNV`Apf&92*%q56ttxG@6imwn9#3h0^siQb$=SK^ZLKPinHWA&2;NW1=Xru@+LZ z(qw#ALT38~w`MtM3U0p7ytd7$C|2maV3`qV_290YvyZQwIpycrMC4n-8*cufk*6#fteNGze>DIb23lRZSLlnt_XQSxxGYJIGg5X&Y+)A0c zjiS^Zq9Ui;>0^nmpnS!A#k22of?Fv@EP05IyuI7(z6Wry0eA%cHp2Vu2fm~m<>U^I zjcewIbib4iuz3;gphu&KdMDifoi<0o`Y2dG4Awv5tRL}N@1&0=y2=&9>k6LW*)GoE zVUP7AbU4J?;1_Jbc^I6BIp;@x&S;onpYvn%k5W~Q57W6Q%0&$G&>=PlwsTmT>^@1{EwodHduAI~Ou;4x4CINepPpWidO zIKy^9|1Pfo37;r(_M}hrDf$Pg>XLYp&P37mQuemfdj_OuxD7w{(SJh!dAUvFUBSGl z_xKc^roWe}w&)&uIEq5C-*#O78z=DWFv1_^;eYCfUneJ@@sWQHQUbg}M%Y(c Date: Tue, 12 Sep 2017 14:37:59 +0100 Subject: [PATCH 77/80] Ensure pointer invariants are maintained --- src/ansi-c/c_typecast.cpp | 3 +-- src/ansi-c/c_typecheck_expr.cpp | 3 +-- src/ansi-c/c_typecheck_type.cpp | 2 +- src/ansi-c/parser.y | 21 +++++++-------------- src/ansi-c/parser_static.inc | 3 +-- src/cpp/cpp_typecheck_constructor.cpp | 11 +++++------ src/cpp/parse.cpp | 11 ++++++----- src/goto-programs/remove_exceptions.cpp | 2 +- src/util/std_types.h | 4 ++++ 9 files changed, 27 insertions(+), 33 deletions(-) diff --git a/src/ansi-c/c_typecast.cpp b/src/ansi-c/c_typecast.cpp index edf95e5379e..0be52dae81c 100644 --- a/src/ansi-c/c_typecast.cpp +++ b/src/ansi-c/c_typecast.cpp @@ -372,8 +372,7 @@ void c_typecastt::implicit_typecast_arithmetic( case PTR: if(expr_type.id()==ID_array) { - new_type.id(ID_pointer); - new_type.subtype()=expr_type.subtype(); + new_type=pointer_type(expr_type.subtype()); break; } return; diff --git a/src/ansi-c/c_typecheck_expr.cpp b/src/ansi-c/c_typecheck_expr.cpp index e45dc1a4d89..59c684de00b 100644 --- a/src/ansi-c/c_typecheck_expr.cpp +++ b/src/ansi-c/c_typecheck_expr.cpp @@ -1594,8 +1594,7 @@ void c_typecheck_baset::typecheck_expr_trinary(if_exprt &expr) { // Make it void *. // gcc and clang issue a warning for this. - expr.type()=typet(ID_pointer); - expr.type().subtype()=typet(ID_empty); + expr.type()=pointer_type(empty_typet()); implicit_typecast(operands[1], expr.type()); implicit_typecast(operands[2], expr.type()); } diff --git a/src/ansi-c/c_typecheck_type.cpp b/src/ansi-c/c_typecheck_type.cpp index 1a6bf27adad..88ca770c4bf 100644 --- a/src/ansi-c/c_typecheck_type.cpp +++ b/src/ansi-c/c_typecheck_type.cpp @@ -1492,7 +1492,7 @@ void c_typecheck_baset::adjust_function_parameter(typet &type) const { if(type.id()==ID_array) { - type.id(ID_pointer); + type=pointer_type(type.subtype()); type.remove(ID_size); type.remove(ID_C_constant); } diff --git a/src/ansi-c/parser.y b/src/ansi-c/parser.y index bddccced310..ba7ab7a0bb1 100644 --- a/src/ansi-c/parser.y +++ b/src/ansi-c/parser.y @@ -3065,8 +3065,7 @@ unary_identifier_declarator: { // the type_qualifier_list is for the pointer, // and not the identifier_declarator - stack_type($1).id(ID_pointer); - stack_type($1).subtype()=typet(ID_abstract); + stack_type($1)=pointer_type(typet(ID_abstract)); $2=merge($2, $1); // dest=$2 make_subtype($3, $2); // dest=$3 $$=$3; @@ -3250,15 +3249,13 @@ unary_abstract_declarator: '*' { $$=$1; - set($$, ID_pointer); - stack_type($$).subtype()=typet(ID_abstract); + stack_type($$)=pointer_type(typet(ID_abstract)); } | '*' attribute_type_qualifier_list { // The type_qualifier_list belongs to the pointer, // not to the (missing) abstract declarator. - set($1, ID_pointer); - stack_type($1).subtype()=typet(ID_abstract); + stack_type($1)=pointer_type(typet(ID_abstract)); $$=merge($2, $1); } | '*' abstract_declarator @@ -3270,8 +3267,7 @@ unary_abstract_declarator: { // The type_qualifier_list belongs to the pointer, // not to the abstract declarator. - stack_type($1).id(ID_pointer); - stack_type($1).subtype()=typet(ID_abstract); + stack_type($1)=pointer_type(typet(ID_abstract)); $2=merge($2, $1); // dest=$2 make_subtype($3, $2); // dest=$3 $$=$3; @@ -3290,15 +3286,13 @@ parameter_unary_abstract_declarator: '*' { $$=$1; - set($$, ID_pointer); - stack_type($$).subtype()=typet(ID_abstract); + stack_type($$)=pointer_type(typet(ID_abstract)); } | '*' attribute_type_qualifier_list { // The type_qualifier_list belongs to the pointer, // not to the (missing) abstract declarator. - set($1, ID_pointer); - stack_type($1).subtype()=typet(ID_abstract); + stack_type($1)=pointer_type(typet(ID_abstract)); $$=merge($2, $1); } | '*' parameter_abstract_declarator @@ -3310,8 +3304,7 @@ parameter_unary_abstract_declarator: { // The type_qualifier_list belongs to the pointer, // not to the (missing) abstract declarator. - stack($1).id(ID_pointer); - stack_type($1).subtype()=typet(ID_abstract); + stack_type($1)=pointer_type(typet(ID_abstract)); $2=merge($2, $1); // dest=$2 make_subtype($3, $2); // dest=$3 $$=$3; diff --git a/src/ansi-c/parser_static.inc b/src/ansi-c/parser_static.inc index e0c8385998d..6f0b3f41b1d 100644 --- a/src/ansi-c/parser_static.inc +++ b/src/ansi-c/parser_static.inc @@ -290,8 +290,7 @@ Function: make_pointer static void make_pointer(const YYSTYPE dest) { - set(dest, ID_pointer); - stack_type(dest).subtype()=typet(ID_abstract); + stack_type(dest)=pointer_type(typet(ID_abstract)); } /*******************************************************************\ diff --git a/src/cpp/cpp_typecheck_constructor.cpp b/src/cpp/cpp_typecheck_constructor.cpp index 40b0fe18afd..2ec3a686c2d 100644 --- a/src/cpp/cpp_typecheck_constructor.cpp +++ b/src/cpp/cpp_typecheck_constructor.cpp @@ -41,17 +41,17 @@ static void copy_parent( exprt &op0=code.op0().op0(); op0.operands().push_back(exprt("cpp-this")); - op0.type().id(ID_pointer); - op0.type().subtype()=cpp_namet(parent_base_name, source_location).as_type(); + op0.type()= + pointer_type(cpp_namet(parent_base_name, source_location).as_type()); op0.add_source_location()=source_location; code.operands().push_back(exprt("explicit-typecast")); exprt &op1=code.op1(); - op1.type().id(ID_pointer); + op0.type()= + pointer_type(cpp_namet(parent_base_name, source_location).as_type()); op1.type().set(ID_C_reference, true); op1.type().subtype().set(ID_C_constant, true); - op1.type().subtype()=cpp_namet(parent_base_name, source_location).as_type(); op1.operands().push_back(exprt(ID_cpp_name)); op1.op0().get_sub().push_back(irept(ID_name)); @@ -420,9 +420,8 @@ void cpp_typecheckt::default_assignop( args_decl_declor.name().get_sub().back().add(ID_identifier).id(arg_name); args_decl_declor.add_source_location()=source_location; - args_decl_declor.type().id(ID_pointer); + args_decl_declor.type()=pointer_type(typet(ID_nil)); args_decl_declor.type().set(ID_C_reference, true); - args_decl_declor.type().subtype().make_nil(); args_decl_declor.value().make_nil(); } diff --git a/src/cpp/parse.cpp b/src/cpp/parse.cpp index ee399b8af8d..1cb4bfbe651 100644 --- a/src/cpp/parse.cpp +++ b/src/cpp/parse.cpp @@ -18,6 +18,7 @@ Author: Daniel Kroening, kroening@cs.cmu.edu #include #include #include +#include #include @@ -3015,7 +3016,7 @@ bool Parser::optPtrOperator(typet &ptrs) if(t=='*') { - typet op(ID_pointer); + typet op=pointer_type(typet(ID_nil)); cpp_tokent tk; lex.get_token(tk); set_location(op, tk); @@ -3078,7 +3079,7 @@ bool Parser::optPtrOperator(typet &ptrs) { cpp_tokent tk; lex.get_token(tk); - typet op(ID_pointer); + typet op=pointer_type(typet(ID_nil)); op.set(ID_C_reference, true); set_location(op, tk); t_list.push_front(op); @@ -3087,7 +3088,7 @@ bool Parser::optPtrOperator(typet &ptrs) { cpp_tokent tk; lex.get_token(tk); - typet op(ID_pointer); + typet op=pointer_type(typet(ID_nil)); op.set(ID_C_rvalue_reference, true); set_location(op, tk); t_list.push_front(op); @@ -3530,7 +3531,7 @@ bool Parser::rPtrToMember(irept &ptr_to_mem) std::cout << std::string(__indent, ' ') << "Parser::rPtrToMember 0\n"; #endif - irept ptm(ID_pointer); + typet ptm=pointer_type(typet(ID_nil)); irept &name = ptm.add("to-member"); name=cpp_namet(); irept::subt &components=name.get_sub(); @@ -6477,7 +6478,7 @@ bool Parser::rPrimaryExpr(exprt &exp) case TOK_NULLPTR: lex.get_token(tk); - exp=constant_exprt(ID_NULL, typet(ID_pointer, typet(ID_nullptr))); + exp=constant_exprt(ID_NULL, pointer_type(typet(ID_nullptr))); set_location(exp, tk); #ifdef DEBUG std::cout << std::string(__indent, ' ') << "Parser::rPrimaryExpr 6\n"; diff --git a/src/goto-programs/remove_exceptions.cpp b/src/goto-programs/remove_exceptions.cpp index 0c9a922367d..d437ddf622b 100644 --- a/src/goto-programs/remove_exceptions.cpp +++ b/src/goto-programs/remove_exceptions.cpp @@ -213,7 +213,7 @@ void remove_exceptionst::add_exceptional_returns( new_symbol.base_name=id2string(function_symbol.base_name)+EXC_SUFFIX; new_symbol.name=id2string(function_symbol.name)+EXC_SUFFIX; new_symbol.mode=function_symbol.mode; - new_symbol.type=typet(ID_pointer, empty_typet()); + new_symbol.type=pointer_type(empty_typet()); symbol_table.add(new_symbol); // initialize the exceptional return with NULL diff --git a/src/util/std_types.h b/src/util/std_types.h index 4d4a0763ca8..52ba60784f5 100644 --- a/src/util/std_types.h +++ b/src/util/std_types.h @@ -1391,6 +1391,7 @@ class pointer_typet:public bitvector_typet inline const pointer_typet &to_pointer_type(const typet &type) { assert(type.id()==ID_pointer); + assert(!type.get(ID_width).empty()); return static_cast(type); } @@ -1400,6 +1401,7 @@ inline const pointer_typet &to_pointer_type(const typet &type) inline pointer_typet &to_pointer_type(typet &type) { assert(type.id()==ID_pointer); + assert(!type.get(ID_width).empty()); return static_cast(type); } @@ -1428,6 +1430,7 @@ class reference_typet:public pointer_typet inline const reference_typet &to_reference_type(const typet &type) { assert(type.id()==ID_pointer && type.get_bool(ID_C_reference)); + assert(!type.get(ID_width).empty()); return static_cast(type); } @@ -1437,6 +1440,7 @@ inline const reference_typet &to_reference_type(const typet &type) inline reference_typet &to_reference_type(typet &type) { assert(type.id()==ID_pointer && type.get_bool(ID_C_reference)); + assert(!type.get(ID_width).empty()); return static_cast(type); } From 81f1300f439f9b7f7e92b6feb242cf3789d7b092 Mon Sep 17 00:00:00 2001 From: reuk Date: Wed, 13 Sep 2017 16:50:29 +0100 Subject: [PATCH 78/80] Use PRECONDITION in std_types.h --- src/util/std_types.h | 161 +++++++++++++++++++++---------------------- 1 file changed, 79 insertions(+), 82 deletions(-) diff --git a/src/util/std_types.h b/src/util/std_types.h index 52ba60784f5..726c210e52e 100644 --- a/src/util/std_types.h +++ b/src/util/std_types.h @@ -17,10 +17,9 @@ Author: Daniel Kroening, kroening@kroening.com * \date Sun Jul 31 21:54:44 BST 2011 */ -#include - #include "expr.h" #include "mp_arith.h" +#include "invariant.h" class constant_exprt; @@ -141,7 +140,7 @@ class symbol_typet:public typet */ inline const symbol_typet &to_symbol_type(const typet &type) { - assert(type.id()==ID_symbol); + PRECONDITION(type.id()==ID_symbol); return static_cast(type); } @@ -150,7 +149,7 @@ inline const symbol_typet &to_symbol_type(const typet &type) */ inline symbol_typet &to_symbol_type(typet &type) { - assert(type.id()==ID_symbol); + PRECONDITION(type.id()==ID_symbol); return static_cast(type); } @@ -276,8 +275,7 @@ class struct_union_typet:public typet */ inline const struct_union_typet &to_struct_union_type(const typet &type) { - assert(type.id()==ID_struct || - type.id()==ID_union); + PRECONDITION(type.id()==ID_struct || type.id()==ID_union); return static_cast(type); } @@ -286,8 +284,7 @@ inline const struct_union_typet &to_struct_union_type(const typet &type) */ inline struct_union_typet &to_struct_union_type(typet &type) { - assert(type.id()==ID_struct || - type.id()==ID_union); + PRECONDITION(type.id()==ID_struct || type.id()==ID_union); return static_cast(type); } @@ -316,7 +313,7 @@ class struct_typet:public struct_union_typet */ inline const struct_typet &to_struct_type(const typet &type) { - assert(type.id()==ID_struct); + PRECONDITION(type.id()==ID_struct); return static_cast(type); } @@ -325,7 +322,7 @@ inline const struct_typet &to_struct_type(const typet &type) */ inline struct_typet &to_struct_type(typet &type) { - assert(type.id()==ID_struct); + PRECONDITION(type.id()==ID_struct); return static_cast(type); } @@ -420,7 +417,7 @@ class class_typet:public struct_typet */ inline const class_typet &to_class_type(const typet &type) { - assert(type.id()==ID_struct); + PRECONDITION(type.id()==ID_struct); return static_cast(type); } @@ -429,7 +426,7 @@ inline const class_typet &to_class_type(const typet &type) */ inline class_typet &to_class_type(typet &type) { - assert(type.id()==ID_struct); + PRECONDITION(type.id()==ID_struct); return static_cast(type); } @@ -455,7 +452,7 @@ class union_typet:public struct_union_typet */ inline const union_typet &to_union_type(const typet &type) { - assert(type.id()==ID_union); + PRECONDITION(type.id()==ID_union); return static_cast(type); } @@ -464,7 +461,7 @@ inline const union_typet &to_union_type(const typet &type) */ inline union_typet &to_union_type(typet &type) { - assert(type.id()==ID_union); + PRECONDITION(type.id()==ID_union); return static_cast(type); } @@ -508,9 +505,9 @@ class tag_typet:public typet */ inline const tag_typet &to_tag_type(const typet &type) { - assert(type.id()==ID_c_enum_tag || - type.id()==ID_struct_tag || - type.id()==ID_union_tag); + PRECONDITION(type.id()==ID_c_enum_tag || + type.id()==ID_struct_tag || + type.id()==ID_union_tag); return static_cast(type); } @@ -519,9 +516,9 @@ inline const tag_typet &to_tag_type(const typet &type) */ inline tag_typet &to_tag_type(typet &type) { - assert(type.id()==ID_c_enum_tag || - type.id()==ID_struct_tag || - type.id()==ID_union_tag); + PRECONDITION(type.id()==ID_c_enum_tag || + type.id()==ID_struct_tag || + type.id()==ID_union_tag); return static_cast(type); } @@ -549,7 +546,7 @@ class struct_tag_typet:public tag_typet */ inline const struct_tag_typet &to_struct_tag_type(const typet &type) { - assert(type.id()==ID_struct_tag); + PRECONDITION(type.id()==ID_struct_tag); return static_cast(type); } @@ -558,7 +555,7 @@ inline const struct_tag_typet &to_struct_tag_type(const typet &type) */ inline struct_tag_typet &to_struct_tag_type(typet &type) { - assert(type.id()==ID_struct_tag); + PRECONDITION(type.id()==ID_struct_tag); return static_cast(type); } @@ -586,7 +583,7 @@ class union_tag_typet:public tag_typet */ inline const union_tag_typet &to_union_tag_type(const typet &type) { - assert(type.id()==ID_union_tag); + PRECONDITION(type.id()==ID_union_tag); return static_cast(type); } @@ -595,7 +592,7 @@ inline const union_tag_typet &to_union_tag_type(const typet &type) */ inline union_tag_typet &to_union_tag_type(typet &type) { - assert(type.id()==ID_union_tag); + PRECONDITION(type.id()==ID_union_tag); return static_cast(type); } @@ -632,7 +629,7 @@ class enumeration_typet:public typet */ inline const enumeration_typet &to_enumeration_type(const typet &type) { - assert(type.id()==ID_enumeration); + PRECONDITION(type.id()==ID_enumeration); return static_cast(type); } @@ -641,7 +638,7 @@ inline const enumeration_typet &to_enumeration_type(const typet &type) */ inline enumeration_typet &to_enumeration_type(typet &type) { - assert(type.id()==ID_enumeration); + PRECONDITION(type.id()==ID_enumeration); return static_cast(type); } @@ -693,7 +690,7 @@ class c_enum_typet:public type_with_subtypet */ inline const c_enum_typet &to_c_enum_type(const typet &type) { - assert(type.id()==ID_c_enum); + PRECONDITION(type.id()==ID_c_enum); return static_cast(type); } @@ -702,7 +699,7 @@ inline const c_enum_typet &to_c_enum_type(const typet &type) */ inline c_enum_typet &to_c_enum_type(typet &type) { - assert(type.id()==ID_c_enum); + PRECONDITION(type.id()==ID_c_enum); return static_cast(type); } @@ -730,7 +727,7 @@ class c_enum_tag_typet:public tag_typet */ inline const c_enum_tag_typet &to_c_enum_tag_type(const typet &type) { - assert(type.id()==ID_c_enum_tag); + PRECONDITION(type.id()==ID_c_enum_tag); return static_cast(type); } @@ -739,7 +736,7 @@ inline const c_enum_tag_typet &to_c_enum_tag_type(const typet &type) */ inline c_enum_tag_typet &to_c_enum_tag_type(typet &type) { - assert(type.id()==ID_c_enum_tag); + PRECONDITION(type.id()==ID_c_enum_tag); return static_cast(type); } @@ -907,7 +904,7 @@ class code_typet:public typet */ inline const code_typet &to_code_type(const typet &type) { - assert(type.id()==ID_code); + PRECONDITION(type.id()==ID_code); return static_cast(type); } @@ -916,7 +913,7 @@ inline const code_typet &to_code_type(const typet &type) */ inline code_typet &to_code_type(typet &type) { - assert(type.id()==ID_code); + PRECONDITION(type.id()==ID_code); return static_cast(type); } @@ -969,7 +966,7 @@ class array_typet:public type_with_subtypet */ inline const array_typet &to_array_type(const typet &type) { - assert(type.id()==ID_array); + PRECONDITION(type.id()==ID_array); return static_cast(type); } @@ -978,7 +975,7 @@ inline const array_typet &to_array_type(const typet &type) */ inline array_typet &to_array_type(typet &type) { - assert(type.id()==ID_array); + PRECONDITION(type.id()==ID_array); return static_cast(type); } @@ -1009,7 +1006,7 @@ class incomplete_array_typet:public type_with_subtypet */ inline const incomplete_array_typet &to_incomplete_array_type(const typet &type) { - assert(type.id()==ID_array); + PRECONDITION(type.id()==ID_array); return static_cast(type); } @@ -1018,7 +1015,7 @@ inline const incomplete_array_typet &to_incomplete_array_type(const typet &type) */ inline incomplete_array_typet &to_incomplete_array_type(typet &type) { - assert(type.id()==ID_array); + PRECONDITION(type.id()==ID_array); return static_cast(type); } @@ -1074,32 +1071,32 @@ class bitvector_typet:public type_with_subtypet */ inline const bitvector_typet &to_bitvector_type(const typet &type) { - assert(type.id()==ID_signedbv || - type.id()==ID_unsignedbv || - type.id()==ID_fixedbv || - type.id()==ID_floatbv || - type.id()==ID_verilog_signedbv || - type.id()==ID_verilog_unsignedbv || - type.id()==ID_bv || - type.id()==ID_pointer || - type.id()==ID_c_bit_field || - type.id()==ID_c_bool); + PRECONDITION(type.id()==ID_signedbv || + type.id()==ID_unsignedbv || + type.id()==ID_fixedbv || + type.id()==ID_floatbv || + type.id()==ID_verilog_signedbv || + type.id()==ID_verilog_unsignedbv || + type.id()==ID_bv || + type.id()==ID_pointer || + type.id()==ID_c_bit_field || + type.id()==ID_c_bool); return static_cast(type); } inline bitvector_typet &to_bitvector_type(typet &type) { - assert(type.id()==ID_signedbv || - type.id()==ID_unsignedbv || - type.id()==ID_fixedbv || - type.id()==ID_floatbv || - type.id()==ID_verilog_signedbv || - type.id()==ID_verilog_unsignedbv || - type.id()==ID_bv || - type.id()==ID_pointer || - type.id()==ID_c_bit_field || - type.id()==ID_c_bool); + PRECONDITION(type.id()==ID_signedbv || + type.id()==ID_unsignedbv || + type.id()==ID_fixedbv || + type.id()==ID_floatbv || + type.id()==ID_verilog_signedbv || + type.id()==ID_verilog_unsignedbv || + type.id()==ID_bv || + type.id()==ID_pointer || + type.id()==ID_c_bit_field || + type.id()==ID_c_bool); return static_cast(type); } @@ -1131,7 +1128,7 @@ class bv_typet:public bitvector_typet */ inline const bv_typet &to_bv_type(const typet &type) { - assert(type.id()==ID_bv); + PRECONDITION(type.id()==ID_bv); return static_cast(type); } @@ -1140,7 +1137,7 @@ inline const bv_typet &to_bv_type(const typet &type) */ inline bv_typet &to_bv_type(typet &type) { - assert(type.id()==ID_bv); + PRECONDITION(type.id()==ID_bv); return static_cast(type); } @@ -1177,7 +1174,7 @@ class unsignedbv_typet:public bitvector_typet */ inline const unsignedbv_typet &to_unsignedbv_type(const typet &type) { - assert(type.id()==ID_unsignedbv); + PRECONDITION(type.id()==ID_unsignedbv); return static_cast(type); } @@ -1186,7 +1183,7 @@ inline const unsignedbv_typet &to_unsignedbv_type(const typet &type) */ inline unsignedbv_typet &to_unsignedbv_type(typet &type) { - assert(type.id()==ID_unsignedbv); + PRECONDITION(type.id()==ID_unsignedbv); return static_cast(type); } @@ -1223,7 +1220,7 @@ class signedbv_typet:public bitvector_typet */ inline const signedbv_typet &to_signedbv_type(const typet &type) { - assert(type.id()==ID_signedbv); + PRECONDITION(type.id()==ID_signedbv); return static_cast(type); } @@ -1232,7 +1229,7 @@ inline const signedbv_typet &to_signedbv_type(const typet &type) */ inline signedbv_typet &to_signedbv_type(typet &type) { - assert(type.id()==ID_signedbv); + PRECONDITION(type.id()==ID_signedbv); return static_cast(type); } @@ -1270,7 +1267,7 @@ class fixedbv_typet:public bitvector_typet */ inline const fixedbv_typet &to_fixedbv_type(const typet &type) { - assert(type.id()==ID_fixedbv); + PRECONDITION(type.id()==ID_fixedbv); return static_cast(type); } @@ -1309,7 +1306,7 @@ class floatbv_typet:public bitvector_typet */ inline const floatbv_typet &to_floatbv_type(const typet &type) { - assert(type.id()==ID_floatbv); + PRECONDITION(type.id()==ID_floatbv); return static_cast(type); } @@ -1342,7 +1339,7 @@ class c_bit_field_typet:public bitvector_typet */ inline const c_bit_field_typet &to_c_bit_field_type(const typet &type) { - assert(type.id()==ID_c_bit_field); + PRECONDITION(type.id()==ID_c_bit_field); return static_cast(type); } @@ -1358,7 +1355,7 @@ inline const c_bit_field_typet &to_c_bit_field_type(const typet &type) */ inline c_bit_field_typet &to_c_bit_field_type(typet &type) { - assert(type.id()==ID_c_bit_field); + PRECONDITION(type.id()==ID_c_bit_field); return static_cast(type); } @@ -1390,8 +1387,8 @@ class pointer_typet:public bitvector_typet */ inline const pointer_typet &to_pointer_type(const typet &type) { - assert(type.id()==ID_pointer); - assert(!type.get(ID_width).empty()); + PRECONDITION(type.id()==ID_pointer); + PRECONDITION(!type.get(ID_width).empty()); return static_cast(type); } @@ -1400,8 +1397,8 @@ inline const pointer_typet &to_pointer_type(const typet &type) */ inline pointer_typet &to_pointer_type(typet &type) { - assert(type.id()==ID_pointer); - assert(!type.get(ID_width).empty()); + PRECONDITION(type.id()==ID_pointer); + PRECONDITION(!type.get(ID_width).empty()); return static_cast(type); } @@ -1429,8 +1426,8 @@ class reference_typet:public pointer_typet */ inline const reference_typet &to_reference_type(const typet &type) { - assert(type.id()==ID_pointer && type.get_bool(ID_C_reference)); - assert(!type.get(ID_width).empty()); + PRECONDITION(type.id()==ID_pointer && type.get_bool(ID_C_reference)); + PRECONDITION(!type.get(ID_width).empty()); return static_cast(type); } @@ -1439,8 +1436,8 @@ inline const reference_typet &to_reference_type(const typet &type) */ inline reference_typet &to_reference_type(typet &type) { - assert(type.id()==ID_pointer && type.get_bool(ID_C_reference)); - assert(!type.get(ID_width).empty()); + PRECONDITION(type.id()==ID_pointer && type.get_bool(ID_C_reference)); + PRECONDITION(!type.get(ID_width).empty()); return static_cast(type); } @@ -1478,7 +1475,7 @@ class c_bool_typet:public bitvector_typet */ inline const c_bool_typet &to_c_bool_type(const typet &type) { - assert(type.id()==ID_c_bool); + PRECONDITION(type.id()==ID_c_bool); return static_cast(type); } @@ -1487,7 +1484,7 @@ inline const c_bool_typet &to_c_bool_type(const typet &type) */ inline c_bool_typet &to_c_bool_type(typet &type) { - assert(type.id()==ID_c_bool); + PRECONDITION(type.id()==ID_c_bool); return static_cast(type); } @@ -1513,7 +1510,7 @@ class string_typet:public typet */ inline const string_typet &to_string_type(const typet &type) { - assert(type.id()==ID_string); + PRECONDITION(type.id()==ID_string); return static_cast(type); } @@ -1551,7 +1548,7 @@ class range_typet:public typet */ inline const range_typet &to_range_type(const typet &type) { - assert(type.id()==ID_range); + PRECONDITION(type.id()==ID_range); return static_cast(type); } @@ -1594,7 +1591,7 @@ class vector_typet:public type_with_subtypet */ inline const vector_typet &to_vector_type(const typet &type) { - assert(type.id()==ID_vector); + PRECONDITION(type.id()==ID_vector); return static_cast(type); } @@ -1603,7 +1600,7 @@ inline const vector_typet &to_vector_type(const typet &type) */ inline vector_typet &to_vector_type(typet &type) { - assert(type.id()==ID_vector); + PRECONDITION(type.id()==ID_vector); return static_cast(type); } @@ -1634,7 +1631,7 @@ class complex_typet:public type_with_subtypet */ inline const complex_typet &to_complex_type(const typet &type) { - assert(type.id()==ID_complex); + PRECONDITION(type.id()==ID_complex); return static_cast(type); } @@ -1643,7 +1640,7 @@ inline const complex_typet &to_complex_type(const typet &type) */ inline complex_typet &to_complex_type(typet &type) { - assert(type.id()==ID_complex); + PRECONDITION(type.id()==ID_complex); return static_cast(type); } From 00e4555ba10b6a4b190ab7b64d885b7770463f68 Mon Sep 17 00:00:00 2001 From: reuk Date: Wed, 13 Sep 2017 22:03:57 +0100 Subject: [PATCH 79/80] Fix up CMake build (unrelated) --- CMakeLists.txt | 3 ++- src/CMakeLists.txt | 1 - src/musketeer/CMakeLists.txt | 30 ------------------------------ 3 files changed, 2 insertions(+), 32 deletions(-) delete mode 100644 src/musketeer/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index a5c0ef6893d..99a97066cde 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 3.2) find_program(CCACHE_PROGRAM ccache) if(CCACHE_PROGRAM) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") + message(STATUS "Rule launch compile: ${CCACHE_PROGRAM}") endif() set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9) @@ -19,7 +20,7 @@ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR # Ensure NDEBUG is not set for release builds set(CMAKE_CXX_FLAGS_RELEASE "-O2") # Enable lots of warnings - set(CMAKE_CXX_FLAGS "-Wall -Wpedantic -Werror") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wpedantic -Werror") elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") # This would be the place to enable warnings for Windows builds, although # config.inc doesn't seem to do that currently diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a7be2e0fd31..13c6d0045b5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -165,7 +165,6 @@ add_subdirectory(util) add_subdirectory(xmllang) add_subdirectory(java_bytecode) add_subdirectory(miniz) -add_subdirectory(musketeer) add_subdirectory(clobber) add_subdirectory(cbmc) add_subdirectory(goto-cc) diff --git a/src/musketeer/CMakeLists.txt b/src/musketeer/CMakeLists.txt deleted file mode 100644 index 6265183ee0b..00000000000 --- a/src/musketeer/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -# Library -file(GLOB_RECURSE sources "*.cpp") -file(GLOB_RECURSE headers "*.h") -list(REMOVE_ITEM sources - ${CMAKE_CURRENT_SOURCE_DIR}/musketeer_main.cpp -) -add_library(musketeer-lib ${sources} ${headers}) - -generic_includes(musketeer-lib) - -target_link_libraries(musketeer-lib - ansi-c - linking - big-int - goto-programs - goto-symex - assembler - pointer-analysis - analyses - langapi - util - solvers - goto-instrument-lib -) - -add_if_library(musketeer-lib glpk) - -# Executable -add_executable(musketeer musketeer_main.cpp) -target_link_libraries(musketeer musketeer-lib) From 1264b4dbcafa64fee7c2862480cffee174f3a892 Mon Sep 17 00:00:00 2001 From: reuk Date: Thu, 14 Sep 2017 10:20:25 +0100 Subject: [PATCH 80/80] Re-enable old function signatures for test-gen compat --- src/analyses/call_graph.cpp | 9 +++++++-- src/analyses/call_graph.h | 1 + src/goto-instrument/nondet_static.h | 6 ++++++ src/goto-programs/remove_static_init_loops.cpp | 17 +++++++++++++++-- src/goto-programs/remove_static_init_loops.h | 8 ++++++++ src/goto-programs/show_goto_functions.h | 6 ++++++ src/goto-programs/show_properties.h | 7 +++++++ 7 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/analyses/call_graph.cpp b/src/analyses/call_graph.cpp index dd2d5b275fd..93850f64d1d 100644 --- a/src/analyses/call_graph.cpp +++ b/src/analyses/call_graph.cpp @@ -18,9 +18,14 @@ call_grapht::call_grapht() { } -call_grapht::call_grapht(const goto_modelt &goto_model) +call_grapht::call_grapht(const goto_modelt &goto_model): + call_grapht(goto_model.goto_functions) { - forall_goto_functions(f_it, goto_model.goto_functions) +} + +call_grapht::call_grapht(const goto_functionst &goto_functions) +{ + forall_goto_functions(f_it, goto_functions) { const goto_programt &body=f_it->second.body; add(f_it->first, body); diff --git a/src/analyses/call_graph.h b/src/analyses/call_graph.h index ea4539147fd..684f74c3a3a 100644 --- a/src/analyses/call_graph.h +++ b/src/analyses/call_graph.h @@ -22,6 +22,7 @@ class call_grapht public: call_grapht(); explicit call_grapht(const goto_modelt &); + explicit call_grapht(const goto_functionst &); void output_dot(std::ostream &out) const; void output(std::ostream &out) const; diff --git a/src/goto-instrument/nondet_static.h b/src/goto-instrument/nondet_static.h index cddbb52c636..ac99134c5bf 100644 --- a/src/goto-instrument/nondet_static.h +++ b/src/goto-instrument/nondet_static.h @@ -16,6 +16,12 @@ Date: November 2011 #define CPROVER_GOTO_INSTRUMENT_NONDET_STATIC_H class goto_modelt; +class namespacet; +class goto_functionst; + +void nondet_static( + const namespacet &ns, + goto_functionst &goto_functions); void nondet_static(goto_modelt &); diff --git a/src/goto-programs/remove_static_init_loops.cpp b/src/goto-programs/remove_static_init_loops.cpp index 92554c50e4d..c0f3c05150f 100644 --- a/src/goto-programs/remove_static_init_loops.cpp +++ b/src/goto-programs/remove_static_init_loops.cpp @@ -109,6 +109,19 @@ void remove_static_init_loops( optionst &options, message_handlert &msg) { - remove_static_init_loopst remove_loops(goto_model.symbol_table); - remove_loops.unwind_enum_static(goto_model.goto_functions, options, msg); + remove_static_init_loops( + goto_model.symbol_table, + goto_model.goto_functions, + options, + msg); +} + +void remove_static_init_loops( + const symbol_tablet &symbol_table, + const goto_functionst &goto_functions, + optionst &options, + message_handlert &msg) +{ + remove_static_init_loopst remove_loops(symbol_table); + remove_loops.unwind_enum_static(goto_functions, options, msg); } diff --git a/src/goto-programs/remove_static_init_loops.h b/src/goto-programs/remove_static_init_loops.h index 5c31ac527d7..a78001046aa 100644 --- a/src/goto-programs/remove_static_init_loops.h +++ b/src/goto-programs/remove_static_init_loops.h @@ -19,10 +19,18 @@ Author: Daniel Kroening, kroening@kroening.com #include class goto_modelt; +class symbol_tablet; +class goto_functionst; void remove_static_init_loops( const goto_modelt &, optionst &, message_handlert &); +void remove_static_init_loops( + const symbol_tablet &symbol_table, + const goto_functionst &goto_functions, + optionst &, + message_handlert &); + #endif // CPROVER_GOTO_PROGRAMS_REMOVE_STATIC_INIT_LOOPS_H diff --git a/src/goto-programs/show_goto_functions.h b/src/goto-programs/show_goto_functions.h index 8cfcbff3ad9..d13c83557bc 100644 --- a/src/goto-programs/show_goto_functions.h +++ b/src/goto-programs/show_goto_functions.h @@ -16,6 +16,7 @@ Author: Peter Schrammel class namespacet; class goto_modelt; +class goto_functionst; #define OPT_SHOW_GOTO_FUNCTIONS \ "(show-goto-functions)" @@ -23,6 +24,11 @@ class goto_modelt; #define HELP_SHOW_GOTO_FUNCTIONS \ " --show-goto-functions show goto program\n" +void show_goto_functions( + const namespacet &ns, + ui_message_handlert::uit ui, + const goto_functionst &goto_functions); + void show_goto_functions( const goto_modelt &, ui_message_handlert::uit ui); diff --git a/src/goto-programs/show_properties.h b/src/goto-programs/show_properties.h index 98ccc8a948c..0cb0d1c641f 100644 --- a/src/goto-programs/show_properties.h +++ b/src/goto-programs/show_properties.h @@ -16,9 +16,16 @@ Author: Daniel Kroening, kroening@kroening.com class namespacet; class goto_modelt; +class symbol_tablet; +class goto_functionst; void show_properties( const goto_modelt &, ui_message_handlert::uit ui); +void show_properties( + const namespacet &ns, + ui_message_handlert::uit ui, + const goto_functionst &goto_functions); + #endif // CPROVER_GOTO_PROGRAMS_SHOW_PROPERTIES_H