Hey clang devs,
I'm looking to have multiple memory buffers containing my input code that are treated as individual compilation units (eg. as if each buffer was a cpp file). I looked into this and found I can have auxiliary names remapped to strings that contain my code, and this works for a single remapping but when I try to add more remapped names clang triggers an assertion:
Assertion failed: 0 && "Replacing with the same buffer", file ..\..\..\..\..\too
ls\clang\lib\Basic\SourceManager.cpp, line 75
Remapping code (remapping_data is a vector of strings containing code, remapping_targets is another vector but with the names that were supplied as arguments, their indexes correspond to the mapping)
clang::PreprocessorOptions & opts = Clang->getInvocation().getPreprocessorOpts();
for(int i = 0; i < remapping_targets.size(); ++i )
// Create memory buffer with source text
llvm::MemoryBuffer * buffer = llvm::MemoryBuffer::getMemBufferCopy (remapping_data[i]);
if (buffer == NULL)
error ("Failed to create memory buffer");
// Remap auxiliary name from string vector remapping_targets to memory buffer
opts.addRemappedFile (remapping_targets[i], buffer);
// Execute the frontend actions.
Success = ExecuteCompilerInvocation(Clang.get());
As a secondary issue I also want to have the resulting object files from the compilation placed in memory rather than on disk. I haven't looked at this yet but I assume it should be pretty easy. Is there any built in functionality in clang for achieving this or will I need to modify the source itself?