void SourceMapGenerator::setDebugLoc(const llvm::DebugLoc& debugLoc) { if(!sourceMap) return; if(!lineStart) { //TODO: Support multi-segment } else { // Start a new line MDNode* file = debugLoc.getScope(Ctx); assert(file->getNumOperands()>=2); MDNode* fileNamePath = cast<MDNode>(file->getOperand(1)); assert(fileNamePath->getNumOperands()==2); MDString* fileNameString = cast<MDString>(fileNamePath->getOperand(0)); auto fileMapIt = fileMap.find(fileNameString); if (fileMapIt == fileMap.end()) fileMapIt = fileMap.insert(std::make_pair(fileNameString, fileMap.size())).first; uint32_t currentFile = fileMapIt->second; uint32_t currentLine = debugLoc.getLine() - 1; uint32_t currentColoumn = debugLoc.getCol(); // Starting coloumn in the generated code writeBase64VLQInt(0); // Other fields are encoded as difference from the previous one in the file // We can use the last value directly because it is initialized as 0 // File index writeBase64VLQInt(currentFile - lastFile); // Line index writeBase64VLQInt(currentLine - lastLine); // Coloumn index writeBase64VLQInt(currentColoumn - lastColoumn); lastFile = currentFile; lastLine = currentLine; lastColoumn = currentColoumn; } lineStart = false; }
// @brief Lexicographic order on (line, col) of our debug locations. static bool operator<(const llvm::DebugLoc &LHS, const llvm::DebugLoc &RHS) { return LHS.getLine() < RHS.getLine() || (LHS.getLine() == RHS.getLine() && LHS.getCol() < RHS.getCol()); }