From: Douglas Gregor <dgregor@apple.com> Date: Mon, 15 Oct 2012 16:45:32 +0000 (+0000) Subject: Teach TargetInfo to hold on to the TargetOptions with which it was X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9a022bb007a3e77e1ac1330f955a239cfb1dd0fb;p=clang Teach TargetInfo to hold on to the TargetOptions with which it was created. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165943 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/TargetInfo.h b/include/clang/Basic/TargetInfo.h index b73dcb49b5..3e63505dfa 100644 --- a/include/clang/Basic/TargetInfo.h +++ b/include/clang/Basic/TargetInfo.h @@ -62,6 +62,7 @@ enum TargetCXXABI { /// \brief Exposes information about the current target. /// class TargetInfo : public RefCountedBase<TargetInfo> { + TargetOptions *TargetOpts; llvm::Triple Triple; protected: // Target values set by the ctor of the actual target implementation. Default @@ -112,6 +113,16 @@ public: virtual ~TargetInfo(); + /// \brief Retrieve the target options. + TargetOptions &getTargetOpts() const { + assert(TargetOpts && "Missing target options"); + return *TargetOpts; + } + + void setTargetOpts(TargetOptions &TargetOpts) { + this->TargetOpts = &TargetOpts; + } + ///===---- Target Data Type Query Methods -------------------------------===// enum IntType { NoInt = 0, diff --git a/include/clang/Frontend/ASTUnit.h b/include/clang/Frontend/ASTUnit.h index be46950fd3..0b02afa19d 100644 --- a/include/clang/Frontend/ASTUnit.h +++ b/include/clang/Frontend/ASTUnit.h @@ -24,6 +24,7 @@ #include "clang/Basic/SourceManager.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/FileSystemOptions.h" +#include "clang/Basic/TargetOptions.h" #include "clang-c/Index.h" #include "llvm/ADT/IntrusiveRefCntPtr.h" #include "llvm/ADT/OwningPtr.h" @@ -71,6 +72,7 @@ private: IntrusiveRefCntPtr<Preprocessor> PP; IntrusiveRefCntPtr<ASTContext> Ctx; ASTReader *Reader; + TargetOptions TargetOpts; struct ASTWriterData; OwningPtr<ASTWriterData> WriterData; diff --git a/lib/Basic/TargetInfo.cpp b/lib/Basic/TargetInfo.cpp index db5941a5d9..b89b18b3ae 100644 --- a/lib/Basic/TargetInfo.cpp +++ b/lib/Basic/TargetInfo.cpp @@ -24,7 +24,8 @@ using namespace clang; static const LangAS::Map DefaultAddrSpaceMap = { 0 }; // TargetInfo Constructor. -TargetInfo::TargetInfo(const std::string &T) : Triple(T) { +TargetInfo::TargetInfo(const std::string &T) : TargetOpts(), Triple(T) +{ // Set defaults. Defaults are set for a 32-bit RISC platform, like PPC or // SPARC. These should be overridden by concrete targets as needed. BigEndian = true; diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 76e09a55f4..79239d0bcf 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -4603,6 +4603,7 @@ TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, Diags.Report(diag::err_target_unknown_triple) << Triple.str(); return 0; } + Target->setTargetOpts(Opts); // Set the target CPU if specified. if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) { diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index 9954705d39..e602d30374 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -503,6 +503,7 @@ class ASTInfoCollector : public ASTReaderListener { ASTContext &Context; LangOptions &LangOpt; HeaderSearch &HSI; + TargetOptions &TargetOpts; IntrusiveRefCntPtr<TargetInfo> &Target; std::string &Predefines; unsigned &Counter; @@ -512,11 +513,12 @@ class ASTInfoCollector : public ASTReaderListener { bool InitializedLanguage; public: ASTInfoCollector(Preprocessor &PP, ASTContext &Context, LangOptions &LangOpt, - HeaderSearch &HSI, + HeaderSearch &HSI, TargetOptions &TargetOpts, IntrusiveRefCntPtr<TargetInfo> &Target, std::string &Predefines, unsigned &Counter) - : PP(PP), Context(Context), LangOpt(LangOpt), HSI(HSI), Target(Target), + : PP(PP), Context(Context), LangOpt(LangOpt), HSI(HSI), + TargetOpts(TargetOpts), Target(Target), Predefines(Predefines), Counter(Counter), NumHeaderInfos(0), InitializedLanguage(false) {} @@ -543,7 +545,6 @@ public: assert(M.Kind == serialization::MK_MainFile); // FIXME: This is broken, we should store the TargetOptions in the AST file. - TargetOptions TargetOpts; TargetOpts.ABI = ""; TargetOpts.CXXABI = ""; TargetOpts.CPU = ""; @@ -807,7 +808,8 @@ ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename, Reader->setListener(new ASTInfoCollector(*AST->PP, Context, AST->ASTFileLangOpts, HeaderInfo, - AST->Target, Predefines, Counter)); + AST->TargetOpts, AST->Target, + Predefines, Counter)); switch (Reader->ReadAST(Filename, serialization::MK_MainFile)) { case ASTReader::Success: diff --git a/lib/Lex/ModuleMap.cpp b/lib/Lex/ModuleMap.cpp index 826c4986aa..c49be63e33 100644 --- a/lib/Lex/ModuleMap.cpp +++ b/lib/Lex/ModuleMap.cpp @@ -585,6 +585,11 @@ namespace clang { class ModuleMapParser { Lexer &L; SourceManager &SourceMgr; + + /// \brief Default target information, used only for string literal + /// parsing. + const TargetInfo *Target; + DiagnosticsEngine &Diags; ModuleMap ⤅ @@ -596,11 +601,7 @@ namespace clang { /// \brief Whether an error occurred. bool HadError; - - /// \brief Default target information, used only for string literal - /// parsing. - OwningPtr<TargetInfo> Target; - + /// \brief Stores string data for the various string literals referenced /// during parsing. llvm::BumpPtrAllocator StringData; @@ -632,18 +633,15 @@ namespace clang { public: explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr, + const TargetInfo *Target, DiagnosticsEngine &Diags, ModuleMap &Map, const DirectoryEntry *Directory, const DirectoryEntry *BuiltinIncludeDir) - : L(L), SourceMgr(SourceMgr), Diags(Diags), Map(Map), + : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map), Directory(Directory), BuiltinIncludeDir(BuiltinIncludeDir), HadError(false), ActiveModule(0) { - TargetOptions TargetOpts; - TargetOpts.Triple = llvm::sys::getDefaultTargetTriple(); - Target.reset(TargetInfo::CreateTargetInfo(Diags, TargetOpts)); - Tok.clear(); consumeToken(); } @@ -1535,7 +1533,7 @@ bool ModuleMap::parseModuleMapFile(const FileEntry *File) { // Parse this module map file. Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, MMapLangOpts); Diags->getClient()->BeginSourceFile(MMapLangOpts); - ModuleMapParser Parser(L, *SourceMgr, *Diags, *this, File->getDir(), + ModuleMapParser Parser(L, *SourceMgr, Target, *Diags, *this, File->getDir(), BuiltinIncludeDir); bool Result = Parser.parseModuleMapFile(); Diags->getClient()->EndSourceFile();