In order to ensure security guarantees of binary applications with regards to different attacks (such as fault injections, side-channel attacks or data remanence exploits), program analyses and verifications have to be performed at the binary level. These analyses and verifications require various security or functional properties about the program being analyzed. It is thus necessary to propagate these properties, usually expressed in the source level, down to binary code. However, preserving these properties throughout the optimizing compilation flow is hard due to code optimizations which reorder computations or eliminate unused variables. This thesis presents two approaches to preserve and propagate program properties throughout the optimizing compilation flow with minimal changes to individual transformation passes. In the implementations in LLVM, properties are emitted into executable binaries as DWARF debug information, which can next be used by binary analysis tools. Furthermore, our mechanisms can be applied to address the problem of preserving security protections inserted at the source level, compiling with optimizations enabled.