The Itanium ABI for C++ specifies three different constructor types, though the third type isn’t as commonly supported (clang doesn’t use it, for example).
The constructor that ends in C1 are complete object constructors; the constructor that ends in C2 is a base object constructor. What’s the difference between these two types? Well, if you look at the IR of the code, you’ll notice that the C1 variant is defined as follows: @_ZN1XC1Ev = dso_local unnamed_addr alias void (ptr), ptr @_ZN1XC2Ev (that is to say, the two functions are literally pointing to the same function body). But if you have a class with a virtual base class, now the two function bodies are different–the C1 constructor will call the C2 constructor for the virtual base class, but the C2 constructor omits calls to virtual base class constructors.
In short, the C2 constructor is required to call all the C2 constructors of its nonvirtual base classes, while the C1 constructor is required call all the C2 constructors of its virtual and nonvirtual base classes. If there are no virtual base classes in play, then there is no difference between the C1 and the C2 constructor.