From 70b5bcd1abac2d88f885e48e19452265de8fd88c Mon Sep 17 00:00:00 2001 From: Alex Lin Date: Mon, 23 Jan 2017 17:41:19 -0600 Subject: [PATCH] Forward-declared classes aren't fully populated in S_sie.resource #378 I chose the wrong call when trying to support clang 3.9 and it's removal of getRBraceLoc. The best equivalent call in 3.9 is getBraceRange().getEnd(). --- .../codegen/Interface_Code_Gen/BraceMacro.hh | 10 ++++++++++ .../codegen/Interface_Code_Gen/ClassVisitor.cpp | 13 +++++++------ .../codegen/Interface_Code_Gen/EnumVisitor.cpp | 3 ++- .../Interface_Code_Gen/TranslationUnitVisitor.cpp | 9 +++++---- 4 files changed, 24 insertions(+), 11 deletions(-) create mode 100644 trick_source/codegen/Interface_Code_Gen/BraceMacro.hh diff --git a/trick_source/codegen/Interface_Code_Gen/BraceMacro.hh b/trick_source/codegen/Interface_Code_Gen/BraceMacro.hh new file mode 100644 index 00000000..c533151a --- /dev/null +++ b/trick_source/codegen/Interface_Code_Gen/BraceMacro.hh @@ -0,0 +1,10 @@ +#ifndef BRACEMACRO_HH +#define BRACEMACRO_HH + +#if (LIBCLANG_MAJOR > 3) || ((LIBCLANG_MAJOR == 3) && (LIBCLANG_MINOR >= 9)) +#define RBRACELOC getBraceRange().getEnd +#else +#define RBRACELOC getRBraceLoc +#endif + +#endif diff --git a/trick_source/codegen/Interface_Code_Gen/ClassVisitor.cpp b/trick_source/codegen/Interface_Code_Gen/ClassVisitor.cpp index c0592725..fd8140a8 100644 --- a/trick_source/codegen/Interface_Code_Gen/ClassVisitor.cpp +++ b/trick_source/codegen/Interface_Code_Gen/ClassVisitor.cpp @@ -14,6 +14,7 @@ #include "FieldVisitor.hh" #include "Utilities.hh" #include "PrintAttributes.hh" +#include "BraceMacro.hh" extern llvm::cl::opt< int > debug_level ; @@ -61,7 +62,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->getSourceRange().getEnd(), hsd) ) { + if ( isInUserCode(ci , crd->RBRACELOC(), hsd) ) { CXXRecordVisitor embedded_cvis(ci , cs, hsd , pa, false, false, true) ; embedded_cvis.TraverseCXXRecordDecl(static_cast(d)) ; pa.printClass(embedded_cvis.get_class_data()) ; @@ -149,7 +150,7 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) { cval.setHasPublicDestructor(true) ; } - std::string file_name = getFileName(ci , rec->getSourceRange().getEnd(), hsd) ; + std::string file_name = getFileName(ci , rec->RBRACELOC(), hsd) ; char * rp = almostRealPath(file_name.c_str()) ; if ( rp == NULL ) { return false ; @@ -178,13 +179,13 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) { clang::RecordDecl * rd = rt->getDecl() ; //std::cout << " " << cval.getName() << " inherits from " << rd->getNameAsString() << "" << std::endl ; //rd->dump() ; std::cout << std::endl ; - if ( isInUserOrTrickCode(ci , rd->getSourceRange().getEnd(), hsd) ) { + if ( isInUserOrTrickCode(ci , rd->RBRACELOC(), hsd) ) { const clang::ASTRecordLayout &record_layout = rec->getASTContext().getASTRecordLayout(rec); unsigned int inherit_class_offset ; inherit_class_offset = record_layout.getBaseClassOffset(llvm::cast(rd)).getQuantity() ; //std::cout << " inherit_class_offset = " << inherit_class_offset << "" << std::endl ; - //std::cout << " " << getFileName(ci , rd->getSourceRange().getEnd(), hsd) << "" << std::endl ; + //std::cout << " " << getFileName(ci , rd->RBRACELOC(), hsd) << "" << std::endl ; CXXRecordVisitor inherit_cvis(ci , cs, hsd , pa, true, bcii->isVirtual(), false, inherit_class_offset) ; inherit_cvis.TraverseCXXRecordDecl(static_cast(rd)) ; cval.addInheritedFieldDescriptions(inherit_cvis.get_class_data()->getFieldDescription()) ; @@ -220,7 +221,7 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) { clang::RecordDecl * rd = rt->getDecl() ; //std::cout << " " << cval.getName() << " virtually inherits from " << rd->getNameAsString() << "" << std::endl ; //rd->dump() ; std::cout << std::endl ; - if ( isInUserOrTrickCode(ci , rd->getSourceRange().getEnd(), hsd) ) { + if ( isInUserOrTrickCode(ci , rd->RBRACELOC(), hsd) ) { const clang::ASTRecordLayout &record_layout = rec->getASTContext().getASTRecordLayout(rec); unsigned int inherit_class_offset ; @@ -229,7 +230,7 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) { inherit_class_offset = record_layout.getVBaseClassOffset(llvm::cast(rd)).getQuantity() ; //std::cout << " inherit_class_offset = " << inherit_class_offset << "" << std::endl ; - //std::cout << " " << getFileName(ci , rd->getSourceRange().getEnd(), hsd) << "" << std::endl ; + //std::cout << " " << getFileName(ci , rd->RBRACELOC(), hsd) << "" << std::endl ; CXXRecordVisitor inherit_cvis(ci , cs, hsd , pa, true, bcii->isVirtual(), false, inherit_class_offset) ; inherit_cvis.TraverseCXXRecordDecl(static_cast(rd)) ; cval.addInheritedFieldDescriptions(inherit_cvis.get_class_data()->getFieldDescription()) ; diff --git a/trick_source/codegen/Interface_Code_Gen/EnumVisitor.cpp b/trick_source/codegen/Interface_Code_Gen/EnumVisitor.cpp index 31c3edc2..0028e9a5 100644 --- a/trick_source/codegen/Interface_Code_Gen/EnumVisitor.cpp +++ b/trick_source/codegen/Interface_Code_Gen/EnumVisitor.cpp @@ -7,6 +7,7 @@ #include "EnumVisitor.hh" #include "EnumValues.hh" #include "Utilities.hh" +#include "BraceMacro.hh" extern llvm::cl::opt< int > debug_level ; @@ -26,7 +27,7 @@ bool EnumVisitor::VisitType(clang::Type *t) { } bool EnumVisitor::VisitEnumDecl(clang::EnumDecl *ed) { - eval.setFileName(getFileName(ci , ed->getSourceRange().getEnd(), hsd)) ; + eval.setFileName(getFileName(ci , ed->RBRACELOC(), hsd)) ; return true; } diff --git a/trick_source/codegen/Interface_Code_Gen/TranslationUnitVisitor.cpp b/trick_source/codegen/Interface_Code_Gen/TranslationUnitVisitor.cpp index f7093cc7..6754d592 100644 --- a/trick_source/codegen/Interface_Code_Gen/TranslationUnitVisitor.cpp +++ b/trick_source/codegen/Interface_Code_Gen/TranslationUnitVisitor.cpp @@ -18,6 +18,7 @@ #include "VariableVisitor.hh" #include "Utilities.hh" #include "PrintAttributes.hh" +#include "BraceMacro.hh" TranslationUnitVisitor::TranslationUnitVisitor(clang::CompilerInstance & in_ci , HeaderSearchDirs & in_hsd , CommentSaver & in_cs , PrintAttributes & in_pa ) : @@ -47,11 +48,11 @@ bool TranslationUnitVisitor::TraverseDecl(clang::Decl *d) { in fact empty */ clang::RecordDecl * rd = crd->getDefinition() ; if ( rd != NULL ) { - std::string rd_file = getFileName(ci , rd->getSourceRange().getEnd(), hsd) ; - std::string crd_file = getFileName(ci , crd->getSourceRange().getEnd(), hsd) ; + std::string rd_file = getFileName(ci , rd->RBRACELOC(), hsd) ; + std::string crd_file = getFileName(ci , crd->RBRACELOC(), hsd) ; if (!crd_file.empty() and !crd_file.compare(rd_file)) { //crd->dump() ; std::cout << std::endl ; - if ( isInUserCode(ci , crd->getSourceRange().getEnd(), hsd) ) { + if ( isInUserCode(ci , crd->RBRACELOC(), hsd) ) { CXXRecordVisitor cvis(ci , cs, hsd , pa, false, false, true) ; cvis.TraverseCXXRecordDecl(static_cast(d)) ; @@ -85,7 +86,7 @@ bool TranslationUnitVisitor::TraverseDecl(clang::Decl *d) { break ; case clang::Decl::Enum : { clang::EnumDecl * ed = static_cast(d) ; - if ( isInUserCode(ci , ed->getSourceRange().getEnd(), hsd) ) { + if ( isInUserCode(ci , ed->RBRACELOC(), hsd) ) { EnumVisitor evis(ci, hsd) ; evis.TraverseDecl(ed) ; //if ( evis.get_enum_data() != NULL ) {