mirror of
https://github.com/nasa/trick.git
synced 2024-12-18 20:57:55 +00:00
ICG exclude of class member variables now defines incorrect memory offsets in io_src #311
This changes back the default behavior to not use offsetof in io_src code. Added a flag to ICG, -c or --compat15, to globally generate offsetof statements. Added an ENV variable that can be used to generate offsetof statements by file or directory. Added in a warning if classes parsed at ICG time are different in size than at runtime.
This commit is contained in:
parent
5484e39f11
commit
f1cbacd646
2
Makefile
2
Makefile
@ -193,7 +193,7 @@ endif
|
|||||||
# header files.
|
# header files.
|
||||||
.PHONY: icg_sim_serv
|
.PHONY: icg_sim_serv
|
||||||
icg_sim_serv: $(ICG_EXE)
|
icg_sim_serv: $(ICG_EXE)
|
||||||
${TRICK_HOME}/bin/trick-ICG -s -m -n ${TRICK_CXXFLAGS} ${TRICK_SYSTEM_CXXFLAGS} ${TRICK_HOME}/include/trick/files_to_ICG.hh
|
${TRICK_HOME}/bin/trick-ICG -s -m ${TRICK_CXXFLAGS} ${TRICK_SYSTEM_CXXFLAGS} ${TRICK_HOME}/include/trick/files_to_ICG.hh
|
||||||
|
|
||||||
# 1.1.1.4.1 Build the Interface Code Generator (ICG) executable.
|
# 1.1.1.4.1 Build the Interface Code Generator (ICG) executable.
|
||||||
$(ICG_EXE) :
|
$(ICG_EXE) :
|
||||||
|
101
include/trick/ClassSizeCheck.hh
Normal file
101
include/trick/ClassSizeCheck.hh
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a map of class/struct name and calculated size difference between ICG and runtime
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CLASSSIZECHECK_HH
|
||||||
|
#define CLASSSIZECHECK_HH
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include "trick/attributes.h"
|
||||||
|
#include "trick/AttributesMap.hh"
|
||||||
|
|
||||||
|
namespace Trick {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* These maps stores all the attributes by class/struct/enum name
|
||||||
|
* So these 2 classes could inherit from a template or something fancy, but
|
||||||
|
* they are so simple I decided to leave them separate.
|
||||||
|
*/
|
||||||
|
struct ClassSizeDiffInfo {
|
||||||
|
int diff ;
|
||||||
|
std::string file_name ;
|
||||||
|
ClassSizeDiffInfo( int in_diff , std::string in_file_name ) :
|
||||||
|
diff(in_diff) , file_name(in_file_name) {}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
class ClassSizeCheck {
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Returns a pointer to the singleton Trick::ClassSizeCheck instance.
|
||||||
|
* @return A pointer to Trick::ClassSizeCheck
|
||||||
|
*/
|
||||||
|
static ClassSizeCheck * class_size_check() {
|
||||||
|
if ( pInstance == NULL ) {
|
||||||
|
pInstance = new Trick::ClassSizeCheck() ;
|
||||||
|
}
|
||||||
|
return pInstance ;
|
||||||
|
}
|
||||||
|
static void reset_instance() {
|
||||||
|
delete pInstance ;
|
||||||
|
pInstance = NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassSizeCheck() {} ;
|
||||||
|
~ClassSizeCheck() {} ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a type and the corresponding attributes
|
||||||
|
* @param type The name of the type.
|
||||||
|
* @param attr Pointer to the attributes.
|
||||||
|
*/
|
||||||
|
void add_diff( std::string type , ClassSizeDiffInfo diff_info ) {
|
||||||
|
name_to_diff.insert(std::pair<std::string,ClassSizeDiffInfo>(type,diff_info)) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints all the types that have a difference in size
|
||||||
|
*/
|
||||||
|
void print_nonzero_diffs() {
|
||||||
|
std::map<std::string, ClassSizeDiffInfo>::iterator it ;
|
||||||
|
for ( it = name_to_diff.begin() ; it != name_to_diff.end() ; it++ ) {
|
||||||
|
int curr_diff = it->second.diff ;
|
||||||
|
ATTRIBUTES * attr = Trick::AttributesMap::attributes_map()->get_attr(it->first) ;
|
||||||
|
unsigned int ii ;
|
||||||
|
for ( ii = 0 ; attr[ii].name[0] != '\0'; ii++ ) {
|
||||||
|
// Look for structured types that are not pointers
|
||||||
|
std::map<std::string, ClassSizeDiffInfo>::iterator search_it ;
|
||||||
|
if ( (attr[ii].type == TRICK_STRUCTURED) and
|
||||||
|
((attr[ii].num_index == 0) or (attr[ii].index[attr[ii].num_index-1].size != 0)) and
|
||||||
|
((search_it = name_to_diff.find(attr[ii].type_name)) != name_to_diff.end())
|
||||||
|
) {
|
||||||
|
int num = 1 ;
|
||||||
|
int jj ;
|
||||||
|
// Calculate total number of structs in the variable
|
||||||
|
for ( jj = 0 ; jj < attr[ii].num_index ; jj++ ) {
|
||||||
|
num *= attr[ii].index[jj].size ;
|
||||||
|
}
|
||||||
|
// Subtract the combined difference
|
||||||
|
curr_diff -= num * search_it->second.diff ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( curr_diff != 0 ) {
|
||||||
|
std::cerr << it->first << " ICG size and runtime size do not match" << std::endl ;
|
||||||
|
std::cerr << "Search for \"#ifndef TRICK_ICG\" within " << it->second.file_name << std::endl ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::map<std::string, ClassSizeDiffInfo> name_to_diff ;
|
||||||
|
static ClassSizeCheck * pInstance ;
|
||||||
|
|
||||||
|
} ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -88,6 +88,7 @@ sub gte (@) {
|
|||||||
$def{"TRICK_HOME"} = "$trick_home" ;
|
$def{"TRICK_HOME"} = "$trick_home" ;
|
||||||
$def{"TRICK_HOST_CPU_USER_SUFFIX"} = "" ;
|
$def{"TRICK_HOST_CPU_USER_SUFFIX"} = "" ;
|
||||||
$def{"TRICK_ICGFLAGS"} = "" ;
|
$def{"TRICK_ICGFLAGS"} = "" ;
|
||||||
|
$def{"TRICK_ICG_COMPAT15"} = "" ;
|
||||||
$def{"TRICK_ICG_NOCOMMENT"} = "" ;
|
$def{"TRICK_ICG_NOCOMMENT"} = "" ;
|
||||||
$def{"TRICK_ICG_EXCLUDE"} = "" ;
|
$def{"TRICK_ICG_EXCLUDE"} = "" ;
|
||||||
$def{"TRICK_SWIG_EXCLUDE"} = "" ;
|
$def{"TRICK_SWIG_EXCLUDE"} = "" ;
|
||||||
|
@ -52,6 +52,7 @@ PURPOSE:
|
|||||||
|
|
||||||
#include \"trick/attributes.h\"
|
#include \"trick/attributes.h\"
|
||||||
#include \"trick/populate_attribute_maps.hh\"
|
#include \"trick/populate_attribute_maps.hh\"
|
||||||
|
#include \"trick/ClassSizeCheck.hh\"
|
||||||
|
|
||||||
#include \"trick/SimObject.hh\"
|
#include \"trick/SimObject.hh\"
|
||||||
#include \"trick/JobData.hh\"
|
#include \"trick/JobData.hh\"
|
||||||
@ -178,6 +179,8 @@ PURPOSE:
|
|||||||
|
|
||||||
#---------------------------
|
#---------------------------
|
||||||
# Memory Init
|
# Memory Init
|
||||||
|
print S_SOURCE "Trick::ClassSizeCheck * Trick::ClassSizeCheck::pInstance = NULL ;\n" ;
|
||||||
|
|
||||||
print S_SOURCE "\n/* Memory Init */\n" ,
|
print S_SOURCE "\n/* Memory Init */\n" ,
|
||||||
"void memory_init( void ) {\n\n" ;
|
"void memory_init( void ) {\n\n" ;
|
||||||
|
|
||||||
@ -220,6 +223,8 @@ PURPOSE:
|
|||||||
print S_SOURCE $$sim_ref{create_connections} ;
|
print S_SOURCE $$sim_ref{create_connections} ;
|
||||||
|
|
||||||
print S_SOURCE "\n" ,
|
print S_SOURCE "\n" ,
|
||||||
|
" " x 4 , "Trick::ClassSizeCheck::class_size_check()->print_nonzero_diffs() ;\n" ,
|
||||||
|
" " x 4 , "Trick::ClassSizeCheck::reset_instance() ;\n" ,
|
||||||
" " x 4 , "return ;\n" ,
|
" " x 4 , "return ;\n" ,
|
||||||
"}\n\n" ;
|
"}\n\n" ;
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@ export TRICK_CXXFLAGS
|
|||||||
export TRICK_LDFLAGS
|
export TRICK_LDFLAGS
|
||||||
export TRICK_SFLAGS
|
export TRICK_SFLAGS
|
||||||
export TRICK_EXCLUDE
|
export TRICK_EXCLUDE
|
||||||
|
export TRICK_ICG_COMPAT15
|
||||||
export TRICK_ICG_EXCLUDE
|
export TRICK_ICG_EXCLUDE
|
||||||
export TRICK_ICG_NOCOMMENT
|
export TRICK_ICG_NOCOMMENT
|
||||||
export TRICK_SWIG_EXCLUDE
|
export TRICK_SWIG_EXCLUDE
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
extern llvm::cl::opt< bool > no_offset_of ;
|
extern llvm::cl::opt< bool > global_compat15 ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ClassValues::ClassValues() :
|
ClassValues::ClassValues() :
|
||||||
@ -16,7 +16,8 @@ ClassValues::ClassValues() :
|
|||||||
is_pod(false) ,
|
is_pod(false) ,
|
||||||
is_abstract(false) ,
|
is_abstract(false) ,
|
||||||
has_default_constructor(false) ,
|
has_default_constructor(false) ,
|
||||||
has_public_destructor(false)
|
has_public_destructor(false),
|
||||||
|
compat15(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
ClassValues::~ClassValues() {
|
ClassValues::~ClassValues() {
|
||||||
@ -30,7 +31,7 @@ void ClassValues::addFieldDescription(FieldDescription * in_fdes) {
|
|||||||
field_descripts.push_back(in_fdes) ;
|
field_descripts.push_back(in_fdes) ;
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
if ( no_offset_of ) {
|
if ( !global_compat15 and !compat15 ) {
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
@ -57,7 +58,7 @@ void ClassValues::addInheritedFieldDescriptions(std::vector<FieldDescription *>
|
|||||||
std::vector<FieldDescription *>::iterator fdit ;
|
std::vector<FieldDescription *>::iterator fdit ;
|
||||||
// Loop through the incoming inherited variable names
|
// Loop through the incoming inherited variable names
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
if ( no_offset_of ) {
|
if ( !global_compat15 and !compat15 ) {
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
@ -203,6 +204,14 @@ bool ClassValues::isPOD() {
|
|||||||
return is_pod ;
|
return is_pod ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClassValues::setSize(unsigned int in_size) {
|
||||||
|
size = in_size ;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int ClassValues::getSize() {
|
||||||
|
return size ;
|
||||||
|
}
|
||||||
|
|
||||||
void ClassValues::setAbstract(bool in_val) {
|
void ClassValues::setAbstract(bool in_val) {
|
||||||
is_abstract = in_val ;
|
is_abstract = in_val ;
|
||||||
}
|
}
|
||||||
@ -266,6 +275,14 @@ std::string ClassValues::getFullyQualifiedMangledTypeName() {
|
|||||||
return oss.str() ;
|
return oss.str() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClassValues::setCompat15(bool in_val) {
|
||||||
|
compat15 = in_val ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ClassValues::isCompat15() {
|
||||||
|
return compat15 ;
|
||||||
|
}
|
||||||
|
|
||||||
void ClassValues::print_namespaces(std::ostream & os, const char * delimiter) {
|
void ClassValues::print_namespaces(std::ostream & os, const char * delimiter) {
|
||||||
unsigned int ii ;
|
unsigned int ii ;
|
||||||
for ( ii = 0 ; ii < namespaces.size() ; ii++ ) {
|
for ( ii = 0 ; ii < namespaces.size() ; ii++ ) {
|
||||||
|
@ -68,6 +68,8 @@ class ClassValues : public ConstructValues {
|
|||||||
bool getHasInitAttrFriend() ;
|
bool getHasInitAttrFriend() ;
|
||||||
void setPOD(bool in_val) ;
|
void setPOD(bool in_val) ;
|
||||||
bool isPOD() ;
|
bool isPOD() ;
|
||||||
|
void setSize(unsigned int size) ;
|
||||||
|
unsigned int getSize() ;
|
||||||
void setAbstract(bool in_val) ;
|
void setAbstract(bool in_val) ;
|
||||||
bool isAbstract() ;
|
bool isAbstract() ;
|
||||||
void setHasDefaultConstructor(bool in_val) ;
|
void setHasDefaultConstructor(bool in_val) ;
|
||||||
@ -78,6 +80,8 @@ class ClassValues : public ConstructValues {
|
|||||||
void setMangledTypeName( std::string in_val ) ;
|
void setMangledTypeName( std::string in_val ) ;
|
||||||
std::string getMangledTypeName() ;
|
std::string getMangledTypeName() ;
|
||||||
std::string getFullyQualifiedMangledTypeName() ;
|
std::string getFullyQualifiedMangledTypeName() ;
|
||||||
|
void setCompat15(bool in_val) ;
|
||||||
|
bool isCompat15() ;
|
||||||
|
|
||||||
void print_namespaces(std::ostream & os, const char * delimiter) ;
|
void print_namespaces(std::ostream & os, const char * delimiter) ;
|
||||||
|
|
||||||
@ -102,6 +106,9 @@ class ClassValues : public ConstructValues {
|
|||||||
/** Is this class plain old data? */
|
/** Is this class plain old data? */
|
||||||
bool is_pod ;
|
bool is_pod ;
|
||||||
|
|
||||||
|
/** Size of class in bytes */
|
||||||
|
unsigned int size ;
|
||||||
|
|
||||||
/** Is this class abstract? */
|
/** Is this class abstract? */
|
||||||
bool is_abstract ;
|
bool is_abstract ;
|
||||||
|
|
||||||
@ -113,6 +120,10 @@ class ClassValues : public ConstructValues {
|
|||||||
|
|
||||||
/** Mangled type name. Templates will have a mangled_type_name. */
|
/** Mangled type name. Templates will have a mangled_type_name. */
|
||||||
std::string mangled_type_name ;
|
std::string mangled_type_name ;
|
||||||
|
|
||||||
|
/** Generate Trick 15 compatible io_src code */
|
||||||
|
bool compat15 ;
|
||||||
|
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -158,6 +158,8 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) {
|
|||||||
cs.hasICGNo(header_file_name) ) {
|
cs.hasICGNo(header_file_name) ) {
|
||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
|
cval.setCompat15(hsd.isPathInCompat15(rp)) ;
|
||||||
|
free(rp) ;
|
||||||
|
|
||||||
// If this class needs a default constructor, then the complier will generate one and we can call it.
|
// If this class needs a default constructor, then the complier will generate one and we can call it.
|
||||||
if ( rec->needsImplicitDefaultConstructor() ) {
|
if ( rec->needsImplicitDefaultConstructor() ) {
|
||||||
@ -183,6 +185,8 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) {
|
|||||||
cval.setName(rec->getNameAsString()) ;
|
cval.setName(rec->getNameAsString()) ;
|
||||||
cval.setPOD(rec->isPOD()) ;
|
cval.setPOD(rec->isPOD()) ;
|
||||||
|
|
||||||
|
cval.setSize(rec->getASTContext().getASTRecordLayout(rec).getSize().getQuantity()) ;
|
||||||
|
|
||||||
clang::CXXRecordDecl::base_class_iterator bcii ;
|
clang::CXXRecordDecl::base_class_iterator bcii ;
|
||||||
|
|
||||||
//std::cout << "parsing " << cval.getName() << std::endl ;
|
//std::cout << "parsing " << cval.getName() << std::endl ;
|
||||||
|
@ -139,12 +139,12 @@ void HeaderSearchDirs::AddTrickSearchDirs () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HeaderSearchDirs::AddICGExcludeDirs () {
|
void HeaderSearchDirs::AddDirsAndFiles(std::string env_var, std::vector<std::string> & var_list) {
|
||||||
|
|
||||||
char * trick_icg_exclude = getenv("TRICK_ICG_EXCLUDE") ;
|
char * env_var_contents = getenv(env_var.c_str()) ;
|
||||||
|
|
||||||
if( trick_icg_exclude != NULL ) {
|
if( env_var_contents != NULL ) {
|
||||||
std::string s = std::string(trick_icg_exclude) ;
|
std::string s = std::string(env_var_contents) ;
|
||||||
std::stringstream ss(s);
|
std::stringstream ss(s);
|
||||||
std::string item;
|
std::string item;
|
||||||
while(std::getline(ss, item, ':')) {
|
while(std::getline(ss, item, ':')) {
|
||||||
@ -155,84 +155,13 @@ void HeaderSearchDirs::AddICGExcludeDirs () {
|
|||||||
std::ifstream file_or_dir(resolved_path) ;
|
std::ifstream file_or_dir(resolved_path) ;
|
||||||
file_or_dir.seekg(0, std::ios::end) ;
|
file_or_dir.seekg(0, std::ios::end) ;
|
||||||
if ( !file_or_dir.good()) {
|
if ( !file_or_dir.good()) {
|
||||||
icg_exclude_dirs.push_back(std::string(resolved_path) + std::string("/"));
|
var_list.push_back(std::string(resolved_path) + std::string("/"));
|
||||||
} else {
|
} else {
|
||||||
icg_exclude_dirs.push_back(std::string(resolved_path));
|
var_list.push_back(std::string(resolved_path));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
std::cout << bold(color(WARNING, "Warning")) << " Cannot find TRICK_ICG_EXCLUDE directory " << quote(bold(item)) << std::endl ;
|
std::cout << bold(color(WARNING, "Warning")) << " Cannot find " <<
|
||||||
}
|
env_var << " directory " << quote(bold(item)) << std::endl ;
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void HeaderSearchDirs::AddExcludeDirs () {
|
|
||||||
|
|
||||||
char * trick_exclude = getenv("TRICK_EXCLUDE") ;
|
|
||||||
|
|
||||||
if( trick_exclude != NULL ) {
|
|
||||||
std::string s = std::string(trick_exclude) ;
|
|
||||||
std::stringstream ss(s);
|
|
||||||
std::string item;
|
|
||||||
while(std::getline(ss, item, ':')) {
|
|
||||||
item = trim(item) ;
|
|
||||||
if ( ! item.empty() ) {
|
|
||||||
char * resolved_path = realpath(item.c_str(), NULL) ;
|
|
||||||
if ( resolved_path ) {
|
|
||||||
std::ifstream file_or_dir(resolved_path) ;
|
|
||||||
file_or_dir.seekg(0, std::ios::end) ;
|
|
||||||
if ( !file_or_dir.good()) {
|
|
||||||
exclude_dirs.push_back(std::string(resolved_path) + std::string("/"));
|
|
||||||
} else {
|
|
||||||
exclude_dirs.push_back(std::string(resolved_path));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
std::cout << bold(color(WARNING, "Warning")) << " Cannot find TRICK_EXCLUDE directory " << quote(bold(item)) << std::endl ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void HeaderSearchDirs::AddExtLibDirs () {
|
|
||||||
|
|
||||||
char * trick_ext_lib_dirs = getenv("TRICK_EXT_LIB_DIRS") ;
|
|
||||||
|
|
||||||
if( trick_ext_lib_dirs != NULL ) {
|
|
||||||
std::string s = std::string(trick_ext_lib_dirs) ;
|
|
||||||
std::stringstream ss(s);
|
|
||||||
std::string item;
|
|
||||||
while(std::getline(ss, item, ':')) {
|
|
||||||
item = trim(item) ;
|
|
||||||
if ( ! item.empty() ) {
|
|
||||||
char * resolved_path = realpath(item.c_str(), NULL) ;
|
|
||||||
if ( resolved_path ) {
|
|
||||||
ext_lib_dirs.push_back(std::string(resolved_path) + std::string("/"));
|
|
||||||
} else {
|
|
||||||
std::cout << bold(color(WARNING, "Warning")) << " Cannot find TRICK_EXT_LIB_DIRS directory " << quote(bold(item)) << std::endl ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void HeaderSearchDirs::AddICGNoCommentDirs () {
|
|
||||||
|
|
||||||
char * trick_icg_nocomment = getenv("TRICK_ICG_NOCOMMENT") ;
|
|
||||||
|
|
||||||
if( trick_icg_nocomment != NULL ) {
|
|
||||||
std::string s = std::string(trick_icg_nocomment) ;
|
|
||||||
std::stringstream ss(s);
|
|
||||||
std::string item;
|
|
||||||
while(std::getline(ss, item, ':')) {
|
|
||||||
item = trim(item) ;
|
|
||||||
if ( ! item.empty() ) {
|
|
||||||
char * resolved_path = realpath(item.c_str(), NULL) ;
|
|
||||||
if ( resolved_path ) {
|
|
||||||
icg_nocomment_dirs.push_back(std::string(resolved_path) + std::string("/"));
|
|
||||||
} else {
|
|
||||||
std::cout << bold(color(WARNING, "Warning")) << " Cannot find TRICK_ICG_NOCOMMENT directory " << quote(bold(item)) << std::endl ;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -260,11 +189,22 @@ void HeaderSearchDirs::addSearchDirs ( std::vector<std::string> & include_dirs )
|
|||||||
AddUserSearchDirs( include_dirs ) ;
|
AddUserSearchDirs( include_dirs ) ;
|
||||||
AddTrickSearchDirs() ;
|
AddTrickSearchDirs() ;
|
||||||
AddCompilerBuiltInSearchDirs() ;
|
AddCompilerBuiltInSearchDirs() ;
|
||||||
AddExcludeDirs() ;
|
|
||||||
AddICGExcludeDirs() ;
|
|
||||||
AddExtLibDirs() ;
|
|
||||||
AddICGNoCommentDirs() ;
|
|
||||||
ApplyHeaderSearchOptions() ;
|
ApplyHeaderSearchOptions() ;
|
||||||
|
AddDirsAndFiles("TRICK_ICG_EXCLUDE", icg_exclude_dirs) ;
|
||||||
|
AddDirsAndFiles("TRICK_EXCLUDE", exclude_dirs) ;
|
||||||
|
AddDirsAndFiles("TRICK_EXT_LIB_DIRS", ext_lib_dirs) ;
|
||||||
|
AddDirsAndFiles("TRICK_ICG_NOCOMMENT", icg_nocomment_dirs) ;
|
||||||
|
|
||||||
|
char * compat15_contents = getenv("TRICK_ICG_COMPAT15") ;
|
||||||
|
if ( compat15_contents != NULL ) {
|
||||||
|
std::string s(compat15_contents) ;
|
||||||
|
if ( s.length() > 0 ) {
|
||||||
|
s += std::string(":./S_source.hh") ;
|
||||||
|
setenv("TRICK_ICG_COMPAT15",s.c_str(),1) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AddDirsAndFiles("TRICK_ICG_COMPAT15", compat15_dirs) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HeaderSearchDirs::isPathInUserDir (const std::string& in_dir ) {
|
bool HeaderSearchDirs::isPathInUserDir (const std::string& in_dir ) {
|
||||||
@ -357,6 +297,18 @@ bool HeaderSearchDirs::isPathInICGNoComment (const std::string& in_file ) {
|
|||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HeaderSearchDirs::isPathInCompat15 (const std::string& in_dir ) {
|
||||||
|
|
||||||
|
std::vector<std::string>::iterator vit ;
|
||||||
|
for ( vit = compat15_dirs.begin() ; vit != compat15_dirs.end() ; vit++ ) {
|
||||||
|
if ( ! in_dir.compare(0, (*vit).size(), (*vit))) {
|
||||||
|
return true ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
|
||||||
std::string HeaderSearchDirs::getPathInExclude (const std::string& in_dir ) {
|
std::string HeaderSearchDirs::getPathInExclude (const std::string& in_dir ) {
|
||||||
|
|
||||||
std::vector<std::string>::iterator vit ;
|
std::vector<std::string>::iterator vit ;
|
||||||
|
@ -75,6 +75,13 @@ class HeaderSearchDirs {
|
|||||||
*/
|
*/
|
||||||
bool isPathInICGNoComment (const std::string& path) ;
|
bool isPathInICGNoComment (const std::string& path) ;
|
||||||
|
|
||||||
|
/** Returns true if directory is a subdirectory of a compatible 15 directory
|
||||||
|
in the TRICK_ICG_COMPAT15 environment variable.
|
||||||
|
@param path = directory path to be checked
|
||||||
|
@return true = path is in a system directory, false = not in system directory.
|
||||||
|
*/
|
||||||
|
bool isPathInCompat15 (const std::string& path) ;
|
||||||
|
|
||||||
/** Returns the TRICK_EXCLUDE directory that contains the path argument.
|
/** Returns the TRICK_EXCLUDE directory that contains the path argument.
|
||||||
@param path = path to be checked
|
@param path = path to be checked
|
||||||
@return string from TRICK_EXCLUDE that contains the path.
|
@return string from TRICK_EXCLUDE that contains the path.
|
||||||
@ -126,17 +133,8 @@ class HeaderSearchDirs {
|
|||||||
/** Adds ${TRICK_HOME}/trick_source to the search directories */
|
/** Adds ${TRICK_HOME}/trick_source to the search directories */
|
||||||
void AddTrickSearchDirs () ;
|
void AddTrickSearchDirs () ;
|
||||||
|
|
||||||
/** Create list of EXCLUDE directories */
|
/** Create list of directories */
|
||||||
void AddExcludeDirs () ;
|
void AddDirsAndFiles(std::string env_var, std::vector<std::string> & var_list ) ;
|
||||||
|
|
||||||
/** Create list of ICG_EXCLUDE directories */
|
|
||||||
void AddICGExcludeDirs () ;
|
|
||||||
|
|
||||||
/** Create list of EXT_LIB_DIRS directories */
|
|
||||||
void AddExtLibDirs () ;
|
|
||||||
|
|
||||||
/** Create list of ICG_NOCOMMENT directories */
|
|
||||||
void AddICGNoCommentDirs () ;
|
|
||||||
|
|
||||||
/** Apply all search directories to the preprocessor. */
|
/** Apply all search directories to the preprocessor. */
|
||||||
void ApplyHeaderSearchOptions () ;
|
void ApplyHeaderSearchOptions () ;
|
||||||
@ -153,6 +151,9 @@ class HeaderSearchDirs {
|
|||||||
/** List of directoris to exclude comments from the TRICK_ICG_NOCOMMENT environment variable */
|
/** List of directoris to exclude comments from the TRICK_ICG_NOCOMMENT environment variable */
|
||||||
std::vector<std::string> icg_nocomment_dirs ;
|
std::vector<std::string> icg_nocomment_dirs ;
|
||||||
|
|
||||||
|
/** List of directoris to write offsetof lines compatible with Trick 15 and earlier */
|
||||||
|
std::vector<std::string> compat15_dirs ;
|
||||||
|
|
||||||
/** Map of file names to in icg_nocomment_dir used as a cache */
|
/** Map of file names to in icg_nocomment_dir used as a cache */
|
||||||
std::map< std::string , bool > icg_nocomment_files ;
|
std::map< std::string , bool > icg_nocomment_files ;
|
||||||
} ;
|
} ;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "EnumValues.hh"
|
#include "EnumValues.hh"
|
||||||
#include "Utilities.hh"
|
#include "Utilities.hh"
|
||||||
|
|
||||||
extern llvm::cl::opt< bool > no_offset_of ;
|
extern llvm::cl::opt< bool > global_compat15 ;
|
||||||
|
|
||||||
PrintFileContents10::PrintFileContents10() {}
|
PrintFileContents10::PrintFileContents10() {}
|
||||||
|
|
||||||
@ -35,6 +35,7 @@ void PrintFileContents10::printIOHeader(std::ostream & ostream , std::string hea
|
|||||||
"#include \"trick/MemoryManager.hh\"\n"
|
"#include \"trick/MemoryManager.hh\"\n"
|
||||||
"#include \"trick/attributes.h\"\n"
|
"#include \"trick/attributes.h\"\n"
|
||||||
"#include \"trick/parameter_types.h\"\n"
|
"#include \"trick/parameter_types.h\"\n"
|
||||||
|
"#include \"trick/ClassSizeCheck.hh\"\n"
|
||||||
"#include \"trick/UnitsMap.hh\"\n"
|
"#include \"trick/UnitsMap.hh\"\n"
|
||||||
"#include \"trick/checkpoint_stl.hh\"\n"
|
"#include \"trick/checkpoint_stl.hh\"\n"
|
||||||
"#include \"" << header_file_name << "\"\n"
|
"#include \"" << header_file_name << "\"\n"
|
||||||
@ -149,17 +150,7 @@ void PrintFileContents10::print_field_init_attr_stmts( std::ostream & ostream ,
|
|||||||
ClassValues * cv , unsigned int index ) {
|
ClassValues * cv , unsigned int index ) {
|
||||||
|
|
||||||
// For static variables replace the offset field with the address of the static variable
|
// For static variables replace the offset field with the address of the static variable
|
||||||
if ( no_offset_of ) {
|
if ( global_compat15 or cv->isCompat15()) {
|
||||||
if ( fdes->isStatic() ) {
|
|
||||||
ostream << " attr" ;
|
|
||||||
printNamespaces( ostream, cv , "__" ) ;
|
|
||||||
printContainerClasses( ostream, cv , "__" ) ;
|
|
||||||
ostream << cv->getMangledTypeName() << "[" << index << "].offset = (long)(void *)&" ;
|
|
||||||
printNamespaces( ostream, cv , "::" ) ;
|
|
||||||
printContainerClasses( ostream, cv , "::" ) ;
|
|
||||||
ostream << cv->getName() << "::" << fdes->getName() << " ;\n" ;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ( fdes->isStatic() ) {
|
if ( fdes->isStatic() ) {
|
||||||
// print a special offsetof statement if this is a static
|
// print a special offsetof statement if this is a static
|
||||||
ostream << " attr" ;
|
ostream << " attr" ;
|
||||||
@ -206,6 +197,16 @@ void PrintFileContents10::print_field_init_attr_stmts( std::ostream & ostream ,
|
|||||||
printContainerClasses( ostream, cv , "::" ) ;
|
printContainerClasses( ostream, cv , "::" ) ;
|
||||||
ostream << cv->getMangledTypeName() << "," << fdes->getName() << ") ;\n" ;
|
ostream << cv->getMangledTypeName() << "," << fdes->getName() << ") ;\n" ;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if ( fdes->isStatic() ) {
|
||||||
|
ostream << " attr" ;
|
||||||
|
printNamespaces( ostream, cv , "__" ) ;
|
||||||
|
printContainerClasses( ostream, cv , "__" ) ;
|
||||||
|
ostream << cv->getMangledTypeName() << "[" << index << "].offset = (long)(void *)&" ;
|
||||||
|
printNamespaces( ostream, cv , "::" ) ;
|
||||||
|
printContainerClasses( ostream, cv , "::" ) ;
|
||||||
|
ostream << cv->getName() << "::" << fdes->getName() << " ;\n" ;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( fdes->isSTL()) {
|
if ( fdes->isSTL()) {
|
||||||
@ -299,6 +300,21 @@ void PrintFileContents10::print_init_attr_func( std::ostream & ostream , ClassVa
|
|||||||
ostream << " typedef " << cv->getName() << " " << cv->getMangledTypeName() << " ;\n\n" ;
|
ostream << " typedef " << cv->getName() << " " << cv->getMangledTypeName() << " ;\n\n" ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( !global_compat15 and !cv->isCompat15()) {
|
||||||
|
ostream << " if ( sizeof(" ;
|
||||||
|
printNamespaces( ostream, cv , "::" ) ;
|
||||||
|
printContainerClasses( ostream, cv , "::" ) ;
|
||||||
|
ostream << cv->getName() << ") > " << cv->getSize() << ") {\n" ;
|
||||||
|
ostream << " Trick::ClassSizeCheck::class_size_check()->add_diff(\"" ;
|
||||||
|
printNamespaces( ostream, cv , "::" ) ;
|
||||||
|
printContainerClasses( ostream, cv , "::" ) ;
|
||||||
|
ostream << cv->getName() << "\" , Trick::ClassSizeDiffInfo((sizeof(" ;
|
||||||
|
printNamespaces( ostream, cv , "::" ) ;
|
||||||
|
printContainerClasses( ostream, cv , "::" ) ;
|
||||||
|
ostream << cv->getName() << ") - " << cv->getSize() << ") , \"" << cv->getFileName() << "\")) ;\n" ;
|
||||||
|
ostream << " }\n" ;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int ii = 0 ;
|
unsigned int ii = 0 ;
|
||||||
for ( fit = cv->field_begin() ; fit != cv->field_end() ; fit++ ) {
|
for ( fit = cv->field_begin() ; fit != cv->field_end() ; fit++ ) {
|
||||||
if ( determinePrintAttr(cv , *fit) ) {
|
if ( determinePrintAttr(cv , *fit) ) {
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include "ClassValues.hh"
|
#include "ClassValues.hh"
|
||||||
#include "EnumValues.hh"
|
#include "EnumValues.hh"
|
||||||
|
|
||||||
extern llvm::cl::opt< bool > no_offset_of ;
|
extern llvm::cl::opt< bool > global_compat15 ;
|
||||||
|
|
||||||
PrintFileContentsBase::PrintFileContentsBase() {}
|
PrintFileContentsBase::PrintFileContentsBase() {}
|
||||||
|
|
||||||
@ -77,7 +77,15 @@ void PrintFileContentsBase::print_close_extern_c(std::ostream & ostream) {
|
|||||||
*/
|
*/
|
||||||
bool PrintFileContentsBase::determinePrintAttr( ClassValues * c , FieldDescription * fdes ) {
|
bool PrintFileContentsBase::determinePrintAttr( ClassValues * c , FieldDescription * fdes ) {
|
||||||
if ( fdes->getTypeName().compare("void") and fdes->getIO() != 0 and fdes->getEnumString().compare("TRICK_VOID")) {
|
if ( fdes->getTypeName().compare("void") and fdes->getIO() != 0 and fdes->getEnumString().compare("TRICK_VOID")) {
|
||||||
if ( no_offset_of ) {
|
if ( global_compat15 or c->isCompat15()) {
|
||||||
|
if ( fdes->isInherited() ) {
|
||||||
|
return ((c->getHasInitAttrFriend() && fdes->getAccess() == clang::AS_protected)
|
||||||
|
|| (fdes->getAccess() == clang::AS_public)) ;
|
||||||
|
} else {
|
||||||
|
return (c->getHasInitAttrFriend()
|
||||||
|
|| (fdes->getAccess() == clang::AS_public)) ;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if ( fdes->isStatic() ) {
|
if ( fdes->isStatic() ) {
|
||||||
if ( fdes->isInherited() ) {
|
if ( fdes->isInherited() ) {
|
||||||
return ((c->getHasInitAttrFriend() && fdes->getAccess() == clang::AS_protected)
|
return ((c->getHasInitAttrFriend() && fdes->getAccess() == clang::AS_protected)
|
||||||
@ -89,14 +97,7 @@ bool PrintFileContentsBase::determinePrintAttr( ClassValues * c , FieldDescripti
|
|||||||
} else {
|
} else {
|
||||||
return true ;
|
return true ;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if ( fdes->isInherited() ) {
|
|
||||||
return ((c->getHasInitAttrFriend() && fdes->getAccess() == clang::AS_protected)
|
|
||||||
|| (fdes->getAccess() == clang::AS_public)) ;
|
|
||||||
} else {
|
|
||||||
return (c->getHasInitAttrFriend()
|
|
||||||
|| (fdes->getAccess() == clang::AS_public)) ;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false ;
|
return false ;
|
||||||
|
@ -44,10 +44,8 @@ llvm::cl::list< std::string > sink(llvm::cl::Sink, llvm::cl::ZeroOrMore) ;
|
|||||||
llvm::cl::list< std::string > pre_compiled_headers("include", llvm::cl::Prefix, llvm::cl::desc("pre-compiled headers"),
|
llvm::cl::list< std::string > pre_compiled_headers("include", llvm::cl::Prefix, llvm::cl::desc("pre-compiled headers"),
|
||||||
llvm::cl::value_desc("pre_compiled_headers")) ;
|
llvm::cl::value_desc("pre_compiled_headers")) ;
|
||||||
|
|
||||||
llvm::cl::opt< bool > no_offset_of ("n", llvm::cl::desc("Do not print the offsetof calculations in attributes")) ;
|
llvm::cl::opt< bool > global_compat15 ("c", llvm::cl::desc("Print the offsetof calculations in attributes")) ;
|
||||||
llvm::cl::alias no_offset_of_alias ("no-offset-of" , llvm::cl::desc("Alias for -n") , llvm::cl::aliasopt(no_offset_of)) ;
|
llvm::cl::alias compat15_alias ("compat15" , llvm::cl::desc("Alias for -c") , llvm::cl::aliasopt(global_compat15)) ;
|
||||||
|
|
||||||
//llvm::cl::opt< bool > show_units ("u", llvm::cl::desc("List recognized units")) ;
|
|
||||||
|
|
||||||
void ICG_version() {
|
void ICG_version() {
|
||||||
std::cout << "Trick Interface Code Generator (trick-ICG) " << TRICK_VERSION << std::endl ;
|
std::cout << "Trick Interface Code Generator (trick-ICG) " << TRICK_VERSION << std::endl ;
|
||||||
|
Loading…
Reference in New Issue
Block a user