I'm looking at the driver test cases for clang modules: https://github.com/llvm-mirror/clang/blob/master/test/Driver/modules.cpp
It includes steps to produce .pcm.o files. I'm wondering what they are for.
Given a c++20 module
// a-m.cc
module;
#include <iostream>
export module a;
export void do_a() { std::cout << "A\n"; }
You can compile it using
clang++ -std=c++20 -x c++-module --precompile a-m.cc -o a.pcm
which produces the precompiled module file a.pcm.
But there are also steps to compile .pcm files to .o files.
From the driver tests:
clang++ -std=c++20 a.pcm -S -o a.pcm.o
How are the .pcm.o files meant to be used?
If I write a main program
// main.cc
import a;
int main() {
do_a();
return 0;
}
Compile with
clang++ -std=c++20 -c main.cc -fmodule-file=a=a.pcm
And then try to link with the .pcm.o, I get
clang++ main.o a.pcm.o
/usr/bin/ld:a.pcm.o: file format not recognized; treating as linker script
/usr/bin/ld:a.pcm.o:2: syntax error
clang-13: error: linker command failed with exit code 1 (use -v to see invocation)
Note: you can compile a-m.cc
clang++ std=c++20 -c a-m.cc -o a.o
and link with a.o, but what are the .pcm.o files for? and can they be used to avoid compiling a-m.cc again after you've precompiled it?
The pcm-files contains "half baked" information about a module. The file extension does not have to be pcm and i think Visual Studio for example uses .ifc as extension. (And a difference with Visual Studio is that it outputs the ifc-file and compiles the object file (.obj) at the same time, while clang does this in two separate steps)
The pcm file is storing the information about the module file in a format so that the compiler can easily import it or compile it to other object files.
The command from your link surprises me, I think that -S in the example is compiling to assembly, so i am surprised that it is listed in that clang repo that you linked to.
clang++ -std=c++20 a.pcm -S -o a.pcm.o # To mee this looks wrong (assembly output)
Try changing it to use -c instead
clang++ -std=c++20 a.pcm -c -o a.pcm.o # This is how you compile pcm-files to object files
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With