Index: lib/Transforms/NaCl/ExpandTls.cpp |
diff --git a/lib/Transforms/NaCl/ExpandTls.cpp b/lib/Transforms/NaCl/ExpandTls.cpp |
index ada9a4aa6d2c464cb97611998c1f85e2164be3c5..48856f4ccb6a89495d2fb51beda0387f226b923b 100644 |
--- a/lib/Transforms/NaCl/ExpandTls.cpp |
+++ b/lib/Transforms/NaCl/ExpandTls.cpp |
@@ -122,21 +122,18 @@ static StructType *buildTlsTemplate(Module &M, std::vector<VarInfo> *TlsVars) { |
std::vector<Constant*> FieldInitValues; |
PassState State(&M); |
- for (Module::global_iterator GV = M.global_begin(); |
- GV != M.global_end(); |
- ++GV) { |
- if (GV->isThreadLocal()) { |
- if (!GV->hasInitializer()) { |
+ for (GlobalVariable &GV : M.globals()) { |
+ if (GV.isThreadLocal()) { |
+ if (!GV.hasInitializer()) { |
// Since this is a whole-program transformation, "extern" TLS |
// variables are not allowed at this point. |
report_fatal_error(std::string("TLS variable without an initializer: ") |
- + GV->getName()); |
+ + GV.getName()); |
} |
- if (!GV->getInitializer()->isNullValue()) { |
- addVarToTlsTemplate(&State, &FieldInitTypes, |
- &FieldInitValues, GV); |
+ if (!GV.getInitializer()->isNullValue()) { |
+ addVarToTlsTemplate(&State, &FieldInitTypes, &FieldInitValues, &GV); |
VarInfo Info; |
- Info.TlsVar = GV; |
+ Info.TlsVar = &GV; |
Info.IsBss = false; |
Info.TemplateIndex = FieldInitTypes.size() - 1; |
TlsVars->push_back(Info); |
@@ -145,13 +142,11 @@ static StructType *buildTlsTemplate(Module &M, std::vector<VarInfo> *TlsVars) { |
} |
// Handle zero-initialized TLS variables in a second pass, because |
// these should follow non-zero-initialized TLS variables. |
- for (Module::global_iterator GV = M.global_begin(); |
- GV != M.global_end(); |
- ++GV) { |
- if (GV->isThreadLocal() && GV->getInitializer()->isNullValue()) { |
- addVarToTlsTemplate(&State, &FieldBssTypes, NULL, GV); |
+ for (GlobalVariable &GV : M.globals()) { |
+ if (GV.isThreadLocal() && GV.getInitializer()->isNullValue()) { |
+ addVarToTlsTemplate(&State, &FieldBssTypes, NULL, &GV); |
VarInfo Info; |
- Info.TlsVar = GV; |
+ Info.TlsVar = &GV; |
Info.IsBss = true; |
Info.TemplateIndex = FieldBssTypes.size() - 1; |
TlsVars->push_back(Info); |
@@ -231,11 +226,9 @@ static void rewriteTlsVars(Module &M, std::vector<VarInfo> *TlsVars, |
// Set up the intrinsic that reads the thread pointer. |
Function *ReadTpFunc = Intrinsic::getDeclaration(&M, Intrinsic::nacl_read_tp); |
- for (std::vector<VarInfo>::iterator VarInfo = TlsVars->begin(); |
- VarInfo != TlsVars->end(); |
- ++VarInfo) { |
- GlobalVariable *Var = VarInfo->TlsVar; |
- while (Var->hasNUsesOrMore(1)) { |
+ for (VarInfo &VarInfo : *TlsVars) { |
+ GlobalVariable *Var = VarInfo.TlsVar; |
+ while (!Var->use_empty()) { |
Use *U = &*Var->use_begin(); |
Instruction *InsertPt = PhiSafeInsertPt(U); |
Value *RawThreadPtr = CallInst::Create(ReadTpFunc, "tls_raw", InsertPt); |
@@ -253,14 +246,14 @@ static void rewriteTlsVars(Module &M, std::vector<VarInfo> *TlsVars, |
Indexes.push_back(ConstantInt::get( |
M.getContext(), APInt(32, -1))); |
Indexes.push_back(ConstantInt::get( |
- M.getContext(), APInt(32, VarInfo->IsBss ? 1 : 0))); |
+ M.getContext(), APInt(32, VarInfo.IsBss ? 1 : 0))); |
Indexes.push_back(ConstantInt::get( |
- M.getContext(), APInt(32, VarInfo->TemplateIndex))); |
+ M.getContext(), APInt(32, VarInfo.TemplateIndex))); |
Value *TlsField = GetElementPtrInst::Create( |
TemplateType, TypedThreadPtr, Indexes, "field", InsertPt); |
PhiSafeReplaceUses(U, TlsField); |
} |
- VarInfo->TlsVar->eraseFromParent(); |
+ Var->eraseFromParent(); |
} |
} |