I wanted to know if there is ANY difference between how g++ compiles an already preprocessed .ii file, and compiling a .cpp file from scratch.
I am asking this because while building the binaries in my project with two step process (preprocessing followed by passing this file to g++) produces a different binary altogether(seen using objdump).
Preprocess command I am using -
/usr/bin/g++ -fdebug-prefix-map=/buildenv/cmake_build_dir/0=. -O3 -fPIC -g -fvar-tracking-assignments -march=haswell -mmmx -msse -msse2 -msse3 -mssse3 -mcx16 -msahf -mmovbe -maes -mpclmul -mpopcnt -mabm -mfma -mbmi -mbmi2 -mavx -mavx2 -msse4.2 -msse4.1 -mlzcnt -mrdrnd -mf16c -mfsgsbase -mfxsr -mxsave -mxsaveopt --param l1-cache-size=32 --param l1-cache-line-size=64 -fconcepts -std=c++20 -Wno-invalid-offsetof -Werror=address -Werror=array-bounds -Werror=c++11-compat -Werror=char-subscripts -Werror=enum-compare -Werror=comment -Werror=format -Werror=main -Werror=maybe-uninitialized -Werror=missing-braces -Werror=nonnull -Werror=parentheses -Werror=reorder -Werror=return-type -Werror=sequence-point -Wstrict-aliasing -Werror=strict-overflow=1 -Werror=switch -Werror=trigraphs -Werror=uninitialized -Werror=unknown-pragmas -Werror=unused-label -Werror=unused-value -Werror=volatile-register-var -Werror=clobbered -Wmissing-field-initializers -Wtype-limits -Werror=uninitialized -Wunused-but-set-parameter -Werror=return-local-addr -fvisibility-inlines-hidden -DBOOST_BIND_GLOBAL_PLACEHOLDERS -DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG -DHAS_FMA_SUPPORT -I/buildenv/include -I/usr/include/python3.9 -MD -MT <filename.cpp>.o -MF <filename.cpp>.o.d -fdiagnostics-color -E <filename.cpp>.
The preprocessed file is then moved to a tmp directory by another step in my program. Say the final filename is filename.ii
After this I do the compilation using -
/usr/bin/g++ -fdebug-prefix-map=/buildenv/cmake_build_dir/0=. -O3 -fPIC -g -fvar-tracking-assignments -march=haswell -mmmx -msse -msse2 -msse3 -mssse3 -mcx16 -msahf -mmovbe -maes -mpclmul -mpopcnt -mabm -mfma -mbmi -mbmi2 -mavx -mavx2 -msse4.2 -msse4.1 -mlzcnt -mrdrnd -mf16c -mfsgsbase -mfxsr -mxsave -mxsaveopt --param l1-cache-size=32 --param l1-cache-line-size=64 -fconcepts -std=c++17 -fdiagnostics-color -Wno-invalid-offsetof -Werror=address -Werror=array-bounds -Werror=c++11-compat -Werror=char-subscripts -Werror=enum-compare -Werror=comment -Werror=format -Werror=main -Werror=maybe-uninitialized -Werror=missing-braces -Werror=nonnull -Werror=parentheses -Werror=reorder -Werror=return-type -Werror=sequence-point -Wstrict-aliasing -Werror=strict-overflow=1 -Werror=switch -Werror=trigraphs -Werror=uninitialized -Werror=unknown-pragmas -Werror=unused-label -Werror=unused-value -Werror=volatile-register-var -Werror=clobbered -Wmissing-field-initializers -Wtype-limits -Werror=uninitialized -Wunused-but-set-parameter -Werror=return-local-addr -fvisibility-inlines-hidden -c -o <filename>.o <filename>.ii
I can also build the source file to object file directly using the command -
/usr/bin/g++ -fdebug-prefix-map=/buildenv/cmake_build_dir/0=. -O3 -fPIC -g -fvar-tracking-assignments -march=haswell -mmmx -msse -msse2 -msse3 -mssse3 -mcx16 -msahf -mmovbe -maes -mpclmul -mpopcnt -mabm -mfma -mbmi -mbmi2 -mavx -mavx2 -msse4.2 -msse4.1 -mlzcnt -mrdrnd -mf16c -mfsgsbase -mfxsr -mxsave -mxsaveopt --param l1-cache-size=32 --param l1-cache-line-size=64 -fconcepts -std=c++17 -fdiagnostics-color -Wno-invalid-offsetof -Werror=address -Werror=array-bounds -Werror=c++11-compat -Werror=char-subscripts -Werror=enum-compare -Werror=comment -Werror=format -Werror=main -Werror=maybe-uninitialized -Werror=missing-braces -Werror=nonnull -Werror=parentheses -Werror=reorder -Werror=return-type -Werror=sequence-point -Wstrict-aliasing -Werror=strict-overflow=1 -Werror=switch -Werror=trigraphs -Werror=uninitialized -Werror=unknown-pragmas -Werror=unused-label -Werror=unused-value -Werror=volatile-register-var -Werror=clobbered -Wmissing-field-initializers -Wtype-limits -Werror=uninitialized -Wunused-but-set-parameter -Werror=return-local-addr -fvisibility-inlines-hidden -DBOOST_BIND_GLOBAL_PLACEHOLDERS -DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG -DHAS_FMA_SUPPORT -I/buildenv/include -I/usr/include/python3.8 -c -o <filename.cpp>.o <filename.cpp>
I am using diff <(objdump -D <binary1>) <(objdump -D <binary2>)
to get the difference in assembly. The differences are in the instructions being executed. The whole set of assembly instructions being created are different.