mirror of
https://github.com/nasa/trick.git
synced 2025-01-21 12:05:13 +00:00
Detect when TRICK_ICG is used in header files and compensate for it. #375
So the previous commit broke on the mac. There were missing changes in TranslationUnitVisitor.cpp. Also there are fixes for clang 3.9 that were not included yet.
This commit is contained in:
parent
bc9102c208
commit
cb58e0c770
@ -61,7 +61,7 @@ bool CXXRecordVisitor::TraverseDecl(clang::Decl *d) {
|
||||
process embedded classes that have public access. */
|
||||
clang::RecordDecl * rd = crd->getDefinition() ;
|
||||
if ( rd != NULL and rd->getAccess() == clang::AS_public ) {
|
||||
if ( isInUserCode(ci , crd->getRBraceLoc(), hsd) ) {
|
||||
if ( isInUserCode(ci , crd->getSourceRange().getEnd(), hsd) ) {
|
||||
CXXRecordVisitor embedded_cvis(ci , cs, hsd , pa, false, false, true) ;
|
||||
embedded_cvis.TraverseCXXRecordDecl(static_cast<clang::CXXRecordDecl *>(d)) ;
|
||||
pa.printClass(embedded_cvis.get_class_data()) ;
|
||||
@ -149,7 +149,7 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) {
|
||||
cval.setHasPublicDestructor(true) ;
|
||||
}
|
||||
|
||||
std::string file_name = getFileName(ci , rec->getRBraceLoc(), hsd) ;
|
||||
std::string file_name = getFileName(ci , rec->getSourceRange().getEnd(), hsd) ;
|
||||
char * rp = almostRealPath(file_name.c_str()) ;
|
||||
if ( rp == NULL ) {
|
||||
return false ;
|
||||
@ -178,13 +178,13 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) {
|
||||
clang::RecordDecl * rd = rt->getDecl() ;
|
||||
//std::cout << " [34m" << cval.getName() << " inherits from " << rd->getNameAsString() << "[00m" << std::endl ;
|
||||
//rd->dump() ; std::cout << std::endl ;
|
||||
if ( isInUserOrTrickCode(ci , rd->getRBraceLoc(), hsd) ) {
|
||||
if ( isInUserOrTrickCode(ci , rd->getSourceRange().getEnd(), hsd) ) {
|
||||
const clang::ASTRecordLayout &record_layout = rec->getASTContext().getASTRecordLayout(rec);
|
||||
unsigned int inherit_class_offset ;
|
||||
|
||||
inherit_class_offset = record_layout.getBaseClassOffset(llvm::cast<clang::CXXRecordDecl>(rd)).getQuantity() ;
|
||||
//std::cout << " [34minherit_class_offset = " << inherit_class_offset << "[00m" << std::endl ;
|
||||
//std::cout << " [34m" << getFileName(ci , rd->getRBraceLoc(), hsd) << "[00m" << std::endl ;
|
||||
//std::cout << " [34m" << getFileName(ci , rd->getSourceRange().getEnd(), hsd) << "[00m" << std::endl ;
|
||||
CXXRecordVisitor inherit_cvis(ci , cs, hsd , pa, true, bcii->isVirtual(), false, inherit_class_offset) ;
|
||||
inherit_cvis.TraverseCXXRecordDecl(static_cast<clang::CXXRecordDecl *>(rd)) ;
|
||||
cval.addInheritedFieldDescriptions(inherit_cvis.get_class_data()->getFieldDescription()) ;
|
||||
@ -220,7 +220,7 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) {
|
||||
clang::RecordDecl * rd = rt->getDecl() ;
|
||||
//std::cout << " [34m" << cval.getName() << " virtually inherits from " << rd->getNameAsString() << "[00m" << std::endl ;
|
||||
//rd->dump() ; std::cout << std::endl ;
|
||||
if ( isInUserOrTrickCode(ci , rd->getRBraceLoc(), hsd) ) {
|
||||
if ( isInUserOrTrickCode(ci , rd->getSourceRange().getEnd(), hsd) ) {
|
||||
const clang::ASTRecordLayout &record_layout = rec->getASTContext().getASTRecordLayout(rec);
|
||||
unsigned int inherit_class_offset ;
|
||||
|
||||
@ -229,7 +229,7 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) {
|
||||
inherit_class_offset = record_layout.getVBaseClassOffset(llvm::cast<clang::CXXRecordDecl>(rd)).getQuantity() ;
|
||||
|
||||
//std::cout << " [34minherit_class_offset = " << inherit_class_offset << "[00m" << std::endl ;
|
||||
//std::cout << " [34m" << getFileName(ci , rd->getRBraceLoc(), hsd) << "[00m" << std::endl ;
|
||||
//std::cout << " [34m" << getFileName(ci , rd->getSourceRange().getEnd(), hsd) << "[00m" << std::endl ;
|
||||
CXXRecordVisitor inherit_cvis(ci , cs, hsd , pa, true, bcii->isVirtual(), false, inherit_class_offset) ;
|
||||
inherit_cvis.TraverseCXXRecordDecl(static_cast<clang::CXXRecordDecl *>(rd)) ;
|
||||
cval.addInheritedFieldDescriptions(inherit_cvis.get_class_data()->getFieldDescription()) ;
|
||||
|
@ -26,7 +26,7 @@ bool EnumVisitor::VisitType(clang::Type *t) {
|
||||
}
|
||||
|
||||
bool EnumVisitor::VisitEnumDecl(clang::EnumDecl *ed) {
|
||||
eval.setFileName(getFileName(ci , ed->getRBraceLoc(), hsd)) ;
|
||||
eval.setFileName(getFileName(ci , ed->getSourceRange().getEnd(), hsd)) ;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -46,29 +46,33 @@ bool TranslationUnitVisitor::TraverseDecl(clang::Decl *d) {
|
||||
In this case the CXXRecordDecl file name will not match the current file name, and is
|
||||
in fact empty */
|
||||
clang::RecordDecl * rd = crd->getDefinition() ;
|
||||
if ( rd != NULL and ! getFileName(ci , crd->getRBraceLoc(), hsd).empty() ) {
|
||||
//crd->dump() ; std::cout << std::endl ;
|
||||
if ( isInUserCode(ci , crd->getRBraceLoc(), hsd) ) {
|
||||
CXXRecordVisitor cvis(ci , cs, hsd , pa, false, false, true) ;
|
||||
if ( rd != NULL ) {
|
||||
std::string rd_file = getFileName(ci , rd->getSourceRange().getEnd(), hsd) ;
|
||||
std::string crd_file = getFileName(ci , crd->getSourceRange().getEnd(), hsd) ;
|
||||
if (!crd_file.empty() and !crd_file.compare(rd_file)) {
|
||||
//crd->dump() ; std::cout << std::endl ;
|
||||
if ( isInUserCode(ci , crd->getSourceRange().getEnd(), hsd) ) {
|
||||
CXXRecordVisitor cvis(ci , cs, hsd , pa, false, false, true) ;
|
||||
|
||||
cvis.TraverseCXXRecordDecl(static_cast<clang::CXXRecordDecl *>(d)) ;
|
||||
pa.printClass(cvis.get_class_data()) ;
|
||||
cvis.TraverseCXXRecordDecl(static_cast<clang::CXXRecordDecl *>(d)) ;
|
||||
pa.printClass(cvis.get_class_data()) ;
|
||||
|
||||
/* Check to see if the struct/class is forward declared in the same file.
|
||||
If it is, then remove the notation that it is forward declared. This
|
||||
is to allow C structs to be forward declared and typedeffed and io_src
|
||||
code will be generated for both the original structure name and typedeffed
|
||||
name.
|
||||
/* Check to see if the struct/class is forward declared in the same file.
|
||||
If it is, then remove the notation that it is forward declared. This
|
||||
is to allow C structs to be forward declared and typedeffed and io_src
|
||||
code will be generated for both the original structure name and typedeffed
|
||||
name.
|
||||
|
||||
struct Astruct ;
|
||||
typedef struct Astruct {} Bstruct ;
|
||||
*/
|
||||
std::set< std::string >::iterator it ;
|
||||
std::string file_name = getFileName(ci , d->getLocEnd(), hsd) ;
|
||||
std::string source_type = cvis.get_class_data()->getName() ;
|
||||
it = fwd_declared_classes[file_name].find(source_type) ;
|
||||
if ( it != fwd_declared_classes[file_name].end() ) {
|
||||
fwd_declared_classes[file_name].erase(it) ;
|
||||
struct Astruct ;
|
||||
typedef struct Astruct {} Bstruct ;
|
||||
*/
|
||||
std::set< std::string >::iterator it ;
|
||||
std::string file_name = getFileName(ci , d->getLocEnd(), hsd) ;
|
||||
std::string source_type = cvis.get_class_data()->getName() ;
|
||||
it = fwd_declared_classes[file_name].find(source_type) ;
|
||||
if ( it != fwd_declared_classes[file_name].end() ) {
|
||||
fwd_declared_classes[file_name].erase(it) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -81,7 +85,7 @@ bool TranslationUnitVisitor::TraverseDecl(clang::Decl *d) {
|
||||
break ;
|
||||
case clang::Decl::Enum : {
|
||||
clang::EnumDecl * ed = static_cast<clang::EnumDecl *>(d) ;
|
||||
if ( isInUserCode(ci , ed->getRBraceLoc(), hsd) ) {
|
||||
if ( isInUserCode(ci , ed->getSourceRange().getEnd(), hsd) ) {
|
||||
EnumVisitor evis(ci, hsd) ;
|
||||
evis.TraverseDecl(ed) ;
|
||||
//if ( evis.get_enum_data() != NULL ) {
|
||||
|
@ -100,6 +100,9 @@ int main( int argc , char * argv[] ) {
|
||||
ci.createFileManager();
|
||||
ci.createSourceManager(ci.getFileManager());
|
||||
|
||||
clang::PreprocessorOptions & ppo = ci.getPreprocessorOpts() ;
|
||||
ppo.UsePredefines = true;
|
||||
|
||||
#if (LIBCLANG_MAJOR > 3) || ((LIBCLANG_MAJOR == 3) && (LIBCLANG_MINOR >= 5))
|
||||
clang::TargetOptions to;
|
||||
to.Triple = llvm::sys::getDefaultTargetTriple();
|
||||
|
@ -50,6 +50,7 @@ endif
|
||||
endif
|
||||
|
||||
ifeq ($(TRICK_HOST_TYPE),Darwin)
|
||||
CXXFLAGS += -std=c++11
|
||||
CLANGLIBS += $(shell $(LLVM_HOME)/bin/llvm-config --libs)
|
||||
CLANGLIBS += $(shell $(LLVM_HOME)/bin/llvm-config --system-libs)
|
||||
CLANGLIBS += -lc++abi
|
||||
|
Loading…
Reference in New Issue
Block a user