The origin of the term multi-pass comes from a time when computers had much less memory. Compilers require a lot of memory, and on a small memory machine it's hard to handle.
Thus, the original idea was that the compiler was executed with several passes. The first pass read the source code and performed basic tasks, such as checking syntax, possibly building a symbol table, and then writing its results to a disk file for the second pass. Each subsequent passage N read the previous result of the transfer and changed the presentation of the program in order to move it further and further to the machine code and write its results for passage N + 1 for reading. This process is repeated until the final pass gives the final code. Many compilers can get multiple ("multi") passes; there were well-known compilers with dozens of passes built on really old machines.
(The same concept applies to the so-called "dual-processor assemblers": the first pass reads the assembler source code, checks the syntax, determines which location values โโshould be used for label characters, and the second pass creates object code using the knowledge of the character layout assigned in the first pass )
Now the memory becomes larger, and it is quite practical for reading the source code for all very large programs into memory, so that the compiler does all its work in the memory of one process and writes object code. You still see some similar remnants of this in the concept of linkers; they glue several object modules ("first pass") into a single binary file.
If you look at the compiler inside yourself, they work in stages. Typical phases may be:
* Parse and syntax check * Build symbol tables * Perform semantic sanity check * Determine control flow * Determine data flow * Generate some "intermediate" language (representing abstract instructions) * Optimize the intermediate language * Generate machine code from the optimized language
What a particular compiler does for phases depends on the compiler and the compiler. Each of these steps pushes the presentation of programs closer to the final machine code. The N-pass compiler will link one or more of these steps in a single pass.
Back to today, we have a lot of memory; it is not necessary for a modern compiler to write intermediate results to a disk file, therefore all these phases occur in the memory of one process. You, the compiler user, do not see them. Thus, you can call modern compilers "one-pass" in the original senses of the word. Since no one cares now, the phrase simply fell into disrepair.
In any case, compilers are still, as a rule, multiphase inside. (There are compilers that perform all these steps in what constitutes one phase; usually they cannot do a lot of optics).