'How to use F.getValueSymbolTable()

I wanna get all the local variables in a function.

void getLocalVariables(Function &F) {
  ValueSymbolTable *vst = F.getValueSymbolTable();
  for (auto vs : vst) {  // here it says: This scope-based "for" statement required the appropriate "begin" function, but was not found
    auto s = vs.getKey();
    auto v = vs.getValue();
  }
}

The error is that: This scope-based "for" statement required the appropriate "begin" function, but was not found. So how can I correct my code? Tks.



Solution 1:[1]

I check the documentation for ValueSymbolTable, and finally find how to use it. But actually, as arnt said, they are not local variables in source code. They are temporary variables generated by IR.

void getLocalVariables(Function &F) {
      // not test yet
      ValueSymbolTable *vst = F.getValueSymbolTable();
      errs() << (*vst).size() << "\n.";

      for (ValueSymbolTable::iterator VI = vst->begin(), VE = vst->end(); VI != VE; ++VI) {
        Value *V = VI->getValue();
        if (!isa<GlobalValue>(V) || cast<GlobalValue>(V)->hasLocalLinkage()) {
          if (!V->getName().startswith("llvm.dbg"))
            // Set name to "", removing from symbol table!
            V->setName("");
        }
      }
    }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 prettypig