diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2009-09-07 00:20:42 +0000 |
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2009-09-07 00:20:42 +0000 |
| commit | d027a924311d7c4a59c0b103a992a47c09be4038 (patch) | |
| tree | 4419d9f307e9336c290fb4698542cfd1750d21ed /clang | |
| parent | 66d8555f7ea6168dd4dd907dfd496583d7a01fee (diff) | |
| download | bcm5719-llvm-d027a924311d7c4a59c0b103a992a47c09be4038.tar.gz bcm5719-llvm-d027a924311d7c4a59c0b103a992a47c09be4038.zip | |
Use a SetVector for tracking some Obj-C metadata, to ensure deterministic
output.
- Also, cleanup code to output inline asm references.
llvm-svn: 81139
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/CodeGen/CGObjCMac.cpp | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index 26bc976a86c..efbd8b1ffe8 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -26,6 +26,9 @@ #include "llvm/LLVMContext.h" #include "llvm/Module.h" #include "llvm/ADT/DenseSet.h" +#include "llvm/ADT/SetVector.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetData.h" #include <sstream> #include <cstdio> @@ -790,13 +793,13 @@ protected: /// LazySymbols - Symbols to generate a lazy reference for. See /// DefinedSymbols and FinishModule(). - std::set<IdentifierInfo*> LazySymbols; + llvm::SetVector<IdentifierInfo*> LazySymbols; /// DefinedSymbols - External symbols which are defined by this /// module. The symbols in this list and LazySymbols are used to add /// special linker symbols which ensure that Objective-C modules are /// linked properly. - std::set<IdentifierInfo*> DefinedSymbols; + llvm::SetVector<IdentifierInfo*> DefinedSymbols; /// ClassNames - uniqued class names. llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> ClassNames; @@ -3491,25 +3494,25 @@ void CGObjCMac::FinishModule() { // Add assembler directives to add lazy undefined symbol references // for classes which are referenced but not defined. This is // important for correct linker interaction. - - // FIXME: Uh, this isn't particularly portable. - std::stringstream s; - - if (!CGM.getModule().getModuleInlineAsm().empty()) - s << "\n"; - - // FIXME: This produces non-determinstic output. - for (std::set<IdentifierInfo*>::iterator I = LazySymbols.begin(), - e = LazySymbols.end(); I != e; ++I) { - s << "\t.lazy_reference .objc_class_name_" << (*I)->getName() << "\n"; - } - for (std::set<IdentifierInfo*>::iterator I = DefinedSymbols.begin(), - e = DefinedSymbols.end(); I != e; ++I) { - s << "\t.objc_class_name_" << (*I)->getName() << "=0\n" - << "\t.globl .objc_class_name_" << (*I)->getName() << "\n"; + // + // FIXME: It would be nice if we had an LLVM construct for this. + if (!LazySymbols.empty() || !DefinedSymbols.empty()) { + llvm::SmallString<256> Asm; + Asm += CGM.getModule().getModuleInlineAsm(); + if (!Asm.empty() && Asm.back() != '\n') + Asm += '\n'; + + llvm::raw_svector_ostream OS(Asm); + for (llvm::SetVector<IdentifierInfo*>::iterator I = LazySymbols.begin(), + e = LazySymbols.end(); I != e; ++I) + OS << "\t.lazy_reference .objc_class_name_" << (*I)->getName() << "\n"; + for (llvm::SetVector<IdentifierInfo*>::iterator I = DefinedSymbols.begin(), + e = DefinedSymbols.end(); I != e; ++I) + OS << "\t.objc_class_name_" << (*I)->getName() << "=0\n" + << "\t.globl .objc_class_name_" << (*I)->getName() << "\n"; + + CGM.getModule().setModuleInlineAsm(OS.str()); } - - CGM.getModule().appendModuleInlineAsm(s.str()); } CGObjCNonFragileABIMac::CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm) |

